Android 新增百度語音識別
阿新 • • 發佈:2021-01-29
目錄
下載demo
首先要下載demo獲取sdk,下載地址
下載下來的專案是這樣的(如果更新後不適用,建議檢視官方文件自己摸索)
依賴core
在自己需要的新增語音識別的專案裡面依賴core這個包
具體依賴方法可以參考demo資料夾中的
sdk_asr_baidu_speech_ASR_V3_20191210_81acdf5_3.1.6\doc_integration_DOCUMENT\ASR-INTEGRATION-TTS-DEMO V3.0.docx中的(二)
新增實現程式碼
依賴成功後在需要新增的Avtivity裡面新增如下程式碼:
protected MyRecognizer myRecognizer;
/**
* 控制UI按鈕的狀態
*/
protected int status;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
handleMsg(msg);
}
};
IRecogListener listener = new MessageStatusRecogListener(handler);
myRecognizer = new MyRecognizer(this, listener);
}
protected void handleMsg(Message msg) {
switch (msg.what) { // 處理MessageStatusRecogListener中的狀態回撥
case STATUS_FINISHED:
if (msg.arg2 == 1) {
//這裡會出現錯誤彈窗
//同時這裡也是輸出結果
if (msg.obj.toString().contains("識別錯誤")) {
Toast.show(msg.obj.toString());//彈窗
} else {
mEtSearch.setText(msg.obj.toString());
}
dialog.dismiss();
}
status = msg.what;
updateBtnTextByStatus();
break;
case STATUS_NONE:
case STATUS_READY:
case STATUS_SPEAKING:
case STATUS_RECOGNITION:
status = msg.what;
updateBtnTextByStatus();
break;
default:
break;
}
}
private void updateBtnTextByStatus() {
switch (status) {
case STATUS_NONE:
//開始錄音時候頁面狀態可以在這裡修改
break;
case STATUS_WAITING_READY:
case STATUS_READY:
case STATUS_SPEAKING:
case STATUS_RECOGNITION:
//停止錄音時候頁面狀態可以在這裡修改
break;
case STATUS_LONG_SPEECH_FINISHED:
case STATUS_STOPPED:
//取消整個識別過程頁面狀態可以在這裡修改
break;
default:
break;
}
}
/**
* 開始錄音,點選“開始”按鈕後呼叫。
* 基於DEMO整合2.1, 2.2 設定識別引數併發送開始事件
*/
protected void start() {
// DEMO整合步驟2.1 拼接識別引數: 此處params可以打印出來,直接寫到你的程式碼裡去,最終的json一致即可。
final Map<String, Object> params = new HashMap<>();
// params 也可以根據文件此處手動修改,引數會以json的格式在介面和logcat日誌中列印
//params為語音等設定
int language = 123456;
// params.put("pid", language);
Log.i(TAG, "設定的start輸入引數:" + params);
// 複製此段可以自動檢測常規錯誤
(new AutoCheck(getApplicationContext(), new Handler() {
public void handleMessage(Message msg) {
if (msg.what == 100) {
AutoCheck autoCheck = (AutoCheck) msg.obj;
synchronized (autoCheck) {
String message = autoCheck.obtainErrorMessage(); // autoCheck.obtainAllMessage();
// txtLog.append(message + "\n");
; // 可以用下面一行替代,在logcat中檢視程式碼
Log.w("AutoCheckMessage", message);
}
}
}
}, false)).checkAsr(params);
// 這裡打印出params, 填寫至您自己的app中,直接呼叫下面這行程式碼即可。
// DEMO整合步驟2.2 開始識別
myRecognizer.start(params);
}
/**
* 開始錄音後,手動點選“停止”按鈕。
* SDK會識別不會再識別停止後的錄音。
* 基於DEMO整合4.1 傳送停止事件 停止錄音
*/
protected void stop() {
myRecognizer.stop();
}
/**
* 開始錄音後,手動點選“取消”按鈕。
* SDK會取消本次識別,回到原始狀態。
* 基於DEMO整合4.2 傳送取消事件 取消本次識別
*/
protected void cancel() {
myRecognizer.cancel();
}
/**
* 銷燬時需要釋放識別資源。
*/
@Override
protected void onDestroy() {
// 如果之前呼叫過myRecognizer.loadOfflineEngine(), release()裡會自動呼叫釋放離線資源
// 基於DEMO5.1 解除安裝離線資源(離線時使用) release()方法中封裝了解除安裝離線資源的過程
// 基於DEMO的5.2 退出事件管理器
myRecognizer.release();
Log.i(TAG, "onDestory");
// BluetoothUtil.destory(this); // 藍芽關閉
super.onDestroy();
}
使用方法
只要呼叫start();方法就可以使用,呼叫stop();就能手動停止錄音
需要動態獲取錄音、讀寫檔案的動態許可權後才能使用,可以在獲取許可權成功的時候呼叫start方法
返回資料
語音識別後的資料會出現在handleMsg中的case STATUS_FINISHED:
資料格式在MessageStatusRecogListener.java 中
onAsrFinalResult的 String message是成功的格式
onAsrFinishError的 String message是失敗的格式
注意事項
當跳轉了同樣需要語音的頁面時候當前頁面需要用myRecognizer.release();來結束當前的程序,不然會閃退/報錯8001