语音识别已经是很成熟的技术了,本文记录调用百度 API 实现语音识别的过程。
百度语音识别的功能:
采用领先国际的流式端到端语音语言一体化建模方法,融合百度自然语言处理技术,近场中文普通话识别准确率达98%
支持普通话和略带口音的中文识别;支持粤语、四川话方言识别;支持英文识别
支持50多个领域的语义理解,如:天气,交通,娱乐等。还可接入智能对话定制与服务平台UNIT自定义语义理解和对话服务,让您更准确地理解用户意图
使用大规模数据集训练语言模型,根据语音的内容理解和停顿智能匹配合适的标点符号(包括,。!?),使识别结果的表现方式贴合表述,更加可懂
根据语音内容理解可以将数字序列、小数、时间、分数、基础运算符正确转换为数字格式,使得识别的数字结果更符合使用习惯,直观自然
支持在语音自训练平台上自助训练模型,上传词汇文本即可零代码完成训练,精准提升业务领域词汇识别率5-25%,并可专属使用
导航
-> 产品服务
-> 语音技术
勾选需要的应用,填入信息即可。
生效后可以看到 15 W 次的免费测试额度,对简单测试来说已经足够用了。
在您创建完毕应用后,平台将会分配给您此应用的相关凭证,主要为AppID、API Key、Secret Key。以上三个信息是您应用实际开发的主要凭证,请您妥善保管。
您需要使用创建应用所分配到的AppID、API Key及Secret Key,进行Access Token(用户身份验证和授权的凭证)的生成。
官方文档: Access Token获取 。
核心方法需要向授权服务地址https://aip.baidubce.com/oauth/2.0/token
发送请求(推荐使用POST),并在URL中带上以下参数:
client_credentials
;API Key
;Secret Key
;官方推荐三种方法,我们这里采用 Python 脚本实现的方法。
123456789101112131415161718192021 | import requestsimport jsondef main(): url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=xxxxxx&client_secret=xxxxx" payload = "" headers = { 'Content-Type': 'application/json', 'Accept': 'application/json' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) if __name__ == '__main__': main() |
---|
从返回的 json 包中取出 access_token
的值即可,返回值中的 expires_in
为该 token
的有效期,单位是 s,其他参数忽略,暂时不用;
我返回的 “expires_in”:2592000,表示 30 天有效期,过期后需要重新申请 access_token。
分为 API 版和 SDK 版,使用 HTTP 接入的录音时长不能超过 60s,对于我来说足够用了,因此本文以 HTTP API 接入方式为例。
语音识别需要将音频采样频率固定在 16k,如果当前音频不是 16k 采样率,需要重采样。
可以参考 修改 wav 音频采样率
原神中的一段 音频 为例。
调用百度的音频识别 API Python Demo 示例:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 | coding=utf-8import sysimport timeIS_PY3 = sys.version_info.major == 3if 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# 需要识别的文件AUDIO_FILE = 'audio_resampled.wav' # 只支持 pcm/wav/amr 格式,极速版额外支持m4a 格式# 文件格式FORMAT = AUDIO_FILE-3:; # 文件后缀只支持 pcm/wav/amr 格式,极速版额外支持m4a 格式CUID = '123456PYTHON';# 采样率RATE = 16000; # 固定值# 普通版DEV_PID = 1537; # 1537 表示识别普通话,使用输入法模型。根据文档填写PID,选择语言及识别模型ASR_URL = 'http://vop.baidu.com/server_api'SCOPE = 'audio_voice_assistant_get' # 有此scope表示有asr能力,没有请在网页里勾选,非常旧的应用可能没有if __name__ == '__main__': my_token = "your access token" """ httpHandler = urllib2.HTTPHandler(debuglevel=1) opener = urllib2.build_opener(httpHandler) urllib2.install_opener(opener) """ speech_data = [] with open(AUDIO_FILE, 'rb') as speech_file: speech_data = speech_file.read() length = len(speech_data) if length == 0: raise RuntimeError('file %s length read 0 bytes' % AUDIO_FILE) params = {'cuid': CUID, 'token': my_token, 'dev_pid': DEV_PID} #测试自训练平台需要打开以下信息 #params = {'cuid': CUID, 'token': token, 'dev_pid': DEV_PID, 'lm_id' : LM_ID} params_query = urlencode(params); headers = { 'Content-Type': 'audio/' + FORMAT + '; rate=' + str(RATE), 'Content-Length': length } url = ASR_URL + "?" + params_query print("url is", url); print("header is", headers) # print post_data req = Request(ASR_URL + "?" + params_query, speech_data, headers) 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) |
---|
在代码的 my_token 处填入自己的 access-token,就可以识别我的示例音频了,我的输出:
12 | {"corpus_no":"7246604200451327860","err_msg":"success.","err_no":0,"result":"这就是四方之风的力量中特婉林只能借用三方的原因了。","sn":"185528422541687231520"} |
---|
还是可以的。