gaoxianqu 发表于 2015-12-11 15:25:29

接入百度语音识别服务

本帖最后由 gaoxianqu 于 2015-12-11 15:30 编辑

目前百度开放了基于Android、IOS平台的语音识别SDK,和适合Web应用的RESTful Web API,支持在线应用和半离线应用(须定期联网更新认证文件,一般周期为一个月)。百度语音识别服务免费,只需注册百度开发者账号,便可创建相应的语音识别应用,获得ID key,接入百度语音识别服务。
http://bos.nj.bpc.baidu.com/v1/audio/QQjietu20150608180513.pnghttp://bos.nj.bpc.baidu.com/v1/audio/chuangjianyingyongdanchuang2.png
http://bos.nj.bpc.baidu.com/v1/audio/yingyongkapian.png
http://bos.nj.bpc.baidu.com/v1/audio/appidxinxi%20kaobei.png
“语音识别” 服务开通成功后即可获得 50000次/日 的在线识别调用配额。
如果开通服务时初始分配的在线识别调用配额无法满足您的需求,可以申请提高配额。
如果审核通过,则当前应用该服务的日调用次数将不再受配额限制。如果审核被拒绝,还可以再次提交申请。

百度语音识别目前有“离在线融合SDK”、“在线SDK”、“REST API”(官网下载地址)
如果你使用的是离在线融合语音识别SDK,并且需要使用离线识别,需要申请离线识别授权。操作如下
创建语音识别应用之后,在应用管理页面,点击“ 管理语音识别 ”选择 “ 申请离线识别授权 ” 。
http://bos.nj.bpc.baidu.com/v1/audio/QQjietu20150520160024.png
选择应用类型为Android或者iOS,填写并提交离线授权所需信息:Android应用为应用包名,iOS应用为Bundle ID。提交成功后即获取离线识别正式授权。
注:请确保填写提交的信息准确,否则会无法通过离线授权验证导致离线识别不可用。
http://bos.nj.bpc.baidu.com/v1/audio/123213.png
离线识别授权信息提交成功后,通过开发环境运行或者打包安装到手机设备上,在设备联网的情况下会自动下载正式授权文件并激活离线识别功能,一定要确保应用包名填写正确。


以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参数说明:


字段名数据类型可需描述
cuidstring必填用户 ID,推荐使用设备mac 地址/手机IMEI 等设备唯一性参数
tokenstring必填开发者身份验证密钥
lanstring选填语种选择,中文=zh、粤语=ct、英文=en,不区分大小写,默认中文
ptcint选填协议号,下行识别结果选择,默认 nbest 结果

语音数据的采样率和压缩格式在 HTTP-HEADER 里的 content-type 表明

[*]Content-Type:audio/amr;rate=8000
上传示例


[*]http://vop.baidu.com/server_api?lan=zh&cuid=***&token=***


隐示上传
语音数据和其他参数通过标准 JSON 格式串行化 POST 上传, JSON 里包括的参数:

字段名数据类型可需描述
formatsting必填语音压缩的格式,请填写上述格式之一,不区分大小写
rateint必填采样率,支持 8000 或者 16000
channelint必填声道数,仅支持单声道,请填写 1
cuidstring必填用户唯一标识,用来区分用户,填写机器 MAC 地址或 IMEI 码,长度为60以内
tokenstring必填开放平台获取到的开发者access_token
ptcint选填协议号,下行识别结果选择,默认 nbest 结果
lanstring选填语种选择,中文=zh、粤语=ct、英文=en,不区分大小写,默认中文
urlstring选填语音下载地址
callbackstring选填识别结果回调地址
speechstring选填真实的语音数据 ,需要进行base64 编码
lenint选填原始语音长度,单位字节

语音数据放在 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_noint必填错误码
err_msgstring必填错误码描述
snstring必填语音数据唯一标识,系统内部产生,用于 debug
resultarray ( )选填识别结果数组,提供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产品线当前日请求数超过限额






页: [1]
查看完整版本: 接入百度语音识别服务