|
本帖最后由 gaoxianqu 于 2015-12-11 15:30 编辑
目前百度开放了基于Android、IOS平台的语音识别SDK,和适合Web应用的RESTful Web API,支持在线应用和半离线应用(须定期联网更新认证文件,一般周期为一个月)。百度语音识别服务免费,只需注册百度开发者账号,便可创建相应的语音识别应用,获得ID key,接入百度语音识别服务。
“语音识别” 服务开通成功后即可获得 50000次/日 的在线识别调用配额。
如果开通服务时初始分配的在线识别调用配额无法满足您的需求,可以申请提高配额。
如果审核通过,则当前应用该服务的日调用次数将不再受配额限制。如果审核被拒绝,还可以再次提交申请。
百度语音识别目前有“离在线融合SDK”、“在线SDK”、“REST API”(官网下载地址)
如果你使用的是离在线融合语音识别SDK,并且需要使用离线识别,需要申请离线识别授权。操作如下
创建语音识别应用之后,在应用管理页面,点击“ 管理语音识别 ”选择 “ 申请离线识别授权 ” 。
选择应用类型为Android或者iOS,填写并提交离线授权所需信息:Android应用为应用包名,iOS应用为Bundle ID。提交成功后即获取离线识别正式授权。
注:请确保填写提交的信息准确,否则会无法通过离线授权验证导致离线识别不可用。
离线识别授权信息提交成功后,通过开发环境运行或者打包安装到手机设备上,在设备联网的情况下会自动下载正式授权文件并激活离线识别功能,一定要确保应用包名填写正确。
以Android离在线融合SDK为例,简介在项目中导入SDK的过程。
1.放置文件
将开发包中的libs目录合并到工程目录的libs目录,其中包括了各平台的so库,可进行删减;
将开发包中的res目录合并到工程目录的res目录;
2.配置manifest
按照如下配置,uses-permission权限别忘了添加上去;
- ...
- <uses-permission android:name="android.permission.RECORD_AUDIO" />
- <uses-permission android:name="android.permission.INTERNET" />
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
- <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
- <uses-permission android:name="android.permission.READ_PHONE_STATE" />
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- ...
- <application
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name">
- <!-- begin: baidu speech sdk-->
- <!-- 请填写应用实际的APP_ID -->
- <meta-data android:name="com.baidu.speech.APP_ID" android:value="your app id"/>
- <!-- 请填写应用实际的API_KEY -->
- <meta-data android:name="com.baidu.speech.API_KEY" android:value="your api key"/>
- <!-- 请填写应用实际的SECRET_KEY -->
- <meta-data android:name="com.baidu.speech.SECRET_KEY" android:value="your api secret"/>
- <service android:name="com.baidu.speech.VoiceRecognitionService" android:exported="false" />
- <activity
- android:name="com.baidu.voicerecognition.android.ui.BaiduASRDigitalDialog"
- android:configChanges="orientation|keyboardHidden|screenLayout"
- android:theme="@android:style/Theme.Dialog"
- android:exported="false"
- android:screenOrientation="portrait">
- <intent-filter>
- <action android:name="com.baidu.action.RECOGNIZE_SPEECH" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
- <!-- end : baidu speech sdk-->
- ...
- </application>
- ...
调用语音识别控件
语音识别控件是SDK内置的一个控件,优点是调用方便,可以像调起一个普通的Activity一样简单的使用语音识别;缺点是有百度的logo。
- public class DemoActivity extends Activity {
- private static final int REQUEST_UI = 1;
- private void start() {
- Intent recognizerIntent = new Intent();
- // TODO recognizerIntent.put("...", "...")可为recognizerIntent设置语音识别参数
- startActivityForResult(recognizerIntent, REQUEST_UI); //调用语音识别控件
- }
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- if (resultCode == RESULT_OK) {
- ArrayList<String> results = data.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
- // TODO results为识别结果,这里可以添加应用逻辑,上面的代码无需修改
- }
- }
- }
调用语音识别API
1.通过android.speech.SpeechRecognizer的静态方法创建语音识别监听器,代码无需修改
- private android.speech.SpeechRecognizer mSpeechRecognizer;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // ...
- mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this, new ComponentName(this, VoiceRecognitionService.class));
- }
2.为监听器设置回调"函数"
- RecognitionListener listener = new RecognitionListener() {
- // ..., 处理识别过程中产生的消息和最终的识别结果(或错误码)
- };
- mSpeechRecognizer.setRecognitionListener(listener);
3.开始识别
- Intent recognizerIntent = new Intent();
- // recognizerIntent.putExtra ...传递语音识别参数
- mSpeechRecognizer.startListening(recognizerIntent);
4.获得结果
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- if (resultCode == RESULT_OK) {
- ArrayList<String> results = data.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
- // TODO results为识别结果,这里可以添加应用逻辑,上面的代码无需修改
- }
- }
语音识别 REST API
百度语音识别通过 REST API 的方式给开发者提供一个通用的 HTTP 接口,基于该接口,开发者可以获取语音识别服务。正式地址:http://vop.baidu.com/server_api
REST API 支持整段录音文件的识别,对录音格式有一定的要求,原始 PCM 的录音参数必须符合 8k/16k 采样率、16bit 位深、单声道,支持的压缩格式有:pcm(不压缩)、wav、opus、speex、amr、x-flac。
用户端自行录音,获得符合要求的音频文件后,将语音数据和其他参数通过 POST 上传给服务器。目前 API 仅支持整段语音识别的模式,即需要上传整段语音进行识别。
显示上传
语音数据直接放在 HTTP-BODY 中,控制参数以及相关统计信息通过 REST 参数传递,REST参数说明:
字段名 | 数据类型 | 可需 | 描述 | cuid | string | 必填 | 用户 ID,推荐使用设备mac 地址/手机IMEI 等设备唯一性参数 | token | string | 必填 | 开发者身份验证密钥 | lan | string | 选填 | 语种选择,中文=zh、粤语=ct、英文=en,不区分大小写,默认中文 | ptc | int | 选填 | 协议号,下行识别结果选择,默认 nbest 结果 |
语音数据的采样率和压缩格式在 HTTP-HEADER 里的 content-type 表明
- Content-Type:audio/amr;rate=8000
上传示例
- http://vop.baidu.com/server_api?lan=zh&cuid=***&token=***
隐示上传
语音数据和其他参数通过标准 JSON 格式串行化 POST 上传, JSON 里包括的参数:
字段名 | 数据类型 | 可需 | 描述 | format | sting | 必填 | 语音压缩的格式,请填写上述格式之一,不区分大小写 | rate | int | 必填 | 采样率,支持 8000 或者 16000 | channel | int | 必填 | 声道数,仅支持单声道,请填写 1 | cuid | string | 必填 | 用户唯一标识,用来区分用户,填写机器 MAC 地址或 IMEI 码,长度为60以内 | token | string | 必填 | 开放平台获取到的开发者access_token | ptc | int | 选填 | 协议号,下行识别结果选择,默认 nbest 结果 | lan | string | 选填 | 语种选择,中文=zh、粤语=ct、英文=en,不区分大小写,默认中文 | url | string | 选填 | 语音下载地址 | callback | string | 选填 | 识别结果回调地址 | speech | string | 选填 | 真实的语音数据 ,需要进行base64 编码 | len | int | 选填 | 原始语音长度,单位字节 |
语音数据放在 JSON 序列的“speech”字段中,需要将语音先进行 base64编码,并标明语音数据的原始长度,填写“len”字段;也可以直接提供语音下载地址放在“url”字段中,并且提供识别结果的回调地址,放在“callback”参数中。因此“speech”和“len”参数绑定,“url”和“callback”参数绑定,这两组参数二选一填写,如果都填,默认处理第一种。
表单类型在 HTTP-HEADER 里的 content-type 表明
- Content-Type:application/json
上传示例
- {
- "format":"speex",
- "rate":8000,
- "channel":1,
- "token":xxx,
- "cuid":"baidu_workshop",
- "len":4096,
- "speech":"xxx",
- }
- len 字段表示原始语音长度,不是 base64 编码之后的长度。
下行接口
两种上传方式都返回统一的结果,采用 JSON 格式封装,如果识别成功,识别结果放在 JSON的“result”字段中,统一采用 utf-8 方式编码。
字段名 | 数据类型 | 可需 | 描述 | err_no | int | 必填 | 错误码 | err_msg | string | 必填 | 错误码描述 | sn | string | 必填 | 语音数据唯一标识,系统内部产生,用于 debug | result | array ( [string,string,…]) | 选填 | 识别结果数组,提供1-5 个候选结果,
string 类型为识别的字符串, utf-8 编码 | 识别成功返回 case
- {\"err_no\":0,\"err_msg\":\"success.\",\"corpus_no\":\"15984125203285346378\",\"sn\":\"481D633F-73BA-726F-49EF-8659ACCC2F3D\",\"result\":[\"北京天气\"]}
识别错误返回 case
- {"err_no":2000,"err_msg":"data empty.","sn":null}
错误码 | 含义 | 3300 | 输入参数不正确 | 3301 | 识别错误 | 3302 | 验证失败 | 3303 | 语音服务器后端问题 | 3304 | 请求 GPS 过大,超过限额 | 3305 | 产品线当前日请求数超过限额 |
|
|