百度Android语音识别SDK分在线与离线两种,这篇文章介绍在线SDK的使用方法。
在线SDK是以JAR包和动态链接库形式发布和使用,可以从百度开放云平台网站中下载SDK及使用说明文档。
http://developer.baidu.com/wiki/index.php?title=docs/cplat/media/voice
点击管理控制台,选择
2、申请开启语音识别服务 ,选择媒体云---语音识别,点击申请开启服务,填写理由。
等待对接成功
3、使用语音识别SDK前的准备
声明权限
[java] view plain copy
- <uses-permission android:name= "android.permission.RECORD_AUDIO" />
- <uses-permission android:name= "android.permission.ACCESS_NETWORK_STATE" />
- <uses-permission android:name= "android.permission.WRITE_EXTERNAL_STORAGE" />
- <uses-permission android:name= "android.permission.INTERNET" />
- <uses-permission android:name= "android.permission.READ_PHONE_STATE" />
- <uses-permission android:name= "android.permission.WAKE_LOCK" />
- <uses-permission android:name= "android.permission.ACCESS_FINE_LOCATION" />
- <uses-permission android:name= "android.permission.ACCESS_COARSE_LOCATION" />
- <uses-permission android:name= "android.permission.ACCESS_WIFI_STATE" /></span>
语音识别控件方式
[java] view plain copy
- if (mDialog == null || mCurrentTheme != Config.DIALOG_THEME) {
- mCurrentTheme = Config.DIALOG_THEME;
- if (mDialog != null ) {
- mDialog.dismiss();
- }
- Bundle params = new Bundle();
- params.putString(BaiduASRDigitalDialog.PARAM_API_KEY, Constants.API_KEY);
- params.putString(BaiduASRDigitalDialog.PARAM_SECRET_KEY, Constants.SECRET_KEY);
- params.putInt(BaiduASRDigitalDialog.PARAM_DIALOG_THEME, Config.DIALOG_THEME);
- mDialog = new BaiduASRDigitalDialog( this , params);
- mDialog.setDialogRecognitionListener(mRecognitionListener);
- }
- mDialog.getParams().putInt(BaiduASRDigitalDialog.PARAM_PROP, Config.CURRENT_PROP);
- mDialog.getParams().putString(BaiduASRDigitalDialog.PARAM_LANGUAGE,
- Config.getCurrentLanguage());
- mDialog.show();
识别对话框支持的参数定义在BaiduASRDigitalDialog中以PARAM_前缀的常量。列表如下:
PARAM_API_KEY | string |
| 开放平台认证 API_key |
PARAM_SECRET_KEY | string | 开放平台认证Secret_key | |
PARAM_LANGUAGE | string | LANGUAGE_CHINESE | 语种,取值定义在VoiceRecognitionConfig类中前缀为LANGUAGE_的常量 |
PARAM_PARTIAL_RESULTS | boolean | true | 连续上屏 |
PARAM_NLU_ENABLE | boolean | false | 是否语义解析。Prop为输入时暂不支持语义,请显示指定为其它领域。 |
PARAM_NLU_PARAMS | string | 预留语义解析参数 | |
PARAM_PROP | int | PROP_INPUT | 领域参数,定义在VoiceRecognitionConfig类中前缀为PROP_的常量 |
PARAM_PORMPT_TEXT | string | “请说话” | 对话框提示语 |
PARAM_PROMPT_SOUND_ENABLE | boolean | true | 提示音,需要集成SDK包Raw文件夹的资源 |
PARAM_DIALOG_THEME | int | THEME_BLUE_LIGHTBG | 样式。定义在前缀为THEME_的常量中 |
PARAM_TIPS | String[] | 引导语列表 | |
PARAM_SHOW_TIPS_ON_START | boolean | false | 对话框弹出时首先显示引导语列表 |
PARAM_SHOW_TIP | boolean | false | 识别启动3秒未检测到语音,随机出现一条引导语 |
PARAM_SHOW_HELP_ON_SILENT | boolean | false | 静音超时后将“取消”按钮替换为“帮助” |
[java] view plain copy
- mRecognitionListener = new DialogRecognitionListener() {
- @Override
- public void onResults(Bundle results) {
- ArrayList<String> rs = results != null ? results
- .getStringArrayList(RESULTS_RECOGNITION) : null ;
- if (rs != null && rs.size() > 0 ) {
- mResult.setText(rs.get( 0 ));
- }
- }
- };
首先需要配置语音识别引擎ASREngine的参数VoiceRecognitionConfig
[java] view plain copy
- VoiceRecognitionConfig config = new VoiceRecognitionConfig();
- config.setProp(Config.CURRENT_PROP);
- config.setLanguage(Config.getCurrentLanguage());
- config.enableVoicePower(Config.SHOW_VOL); // 音量反馈。
- if (Config.PLAY_START_SOUND) {
- config.enableBeginSoundEffect(R.raw.bdspeech_recognition_start); // 设置识别开始提示音
- }
- if (Config.PLAY_END_SOUND) {
- config.enableEndSoundEffect(R.raw.bdspeech_speech_end); // 设置识别结束提示音
- }
- config.setSampleRate(VoiceRecognitionConfig.SAMPLE_RATE_8K); // 设置采样率,需要与外部音频一致
[java] view plain copy
- int code = mASREngine.startVoiceRecognition(mListener, config);
[java] view plain copy
- /**
- * 重写用于处理语音识别回调的监听器
- */
- class MyVoiceRecogListener implements VoiceClientStatusChangeListener {
- @Override
- public void onClientStatusChange( int status, Object obj) {
- switch (status) {
- // 语音识别实际开始,这是真正开始识别的时间点,需在界面提示用户说话。
- case VoiceRecognitionClient.CLIENT_STATUS_START_RECORDING:
- isRecognition = true ;
- mHandler.removeCallbacks(mUpdateVolume);
- mHandler.postDelayed(mUpdateVolume, POWER_UPDATE_INTERVAL);
- mControlPanel.statusChange(ControlPanelFragment.STATUS_RECORDING_START);
- break ;
- case VoiceRecognitionClient.CLIENT_STATUS_SPEECH_START: // 检测到语音起点
- mControlPanel.statusChange(ControlPanelFragment.STATUS_SPEECH_START);
- break ;
- // 已经检测到语音终点,等待网络返回
- case VoiceRecognitionClient.CLIENT_STATUS_SPEECH_END:
- mControlPanel.statusChange(ControlPanelFragment.STATUS_SPEECH_END);
- break ;
- // 语音识别完成,显示obj中的结果
- case VoiceRecognitionClient.CLIENT_STATUS_FINISH:
- mControlPanel.statusChange(ControlPanelFragment.STATUS_FINISH);
- isRecognition = false ;
- updateRecognitionResult(obj);
- break ;
- // 处理连续上屏
- case VoiceRecognitionClient.CLIENT_STATUS_UPDATE_RESULTS:
- updateRecognitionResult(obj);
- break ;
- // 用户取消
- case VoiceRecognitionClient.CLIENT_STATUS_USER_CANCELED:
- mControlPanel.statusChange(ControlPanelFragment.STATUS_FINISH);
- isRecognition = false ;
- break ;
- default :
- break ;
- }
- }
- @Override
- public void onError( int errorType, int errorCode) {
- isRecognition = false ;
- mResult.setText(getString(R.string.error_occur, Integer.toHexString(errorCode)));
- mControlPanel.statusChange(ControlPanelFragment.STATUS_FINISH);
- }
- @Override
- public void onNetworkStatusChange( int status, Object obj) {
- // 这里不做任何操作不影响简单识别
- }
- }
获得识别BDVRClient对象
[java] view plain copy
- mASREngine = VoiceRecognitionClient.getInstance( this );
- mASREngine.setTokenApis(Constants.API_KEY, Constants.SECRET_KEY);
每次识别需要通过通过VoiceRecognitionConfig设置参数,其中一些方法在API中有说明
方法 | 参数 | 描述 |
enableBeginSoundEffect | int soundResourceId 启动提示音资源Id | 设置开始提示音,soundResourceId为放置在Raw文件夹的资源Id。 |
enableEndSoundEffect | int soundResourceId 说话结束提示音资源Id | 检测到用户说话结束播报的提示音,非识别结束 |
setSampleRate | int rate 采样率 | 设置音频采样率, 通常建议开发者 不指定 采样频率,由BDVRClient自动根据当前网络环境选择采样频率。WiFi环境下将使用16kHz采样,移动网络下将使用8kHz采样,来节省流量。参考常量定义 SAMPLE_RATE_8K 8K采样率 SAMPLE_RATE_16K 16K采样率 |
setProp | int prop | 开发者可以通过指定垂直分类来获取更精准的语音识别结果。 注: 垂直分类目前支持地图,音乐,视频,APP,网址,开发者需要注意设定采样频率时只能在这五种垂直分类中选择。若指定其他分类,可能会影响识别结果的精度。参考PROP_前缀的常量定义。 |
setUseDefaultAudioSource | boolean useDefaultSource | 设置是否使用缺省的录音。 如果不使用,用户需要调用VoiceRecognitionClient对象的feedAudioBuffer方法为识别器提供语音数据 |
enableNLU | 启用语义解析,只在搜索模式起作用 | |
getSampleRate | 获取当前识别采样率 | |
setLanguage | String Language | 设置语种。目前支持的语种有中文普通话(LANGUAGE_CHINESE)、中文粤语(LANGUAGE_CANTONSE)、英文(LANGUAGE_ENGLISH)。 |
开始语音识别,BDVRClient在开始识别后,会启动录音、预处理、上传到服务器并获取识别结果。
[java] view plain copy
- int code = mASREngine.startVoiceRecognition(mListener, config);
- if (code != VoiceRecognitionClient.START_WORK_RESULT_WORKING) {
- mResult.setText(getString(R.string.error_start, code));
- }
取消语音识别