四联光电智能照明论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4340|回复: 0
打印 上一主题 下一主题

接入百度语音识别服务

[复制链接]
  • TA的每日心情
    萌哒
    2016-4-15 13:02
  • 139

    主题

    191

    帖子

    2091

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2091
    跳转到指定楼层
    楼主
    发表于 2015-12-11 15:25:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 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参数说明:

    字段名数据类型可需描述
    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 ( [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产品线当前日请求数超过限额






    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|Silian Lighting+ ( 蜀ICP备14004521号-1 )

    GMT+8, 2024-5-22 17:12 , Processed in 1.078125 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表