这里使用百度智能云API接口调用为例(可以使用AipSpeech和request直接做出来,但不是本问目的):
调用API接口前您需要:
1、注册百度智能云并进行实名认证
2、打开左上角那三个杠的图标(导航栏):产品服务-人工智能(语音技术)
3、下载并安装python3
4、创建百度智能云APP(用于调用API),创建方法网上很多就不再赘述。
一:代码
详细代码和注释如下:
from urllib.request import urlopen
from urllib.request import Request
from urllib.parse import urlencode
import json
import base64
#说明:百度智能云用户APP监控报表每小时更新一次(自测,非实时更新)
AppID=1#'25046940'#用户唯一标识(必填项),实际使用时需要将AppID改为25046940,目前为了测试异常处理
# (实测结果显示对该号码小幅度改动不影响结果,说明百度智能云内部对该号码进行了模糊查询),用于API接口传参
API_KEY = 'GjssEQmW6F5wmE59XFYfB21A'#接口钥匙,用于鉴权认证
SECRET_KEY = 'EVfTGNv8Se0wqoHhovXx6PAkltlWYS9Z'#密钥,用于鉴权认证
TOKEN_URL = 'http://openapi.baidu.com/oauth/2.0/token'#鉴权认证传参网址,固定
ASR_URL = 'http://vop.baidu.com/server_api'#API接口传参网址,固定
file_path=r'./audio/16k.pcm'#pcm语音文件路径
#语音文件读取
speach_data=open(file_path,mode='rb').read()#打开并读取pcm语音文件为类二进制数据
length=len(speach_data)
base64_data=base64.b64encode(speach_data)#将类二进制数据转化为二进制数据
base64_data=str(base64_data,encoding='utf-8')#使用utf-8转换成二进制字符串
print('输出原始类二进制文件长度:',length)
print('转换为二进制文件输出:',base64_data[:10])
#获取认证
# 向授权服务地址https://aip.baidubce.com/oauth/2.0/token发送请求(推荐使用POST),并在URL中带上以下参数
# 举例完整结构为https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=Va5yQRHlA4Fq5eR3LT0vuXV4&client_secret=0rDSjzQ20XUj5itV6WRtznPQSzr5pVw2&
params_token = {'grant_type': 'client_credentials', # 必须参数,固定为client_credentials
'client_id': API_KEY, # API钥匙
'client_secret': SECRET_KEY} # 密钥
post_data_token = urlencode(params_token)#字典转化为网址序列
print('字典转化为网址序列:',post_data_token)
post_data_token = post_data_token.encode('utf-8')#二进制序列编码为utf-8格式的二进制序列
print('二进制序列编码为utf-8格式的二进制序列:',post_data_token)
def token(post_data,url=TOKEN_URL,headers={}):
result=Request(url=url,data=post_data,headers=headers)#通过传入网址和参数爬取网址内容,headers主要用于拥有反爬机制的网址
result=urlopen(result).read()#可视化网页爬取数据(转化为二进制字符串)urlopen是专门打开网页文件的open,该结果默认为json数据,json数据的本质:字符串
print('爬取结果:',result)
print('解码爬取结果:',result.decode())
result=json.loads(result.decode())#加载json解码数据并转化为字典(实际不用解码,load能自己解码,但是为了保持代码结构的完整性保留了下来)
return result
token=token(post_data_token,url=TOKEN_URL)['access_token']#获取access_token(认证编号)
print('查看token数据类型:',type(token))
#传入API参数和数据并获取结果
params = {'format': 'pcm',#文件格式(必填项)
'rate': 16000,#采样率,值越高,语料传到API接口内的语料越精细(或者越丰富,涉及到连续与离散),识别精度越高(必填项)
'token': token,#认证编号(必填项)
'cuid': AppID, # 用户唯一标识(必填项)(实测结果显示对该号码小幅度改动不影响结果,说明百度智能云内部对该号码进行了模糊查询)
'channel': 1,#仅支持单声道,固定值1(必填项)
'speech': base64_data,#本地语音文件的二进制语音数据 ,需要进行base64 编码成二进制数据。与len参数连一起使用。
'len': length#本地语音文件的的字节数,单位字节
}
post_data=json.dumps(params).encode('utf-8')#将参数转化为utf-8编码格式的json数据,json数据的本质:字符串
print('参数输出:',post_data[:30])
#存在的问题:为何token函数不可复用?
# result=token(post_data,url=ASR_URL,headers={'Content-Type':'application/json'})
result = Request(url=ASR_URL, data=post_data, headers={'Content-Type':'application/json'}) # 通过传入网址和参数爬取网址内容,headers主要用于拥有反爬机制的网址
result = urlopen(result).read() # 可视化网页爬取数据(转化为二进制字符串)urlopen是专门打开网页文件的open,该结果默认为json数据,json数据的本质:字符串
print('爬取结果:', result)
print('解码爬取结果:', result.decode())
result = json.loads(result.decode()) # 加载json解码数据并转化为字典(实际不用解码,load能自己解码,但是为了保持代码结构的完整性保留了下来)
errocode_= {}
with open(r'./百度智能云API错误码大全.txt','r',encoding='utf-8') as f:
r=f.readlines()
num=0
for i in range(int(len(r)/8+1)):
num0=r[num].strip()
num1=r[num+2].strip()
num2=r[num+4].strip()
num3=r[num+6].strip()
errocode_[f"{num0}"]=[num1,num2,num3]
num+=8
try:
print('最终结果:',result['result'][0])
except KeyError as err:
errocode=str(result['err_no'])
print(f"!!!获取失败,错误来源:{errocode_[errocode][0]}\n错误原因:{errocode_[errocode][1]}\n解决方案:{errocode_[errocode][2]}")
二:数据
1、关于文件pcm语音文件需要自己录制。
2、将下面文本块复制存为“百度智能云API错误码大全.txt”并与上述代码文件放置同一路径
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即会有此错误
有问题请联系邮箱:1055365751@qq.com
|