1. 程式人生 > 其它 >Android 新增百度語音識別

Android 新增百度語音識別

技術標籤:android介面android語音識別java

目錄

下載demo

首先要下載demo獲取sdk,下載地址
下載下來的專案是這樣的(如果更新後不適用,建議檢視官方文件自己摸索)
demo圖片

依賴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

錯誤程式碼

https://ai.baidu.com/ai-doc/SPEECH/qk38lxh1q