百度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中的庫加入到project中

聲明權限
<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 |
靜音超時后將“取消”button替換為“幫助” |
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));
}
}
};
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);
/**
* 重寫用於處理語音識別回調的監聽器
*/
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) {
// 這里不做不論什么操作不影響簡單識別
}
}
mASREngine = VoiceRecognitionClient.getInstance(this);
mASREngine.setTokenApis(Constants.API_KEY, Constants.SECRET_KEY);
| 方法 |
參數 |
描寫敘述 |
| 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在開始識別后,會啟動錄音、預處理、上傳到server並獲取識別結果。
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文檔與demo源碼一起來學習百度語音識別SDK的使用。
語音識別的demo下載: http://download.csdn.net/detail/voicefans/7451441
小伙伴注意: 須要依照文章開頭的去申請api key和secret key, 改動Constant.java,填上自己的key就ok了。VoiceRecognitionDemoActivity.java 展示了怎樣使用Dialog方式識別
假設遇到問題歡迎留言交流。
