使用百度API实现语音转文字

1.在百度云创建一个语音产品

百度云
在->产品->人工智能->语音技术(选择任何一个创建一个功能包)
也可参考百度开发者教程
创建完成之后你将在你的全局,产品服务中看到自己的语音技术
其中包括

  1. 应用名称
  2. AppID
  3. API Key
  4. Secret Key
  5. 还有创建时间·····
    其中AppId、API Key、Secret Key都很关键这是,在后面接入百度API的凭证,我将在后面标注出来。

2.参考百度官方文档

1)语音转文字(即语音识别)的功能实现

首先,语音识别对音频格式及时长有一定要求,可使用开源的音频格式转换及VAD切分工具。便于进行音频处理。拼音相似度工具可以通过比较拼音相似度,解决同音字问题。
目前,SDK调用使用http接口,需要上传完整文件。根据接口内容:

  1. 支持的语音格式
    原始 PCM 的录音参数必须符合 16k 采样率、16bit 位深、单声道,支持的格式有:pcm(不压缩)、wav(不压缩,pcm编码)、amr(压缩格式)
  2. 支持的语音时长上限为60s,请不要超过这个长度,否则会返回错误。

1、安装语音识别 Python SDK

如果已安装pip,执行pip install baidu-aip即可。
如果已安装setuptools,执行python setup.py install即可。

2、使用百度接口:

向远程服务上传整段语音进行识别

#文档示例代码:
# 读取文件
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()

# 识别本地文件
client.asr(get_file_content('audio.pcm'), 'pcm', 16000, {
    'dev_pid': 1536,
})

参考文档参数:

  1. speech Buffer 建立包含语音内容的Buffer对象, 语音文件的格式,pcm 或者 wav 或者 amr。不区分大小写
  2. format String 语音文件的格式,pcm 或者 wav 或者 amr。不区分大小写。推荐pcm文件
  3. rate int 采样率,16000,固定值
  4. cuid String 用户唯一标识,用来区分用户,填写机器 MAC 地址或 IMEI 码,长度为60以内
  5. dev_pid Int 不填写lan参数生效,都不填写,默认1537(普通话 输入法模型),dev_pid参数见本节开头的表格

dev_pid参数列表

dev_pid 语言 模型 是否有标点 备注
1536 普通话(支持简单的英文识别) 搜索模型 无标点 支持自定义词库
1537 普通话(纯中文识别) 输入法模型 有标点 支持自定义词库
1737 英语 无标点 不支持自定义词库
1637 粤语 有标点 不支持自定义词库
1837 四川话 有标点 不支持自定义词库
1936 普通话远场 远场模型 有标点 不支持

成功返回样例:

{"corpus_no":"6798493061260544840","err_msg":"success.",
"err_no":0,
"result":["百度是瓜皮。"],"sn":"666502245331582897515"}

错误信息参考:

错误码 用户输入/服务端 含义 一般解决方法
3300 用户输入错误 输入参数不正确 请仔细核对文档及参照demo,核对输入参数
3301 用户输入错误 音频质量过差 请上传清晰的音频
3302 用户输入错误 鉴权失败 token字段校验失败。请使用正确的API_KEY 和 SECRET_KEY生成。或QPS、调用量超出限额。或音频采样率不正确(可尝试更换为16k采样率)。
3303 服务端问题 语音服务器后端问题 请将api返回结果反馈至论坛或者QQ群
3304 用户请求超限 用户的请求QPS超限 请降低识别api请求频率 (qps以appId计算,移动端如果共用则累计)
3305 用户请求超限 用户的日pv(日请求量)超限 请“申请提高配额”,如果暂未通过,请降低日请求量
3307 服务端问题 语音服务器后端识别出错问题 目前请确保16000的采样率音频时长低于30s。如果仍有问题,请将api返回结果反馈至论坛或者QQ群
3308 用户输入错误 音频过长 音频时长不超过60s,请将音频时长截取为60s以下
3309 用户输入错误 音频数据问题 服务端无法将音频转为pcm格式,可能是长度问题,音频格式问题等。 请将输入的音频时长截取为60s以下,并核对下音频的编码,是否是16K, 16bits,单声道。
3310 用户输入错误 输入的音频文件过大 语音文件共有3种输入方式: json 里的speech 参数(base64后); 直接post 二进制数据,及callback参数里url。 分别对应三种情况:json超过10M;直接post的语音文件超过10M;callback里回调url的音频文件超过10M
3311 用户输入错误 采样率rate参数不在选项里 目前rate参数仅提供16000,填写4000即会有此错误
3312 用户输入错误 音频格式format参数不在选项里 目前格式仅仅支持pcm,wav或amr,如填写mp3即会有此错误

