优秀的编程知识分享平台

网站首页 > 技术文章 正文

将视频中语音转为文字(将视频中语音转为文字的方法)

nanyue 2024-09-09 04:54:53 技术文章 7 ℃

题目描述的不是很清楚,其实就是利用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

Tags:

最近发表
标签列表