2015年3月17日 星期二

[Android] Google語音辨識 - 使用RecognizerIntent

Google的語音辨識,
不管是中文或英文,
基本上準確度都還蠻高,
如果程式中需要語音辨識的功能,
方法如下:
private static final int RECOGNITION_REQUEST_CODE = 1234;//當成溝通的tag而且,數字隨便定

Intent it = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
it.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
//it.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
it.putExtra(RecognizerIntent.EXTRA_PROMPT, "請說...");
this.startActivityForResult(it, RECOGNITION_REQUEST_CODE);
上面的範例是直接呼叫RecognizerIntent,
所以會跳出Android已經定義好的UI,
它會自己處理收音,然後辨識,
 EXTRA_LANGUAGE_MODEL傳入的參數可以是RecognizerIntent.LANGUAGE_MODEL_FREE_FORM或RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH,
差別是什麼?
LANGUAGE_MODEL_FREE_FORM:通常我們會用這個參數,不管句子長短, LANGUAGE_MODEL_WEB_SEARCH:因為是網頁搜尋資料為base,通常是短句,對於中文的辨識程也較好,
不過,經測試結果,好像結果差異不大,呵...

 辨識好的結果呢?
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);    
    String firstMatched;  

    if(requestCode == RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK){
        //辨識結果不只一個,會從最接近的開始往後排序
        ArrayList<string> resultList = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
        firstMatched = (String)resultList.get(0);//通常我們只取第一個來用
    } else {
        firstMatched = "無法辨識";
    }
    
    result.setText(firstMatched);
}
整個辨識過程,要確定網路有連上線,
假如你想用離線的方式,
你可以到"設定"裡,有一個"下載離線語音辨識資料",
將想要的語言檔案下載回來,
如果網路沒開,還是可以進行語音辨識,
不過,實驗結果,辨識率就沒有那麼好了...

5 則留言:

  1. 您好
    我經過很多測試但無法實測出來
    請問您是怎麼實測離線語音辨識的呢?
    我下載離線包後可跳出google語音識別的視窗
    但無論我怎麼說話讓他辨識都無法回傳結果

    回覆刪除
    回覆
    1. "無法回傳結果"的意思是"無法辨識"?還是視窗直接關掉?還是程式當掉了?還是回傳錯誤的字串?
      如果不是離線方式,連上網路時,就可以辨識成功?

      用RecognizerIntent的好處是很容易實作,因為不用自己畫UI,
      但相對的,要Debug也較麻煩,
      如果可以,建議用另一個方式,
      http://cruxintw.blogspot.tw/2015/03/android-google-ui.html

      也就是自己實作UI,一方面可以有自己的特色,一方面也可以看看onError(int error)回傳的訊息來debug,

      刪除
    2. 非常高興您的回覆
      視窗不會關掉會呆掉
      就是叫我再按一次重試語音辨識(無限迴圈)
      兩種方法我都試驗過
      大大您說的第二種我實測時會跳出error no match

      刪除
    3. 我google離線語音識別只能在IME成功

      刪除
  2. 請問要如何讓它在開始跟結束時發出"登"的聲音?

    回覆刪除