一般问题均在此表格里。
下面贴出代码已经我的测试结果:

# coding=utf-8

import sys
import json
import base64
import time

IS_PY3 = sys.version_info.major == 3

if IS_PY3:
    from urllib.request import urlopen
    from urllib.request import Request
    from urllib.error import URLError
    from urllib.parse import urlencode
    timer = time.perf_counter
else:
    from urllib2 import urlopen
    from urllib2 import Request
    from urllib2 import URLError
    from urllib import urlencode
    if sys.platform == "win32":
        timer = time.clock
    else:
        # On most other platforms the best timer is time.time()
        timer = time.time

API_KEY = 'Z98pRtfNVQOGheA77PdbqSli'
SECRET_KEY = 'DMKRQo8uTuSbhtb5gamaM4bMZGNrSQGG'

# 需要识别的文件
AUDIO_FILE = 'baidu.pcm'  # 只支持 pcm/wav/amr 格式,极速版额外支持m4a 格式
# 文件格式
FORMAT = AUDIO_FILE[-3:]  # 文件后缀只支持 pcm/wav/amr 格式,极速版额外支持m4a 格式

CUID = '123456PYTHON'
# 采样率
RATE = 16000  # 固定值

# 普通版

DEV_PID = 1537  # 1537 表示识别普通话,使用输入法模型。1536表示识别普通话,使用搜索模型。根据文档填写PID,选择语言及识别模型
ASR_URL = 'http://vop.baidu.com/server_api'
SCOPE = 'audio_voice_assistant_get'  # 有此scope表示有asr能力,没有请在网页里勾选,非常旧的应用可能没有

#测试自训练平台需要打开以下信息, 自训练平台模型上线后,您会看见 第二步:“”获取专属模型参数pid:8001,modelid:1234”,按照这个信息获取 dev_pid=8001,lm_id=1234
# DEV_PID = 8001 ;   
# LM_ID = 1234 ;

# 极速版 打开注释的话请填写自己申请的appkey appSecret ,并在网页中开通极速版(开通后可能会收费)

# DEV_PID = 80001
# ASR_URL = 'http://vop.baidu.com/pro_api'
# SCOPE = 'brain_enhanced_asr'  # 有此scope表示有极速版能力,没有请在网页里开通极速版

# 忽略scope检查,非常旧的应用可能没有
# SCOPE = False

class DemoError(Exception):
    pass


"""  TOKEN start """

TOKEN_URL = 'http://openapi.baidu.com/oauth/2.0/token'


def fetch_token():
    params = {'grant_type': 'client_credentials',
              'client_id': API_KEY,
              'client_secret': SECRET_KEY}
    post_data = urlencode(params)
    if (IS_PY3):
        post_data = post_data.encode( 'utf-8')
    req = Request(TOKEN_URL, post_data)
    try:
        f = urlopen(req)
        result_str = f.read()
    except URLError as err:
        print('token http response http code : ' + str(err.code))
        result_str = err.read()
    if (IS_PY3):
        result_str =  result_str.decode()

    print(result_str)
    result = json.loads(result_str)
    print(result)
    if ('access_token' in result.keys() and 'scope' in result.keys()):
        print(SCOPE)
        if SCOPE and (not SCOPE in result['scope'].split(' ')):  # SCOPE = False 忽略检查
            raise DemoError('scope is not correct')
        print('SUCCESS WITH TOKEN: %s  EXPIRES IN SECONDS: %s' % (result['access_token'], result['expires_in']))
        return result['access_token']
    else:
        raise DemoError('MAYBE API_KEY or SECRET_KEY not correct: access_token or scope not found in token response')

