网站首页 > 技术文章 正文
题目描述的不是很清楚,其实就是利用ffmpeg提取音视频中的音频,利用python将音频转为文字存储到文件里,可以先看下图
首先你需要有ffmpeg的环境,python的环境,这两个的环境在Windows和liunx的可以。我下面演示的时候,ffmpeg用的是liunx下的。python使用windows电脑本地跑的。
第一步:在百度开放平台上注册账号(https://cloud.baidu.com/),并在控制台中创建应用,选择短语音转文本应用,有几万次的免费配额,超过次数需要付费(价格贵),如果步知道选择哪个可以都选择上,我下面贴的图片就是选择了好几个。
第二步:利用ffmpeg命令将视频文件转为MP4,如下命令
ffmpeg -y -i input.mp4 -vn -codec copy out.m4a
#这个命令是将一个大的m4a文件按55秒切割成多个
ffmpeg -i out.m4a -f segment -segment_time 55 -c copy out.m4a%03d.m4a
ffmpeg -i input.m4a -acodec pcm_s16le -f s16le -ac 1 -ar 16000 new.pcm
我用视频22.mp4 举例,先将22.mp4转为23.m4av
再将23.m4a转为24.pcm文件格式
第三步:
1、安装 pip install Baidu-Aip
2、将24.pcm 放到python脚本video目录下,修改文件名称点击运行就行了。会将语音识别的文字输出到一个success.txt的文件里。我不是专业的python代码开发者所以我用的是idea。如下代码所示
import base64
import urllib
import requests
import json
import os
success = open("success.txt", mode='w', encoding='utf8')
def main(path):
url = "https://vop.baidu.com/server_api"
# speech 可以通过 get_file_content_as_base64("C:\fakepath\mp4-new.pcm",False) 方法获取
payload = json.dumps({
"format": "pcm",
"rate": 16000,
"channel": 1,
"cuid": "ORBolw9rb88I4x4uHcLDDi1b6VWmusNP",
"token": get_access_token(),
"speech": get_file_content_as_base64(path, False),
"len": os.path.getsize(path)
})
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(json.loads(response.text))
if response.status_code == 200:
resp = response.json()
print(resp)
if resp["err_no"] == 0:
result = resp["result"]
for resut in result:
success.write(resut)
print(response.text)
def get_file_content_as_base64(path, urlencoded=False):
"""
获取文件base64编码
:param path: 文件路径
:param urlencoded: 是否对结果进行urlencoded
:return: base64编码信息
"""
with open(path, "rb") as f:
content = base64.b64encode(f.read()).decode("utf8")
if urlencoded:
content = urllib.parse.quote_plus(content)
return content
def get_access_token():
"""
使用 AK,SK 生成鉴权签名(Access Token)
:return: access_token,或是None(如果错误)
"""
url = "https://aip.baidubce.com/oauth/2.0/token"
params = {"grant_type": "client_credentials", "client_id": "*", "client_secret": "*"}
return str(requests.post(url, params=params).json().get("access_token"))
if __name__ == '__main__':
path = "video/24.pcm"
print(os.path.abspath(path))
main(os.path.abspath(path))
我把我的目录结构贴一下:
目前这个代码只能一个文件一个文件的转换,如果需要批量转换,需要重新写ffmpeg代码和python代码。
备注提示:
1,音频文件不能是mp3文件,需要将mp3文件转为无损音乐格式:如flac,wav,pcm等等
2,音频文件需要控制在60s以内,如果大于60s,则会报文本超过限制的错误
参考文章:https://zhuanlan.zhihu.com/p/217631959
代码github:https://github.com/pkx10086/zeus
猜你喜欢
- 2024-09-09 分享一些你可能还没使用的 JavaScript 技巧
- 2024-09-09 可视化搜索引擎和机器学习技术索引Python实例
- 2024-09-09 Python 爬取张国荣最火的 8 首歌,60000 评论看完泪奔!
- 2024-09-09 万字详文:超越 BERT 模型的 ELECTRA 代码解读
- 2024-09-09 大受欢迎的Kubernetes:快速入门&进阶实战
- 2024-09-09 首发|Clusterpedia 0.1.0 四大重要功能
- 2024-09-09 NET开发者的HTTP交互新宠(豪门36夜:黑帝的替身新宠)
- 2024-09-09 BGP路径属性:Origin和AS_PATH(bgp路由协议中origin属性)
- 2024-09-09 如何修改容器时间而不改变宿主机时间?
- 2024-09-09 VASP计算杂化能带详细步骤教程(vasp杂化泛函计算)
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)