Python语音识别

Python语音识别

需求:用代码将录音转成文字,常规普通话,不是播音员那种标准发音。

结论:无论在线或是离线,用代码调用的效果都不太理想。

1、离线模式

参考:https://blog.csdn.net/qq_41891021/article/details/90737715

pip install SpeechRecognition -i https://mirror.baidu.com/pypi/simple
pip install PocketSphinx -i https://mirror.baidu.com/pypi/simple
pip install C:\AH_TOOLS\AH_PythonCode\Detect_Silence\sound2txt\pocketsphinx-0.1.15-cp38-cp38-win_amd64.whl
import speech_recognition as sr

print(sr.__version__)

r = sr.Recognizer()
with sr.AudioFile(r"D:\AH_DATA\FFmpegTest\10.wav") as source:
    audio = r.record(source)
print(type(audio))
output = r.recognize_sphinx(audio, language='zh-cn')
print(output)
with open(r'C:\AH_TOOLS\AH_PythonCode\Detect_Silence\sound2Txt.txt', 'w') as f:
    f.write(output)

2、在线模式

1、网上很多推荐百度的语音识别——先不说免不免费,要用这个必须要下载百度APP——直接PASS

2、标贝科技——每天可调用500次,还可以,但是第二天就会接到推销电话

参考:https://www.bbsmax.com/A/xl56Y3k1Jr/

以下均为标贝科技API的调用方法


网址:https://ai.data-baker.com/#/index

控制台:https://ai.data-baker.com/#/asr/short

key在【授权管理】里

Python代码:直接复制这个页面最后的完整代码,改都不用改,直接cmd调用即可测试:

https://www.bbsmax.com/A/xl56Y3k1Jr/

import requests
import json
import argparse


# 获取access_token用于鉴权
def get_access_token(client_secret, client_id):
    grant_type = "client_credentials"
    url = "https://openapi.data-baker.com/oauth/2.0/token?grant_type={}&client_secret={}&client_id={}" \
        .format(grant_type, client_secret, client_id)

    try:
        response = requests.post(url)
        response.raise_for_status()
    except Exception as e:
        print(e)
        return
    else:
        access_token = json.loads(response.text).get('access_token')

    return access_token


# 获取识别后文本
def get_text(file, headers):
    url = "https://asr.data-baker.com/asr/api?"
    response = requests.post(url, data=file, headers=headers)
    code = json.loads(response.text).get("code")
    text = json.loads(response.text).get("text")
    if code != 20000:
        print(response.text)

    return text


# 获取命令行输入参数
def get_args():
    parser = argparse.ArgumentParser(description='ASR')
    parser.add_argument('-client_secret', type=str, required=True)
    parser.add_argument('-client_id', type=str, required=True)
    parser.add_argument('-file_path', type=str, required=True)
    parser.add_argument('--audio_format', type=str, default='wav')
    parser.add_argument('--sample_rate', type=str, default='16000')
    parser.add_argument('--add_pct', type=str, default='true')
    args = parser.parse_args()

    return args


if __name__ == '__main__':
    args = get_args()

    # 获取access_token
    client_secret = args.client_secret
    client_id = args.client_id
    access_token = get_access_token(client_secret, client_id)

    # 读取音频文件
    with open(args.file_path, 'rb') as f:
        file = f.read()

    # 填写Header信息
    audio_format = args.audio_format
    sample_rate = args.sample_rate
    add_pct = args.add_pct
    headers = {'access_token': access_token, 'audio_format': audio_format, 'sample_rate': sample_rate,
               'add_pct': add_pct}
    text = get_text(file, headers)
    print(text)

但是:

音频采样率必须是16000,否则都是“嗯嗯嗯”

制造wav的代码如下

ffmpeg -i "D:\AH_DATA\FFmpegTest\000.mp4" ^
 -ar 16000 -f wav ^
 -y "D:\AH_DATA\FFmpegTest\000.wav"

python调用:

python C:\AH_TOOLS\AH_PythonCode\Detect_Silence\sound2txt.py ^
-client_secret=XXXXXXXX ^
-client_id=YYYYYYYY ^
-file_path=D:\AH_DATA\FFmpegTest\000.wav

但是:

  • 速度比较慢。

  • 识别精度非常低,还不如离线识别。


长文本测试:

需要安装websocket
X pip install websockets -i https://pypi.tuna.tsinghua.edu.cn/simple
X pip3 install --user websocket-server -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install websocket -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install websocket-client-py3 -i https://pypi.tuna.tsinghua.edu.cn/simple
#长文本识别调用测试
python F:\test\real_time_audio_recognition.py ^
-client_secret=e2a65382b666412bb11616c0b4b65510 ^
-client_id=68acf98e2f5545079e740a6f5b697353 ^
-file_path="F:\test\test.wav" ^ 
--audio_format=wav --sample_rate=16000

在网页端上传,识别结果不错

但是用python上传同样的文件,结果全是“嗯嗯啊啊”

posted @ 2023-01-24 18:39  虎老狮  阅读(424)  评论(0编辑  收藏  举报