"""  TOKEN end """

if __name__ == '__main__':
    token = fetch_token()

    speech_data = []
    with open(AUDIO_FILE, 'rb') as speech_file:
        speech_data = speech_file.read()

    length = len(speech_data)
    if length == 0:
        raise DemoError('file %s length read 0 bytes' % AUDIO_FILE)
    speech = base64.b64encode(speech_data)
    if (IS_PY3):
        speech = str(speech, 'utf-8')
    params = {'dev_pid': DEV_PID,
             #"lm_id" : LM_ID,    #测试自训练平台开启此项
              'format': FORMAT,
              'rate': RATE,
              'token': token,
              'cuid': CUID,
              'channel': 1,
              'speech': speech,
              'len': length
              }
    post_data = json.dumps(params, sort_keys=False)
    # print post_data
    req = Request(ASR_URL, post_data.encode('utf-8'))
    req.add_header('Content-Type', 'application/json')
    try:
        begin = timer()
        f = urlopen(req)
        result_str = f.read()
        print ("Request time cost %f" % (timer() - begin))
    except URLError as err:
        print('asr http response http code : ' + str(err.code))
        result_str = err.read()

    if (IS_PY3):
        result_str = str(result_str, 'utf-8')
    print(result_str)
    with open("result.txt","w") as of:
        of.write(result_str)

输出:

