百度Android语音识别SDK分在线与离线两种,这篇文章介绍在线SDK的使用方法。
在线SDK是以JAR包和动态链接库形式发布和使用,可以从百度开放云平台网站中下载SDK及使用说明文档。
http://developer.baidu.com/wiki/index.php?title=docs/cplat/media/voice
完成语音SDK的集成分以下几步,本文将一步步介绍SDK集成方法。
1、注册开放开放平台
点击管理控制台,选择移动应用管理
选择创建应用,填写应用名称
可以看到右上角有ID、API KEY、Secret KEY,点击可以复制其内容,保存这些字符串,在使用语音SDK时会用到。
2、申请开启语音识别服务 ,选择媒体云---语音识别,点击申请开启服务,填写理由。
等待对接成功
3、使用语音识别SDK前的准备
之前准备了SDK开发包以及ID、API KEY、Secret KEY。
首先将开发包中的lib中的库添加到工程中
声明权限
-
<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>
4、语音识别
SDK有两种实现语音识别的方式,一种是直接使用SDK中的语音识别控件,一种是使用SDK中的语音识别服务。
语音识别控件方式
语音识别控件BaiduASRDigitalDialog,提供了整套语音交互、提示音、音量反馈、动效反馈。开发者初始化一个BaiduASRDigitalDialog对象,并设置相关参数及结果回调,调用Show()方法就可以弹出对话框开始识别,识别结束后会在回调中得到识别结果。
-
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
|
静音超时后将“取消”按钮替换为“帮助”
|
设置回调方法,处理返回的结果
-
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));
-
}
-
-
}
-
};
API方式
首先需要配置语音识别引擎ASREngine的参数VoiceRecognitionConfig
-
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);
然后启动识别
-
int code = mASREngine.startVoiceRecognition(mListener, config);
其中mListener是识别过程的回调,需要对其中的方法进行实现
-
-
-
-
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;
-
-
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对象
-
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在开始识别后,会启动录音、预处理、上传到服务器并获取识别结果。
-
int code = mASREngine.startVoiceRecognition(mListener, config);
-
if (code != VoiceRecognitionClient.START_WORK_RESULT_WORKING) {
-
mResult.setText(getString(R.string.error_start, code));
-
}
取消语音识别
-
mASREngine.stopVoiceRecognition();
结束语音识别
-
mRecognitionClient.speakFinish();
百度语音识别开放平台SDK使用方法,布布扣,bubuko.com
百度语音识别开放平台SDK使用方法
原文:http://blog.csdn.net/zpf8861/article/details/30229039