一、前言
最近在做课程设计,想用一下语音识别,于是了解到百度AI 开放平台提供这一功能,且语音识别极速版 API一共可以调用5w次,对我来说完全够用了。最重要的是,可以直接用http
的post
请求进行api 调用,实在是太方便了,那就选择百度吧!
在正式开始之前,大家需要先注册一个百度开发者账号。
二、开始
下面我会介绍两种进行语音识别的方法,分别是调用百度api 和python SDK
Ⅰ 百度api
首先直接看语音识别极速版 API文档说明。
我们可提取以下关键信息点:
- 音频文件需要在60s 内;
- 音频格式支持:pcm(不压缩)、wav(不压缩,pcm编码)、amr(压缩格式)、m4a(压缩格式);
- 采样率 :16000 固定值。 编码:16bit 位深的单声道;
- api 调用流程:鉴权认证 -> 确认请求方式 -> 填写参数
(1)鉴权认证
① 获取Access Token
Access Token 是用户身份验证和授权的凭证,语音识别采用的是Client Credentials 授权方式,即采用应用公钥(Api Key)、密钥获取Access Token。
我们进入控制台,选择语音技术,然后在应用管理界面中新建一个应用:
我们这就获得了AppID, API Key, Secret Key
使用Client Credentials 获取Access Token 需要应用在其服务端发送请求(推荐用POST
方法)到百度OAuth2.0授权服务的“ https://openapi.baidu.com/oauth/2.0/token
” 地址上,并带上以下参数:
grant_type | 必须参数,固定为“client_credentials” |
client_id | 必须参数,应用的 API Key |
client_secret | 必须参数,应用的 Secret Key |
例如:
https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=Va5yQRHl********LT0vuXV4&client_secret= 0rDSjzQ20XUj5i********PQSzr5pVw2&
响应数据包如下所示,其中 “access_token” 字段即为请求 REST API
所需的令牌, 默认情况下,Access Token 有效期为一个月,开发者需要对 Access Token 的有效性进行判断,如果Access Token 过期可以重新获取。
例如:
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{
“access_token”: “1.a6b7dbd428f731035f771b8d********.86400.1292922000-2346678-124328”,
“expires_in”: 86400,
“refresh_token”: “2.385d55f8615fdfd9edb7c4b********.604800.1293440400-2346678-124328”,
“scope”: “public audio_voice_assistant_get 。。。”,
“session_key”: “ANXxSNjwQDugf8615OnqeikCdlLxn",
“session_secret”: "248APxvxjCZ0VECaK4oZExMB”,
}
如此,我们便获得了Access Token
(2)确认请求方式
① raw
有两种请求方式,json 方式和raw 方式,因为我使用的是raw
方式,所以json
我就不展开讲解了
由于使用raw
方式, 采样率和文件格式需要填写在Content-Type 中:
Content-Type: audio/pcm;rate=16000
(3)填写参数
raw
格式POST 上传本地文件 语音数据直接放在 HTTP BODY 中,控制参数以及相关统计信息通过 header
和url
里参数传递
① Header 参数说明
字段名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
format | string | 必填 | 语音格式 |
rate | int | 必填 | 采样率16k(固定值) |
语音数据的采样率和压缩格式在 HTTP-HEADER 里的Content-Type 表明,例:
Content-Type: audio/pcm;rate=16000
② url 参数说明
字段名 | 可需 | 描述 |
---|---|---|
cuid | 必填 | 用户唯一标识(推荐填mac 地址,不过我填了我的英文名加数字) |
token | 必填 | Access Token |
dev_pid | 选填 | 默认80001 |
lan | 选填 | 不怎么使用 |
url 示例:
POST https://vop.baidu.com/pro_api?dev_pid=80001&cuid=******&token=1.a6b7dbd428f731035f771b8d********.86400.1292922000-2346678-124328
最后完整的raw 请求示例:
curl -i -X POST -H "Content-Type: audio/pcm;rate=16000" "http://vop.baidu.com/pro_api?dev_pid=80001&cuid=xxxxx&token=1.a6b7dbd428f731035f771b8d********.86400.1292922000-2346678-124328" --data-binary "@/home/test/test.pcm"
Ⅱ python SDK
(1)安装python SDK
如果已安装pip,执行
pip install baidu-aip
如果已安装setuptools,执行
python setup.py install
(2)新建AipSpeech
AipSpeech是语音识别的Python SDK 客户端,为使用语音识别的开发人员提供了一系列的交互方法。
from aip import AipSpeech
""" 你的 APPID AK SK """
APP_ID = '你的 App ID'
API_KEY = '你的 Api Key'
SECRET_KEY = '你的 Secret Key'
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
上述APP_ID、API_KEY、SECRET_KEY 的获取在创建应用后即可获得
(3)配置AipSpeech
若大家需要配置AipSpeech 的网络请求参数(一般不需要配置),可以在构造AipSpeech 之后调用接口设置参数,目前只支持以下参数:
接口 | 说明 |
---|---|
setConnectionTimeoutInMillis | 建立连接的超时时间(单位:毫秒) |
setSocketTimeoutInMillis | 通过打开的连接传输数据的超时时间(单位:毫秒) |
(4)语音识别
# 读取文件
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
# 识别本地文件,str 就是识别结果
str = client.asr(get_file_content('audio.pcm'), 'pcm', 16000, {
'dev_pid': 1536,
})
print(str)
参数 | 类型 | 描述 | 是否必须 |
---|---|---|---|
speech | Buffer | 建立包含语音内容的Buffer对象, 语音文件的格式,pcm 或者 wav 或者 amr。不区分大小写 | 是 |
format | String | 语音文件的格式,pcm 或者 wav 或者 amr。不区分大小写。推荐pcm文件 | 是 |
rate | int | 采样率,16000,固定值 | 是 |
cuid | String | 用户唯一标识,用来区分用户,填写机器 MAC 地址或 IMEI 码,长度为60以内 | 否 |
dev_pid | Int | 不填写lan参数生效,都不填写,默认1537(普通话 输入法模型),dev_pid参数见本节开头的表格 | 否 |
lan(已废弃) | String | 历史兼容参数,请使用dev_pid。如果dev_pid填写,该参数会被覆盖。语种选择,输入法模型,默认中文(zh)。 中文=zh、粤语=ct、英文=en,不区分大小写 | 否 |
dev_pid 参数列表:
dev_pid | 语言 | 模型 | 是否有标点 | 备注 |
---|---|---|---|---|
1536 | 普通话(支持简单的英文识别) | 搜索模型 | 无标点 | 支持自定义词库 |
1537 | 普通话(纯中文识别) | 输入法模型 | 有标点 | 支持自定义词库 |
1737 | 英语 | 无标点 | 不支持自定义词库 | |
1637 | 粤语 | 有标点 | 不支持自定义词库 | |
1837 | 四川话 | 有标点 | 不支持自定义词库 | |
1936 | 普通话远场 | 远场模型 | 有标点 | 不支持 |
语音识别返回数据参数详情:
参数 | 类型 | 是否一定输出 | 描述 |
---|---|---|---|
err_no | int | 是 | 错误码 |
err_msg | int | 是 | 错误码描述 |
sn | int | 是 | 语音数据唯一标识,系统内部产生,用于 debug |
result | int | 是 | 识别结果数组,提供1-5 个候选结果,string 类型为识别的字符串, utf-8 编码 |
三、踩坑
(1)音频格式
音频格式一定要正确,符合要求,包括采样率、通道数、编码等
对于音频格式转换工具,推荐sox,
sox安装及常用命令
SoX — 音频处理工具里的瑞士军刀
例如将一段.wav
格式音频转化为其要求的格式(16k 采样率、1 通道、16bit 编码):
sox input.wav -r 16k -c 1 -b 16 output.wav
不过百度推荐的那个ffmpeg 应该也不错,我没有用,大家感兴趣可以尝试尝试
四、结果
百度api
若识别成功:
另外,百度语音识别平台还支持自主训练模型噢~~
若出现请求错误的话,请查阅官方文档:
错误码及常见原因