{"access_token":"24.ffc8666eb9b9ed1f831f145674c84faa.2592000.1585487697.282335-17692619","session_key":"9mzdXRJMRXk2UGrRPfHouFivZjF9k3jZeeV1UQgxHVgF4LJMNALSRd47wm5rIqFiV4cm7Se8QQtwa14APh8FHjSdTtIlGw==","scope":"audio_voice_assistant_get brain_enhanced_asr audio_tts_post public brain_ocr_general_basic brain_all_scope picchain_test_picchain_api_scope 
brain_nlp_emotion wise_adapt lebo_resource_base lightservice_public hetu_basic lightcms_map_poi kaidian_kaidian ApsMisTest_Test\u6743\u9650 vis-classify_flower lpq_\u5f00\u653e cop_helloScope ApsMis_fangdi_permission smartapp_snsapi_base iop_autocar oauth_tp_app smartapp_smart_game_openapi oauth_sessionkey smartapp_swanid_verify smartapp_opensource_openapi smartapp_opensource_recapi fake_face_detect_\u5f00\u653eScope vis-ocr_\u865a\u62df\u4eba\u7269\u52a9\u7406 idl-video_\u865a\u62df\u4eba\u7269\u52a9\u7406","refresh_token":"25.64693b95dc93605948c806dba37e0352.315360000.1898255697.282335-17692619","session_secret":"07709d0831bf5be4a872a695e2b947f1","expires_in":2592000}

{'access_token': '24.ffc8666eb9b9ed1f831f145674c84faa.2592000.1585487697.282335-17692619', 'session_key': '9mzdXRJMRXk2UGrRPfHouFivZjF9k3jZeeV1UQgxHVgF4LJMNALSRd47wm5rIqFiV4cm7Se8QQtwa14APh8FHjSdTtIlGw==', 'scope': 'audio_voice_assistant_get brain_enhanced_asr audio_tts_post public brain_ocr_general_basic brain_all_scope picchain_test_picchain_api_scope brain_nlp_emotion wise_adapt lebo_resource_base lightservice_public hetu_basic lightcms_map_poi kaidian_kaidian 
ocar oauth_tp_app smartapp_smart_game_openapi oauth_sessionkey smartapp_swanid_verify smartapp_opensource_openapi smartapp_opensource_recapi fake_face_detect_开放Scope vis-ocr_虚拟人物助理 idl-video_虚拟人物助理', 'refresh_token': '25.64693b95dc93605948c806dba37e0352.315360000.1898255697.282335-17692619', 'session_secret': '07709d0831bf5be4a872a695e2b947f1', 'expires_in': 2592000}
audio_voice_assistant_get
SUCCESS WITH TOKEN: 24.ffc8666eb9b9ed1f831f145674c84faa.2592000.1585487697.282335-17692619  EXPIRES IN SECONDS: 2592000
Request time cost 2.540582
{"err_msg":"speech quality error.","err_no":3301,"sn":"470283300881582895698"}

PS D:\learn Java\pyday\API\API\语音识别> python baidushibie.py
{"access_token":"24.cb226321d87cd64da657bd1468e81951.2592000.1585489514.282335-17692619","session_key":"9mzdWBIklEgpIJj0BuuHGod5VXLJr4CDLIGupFzOvb\/znpW6oOHCjSlGx9i4JVWo+OjdIiF1icrbhTLDJ08AcHljft4f1g==","scope":"audio_voice_assistant_get brain_enhanced_asr audio_tts_post public brain_ocr_general_basic brain_all_scope picchain_test_picchain_api_scope brain_nlp_emotion wise_adapt lebo_resource_base lightservice_public hetu_basic lightcms_map_poi kaidian_kaidian ApsMisTest_Test\u6743\u9650 vis-classify_flower lpq_\u5f00\u653e cop_helloScope ApsMis_fangdi_permission smartapp_snsapi_base iop_autocar oauth_tp_app smartapp_smart_game_openapi oauth_sessionkey smartapp_swanid_verify smartapp_opensource_openapi smartapp_opensource_recapi fake_face_detect_\u5f00\u653eScope vis-ocr_\u865a\u62df\u4eba\u7269\u52a9\u7406 idl-video_\u865a\u62df\u4eba\u7269\u52a9\u7406","refresh_token":"25.25ba3b367690eec58c9d79507de4a615.315360000.1898257514.282335-17692619","session_secret":"3f2930ef60146626a1bd70cb87cbfd8c","expires_in":2592000}

{'access_token': '24.cb226321d87cd64da657bd1468e81951.2592000.1585489514.282335-17692619', 'session_key': '9mzdWBIklEgpIJj0BuuHGod5VXLJr4CDLIGupFzOvb/znpW6oOHCjSlGx9i4JVWo+OjdIiF1icrbhTLDJ08AcHljft4f1g==', 'scope': 'audio_voice_assistant_get brain_enhanced_asr audio_tts_post public brain_ocr_general_basic brain_all_scope picchain_test_picchain_api_scope brain_nlp_emotion wise_adapt lebo_resource_base lightservice_public hetu_basic lightcms_map_poi kaidian_kaidian 
ApsMisTest_Test权限 vis-classify_flower lpq_开放 cop_helloScope ApsMis_fangdi_permission smartapp_snsapi_base iop_autocar oauth_tp_app smartapp_smart_game_openapi oauth_sessionkey smartapp_swanid_verify smartapp_opensource_openapi smartapp_opensource_recapi fake_face_detect_开放Scope vis-ocr_虚拟人物助理 idl-video_虚拟人物助理', 'refresh_token': '25.25ba3b367690eec58c9d79507de4a615.315360000.1898257514.282335-17692619', 'session_secret': '3f2930ef60146626a1bd70cb87cbfd8c', 'expires_in': 2592000}
audio_voice_assistant_get
SUCCESS WITH TOKEN: 24.cb226321d87cd64da657bd1468e81951.2592000.1585489514.282335-17692619  EXPIRES IN SECONDS: 2592000
Request time cost 1.507672
{"corpus_no":"6798493061260544840","err_msg":"success.","err_no":0,"result":["百度是瓜皮。"],"sn":"666502245331582897515"}

显然输出在最后一行。

你可能感兴趣的:(API,百度云,语音识别,自然语言处理,python)