我們使用了RecognizerIntent來執行語音辨識,
但是,如果我們想要有自己特色的UI呢?
我們還另外需要SpeechRecognizer的幫忙
Intent recognizerIntent; private SpeechRecognizer sr; sr = SpeechRecognizer.createSpeechRecognizer(this); sr.setRecognitionListener(new listener()); recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); recognizerIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS,5);//5是你需要回傳多少個結果 //開始辨識,將此code移到某個按鈕的onClick()裡 sr.startListening(recognizerIntent); //停止辨識,將此code移到某個按鈕的onClick()裡 //我們平常不需要做這個處理,語音辨識完畢它自己會停 //但如果我們想中斷它,或者有異常發生時,就可以呼叫底下的程式碼 sr.stopListening(); sr.cancel();上面的listener(),代碼如下:
private static final int RECOGNIZER_ERROR_NETWORK_TIMEOUT = 1;//網路超時
private static final int RECOGNIZER_ERROR_NETWORK = 2;//其它的網路相關錯誤
private static final int RECOGNIZER_ERROR_AUDIO = 3;//無法錄音
private static final int RECOGNIZER_ERROR_SERVER = 4;//伺服器異常
private static final int RECOGNIZER_ERROR_CLIENT = 5;//其它手機端的異常
private static final int RECOGNIZER_ERROR_SPEECH_TIMEOUT = 6;//沒有語音輸入
private static final int RECOGNIZER_ERROR_NO_MATCH = 7;//沒有符合的辨識結果
private static final int RECOGNIZER_ERROR_RECOGNIZER_BUSY = 8;//RecognitionService 忙碌中
private static final int RECOGNIZER_ERROR_INSUFFICIENT_PERMISSIONS = 9;//權限不足
class listener implements RecognitionListener
{
public void onReadyForSpeech(Bundle params)
{
//已經準備好可以接受語音輸入,可以在此時通知UI秀出相關icon,告知使用者開始說話
}
public void onBeginningOfSpeech()
{
//使用者開始說話,可以在此時通知UI秀出相關icon,告知使用者已收到聲音輸入了
}
public void onRmsChanged(float rmsdB)
{
//聲音輸入的強度變化,值是0~10
//可以在此時通知UI秀出聲音大小的相關icon
//onRmsChanged()來的非常頻繁和快速,最好是判斷有變化才通知UI更新
}
public void onBufferReceived(byte[] buffer)
{
}
public void onEndOfSpeech()
{
//使用者結束說話,系統會開始進行聲音辨識
}
public void onError(int error)
{
switch(error)
{
case RECOGNIZER_ERROR_NETWORK_TIMEOUT:
break;
case RECOGNIZER_ERROR_NETWORK:
break;
case RECOGNIZER_ERROR_AUDIO:
break;
case RECOGNIZER_ERROR_SERVER:
break;
case RECOGNIZER_ERROR_CLIENT:
break;
case RECOGNIZER_ERROR_SPEECH_TIMEOUT:
break;
case RECOGNIZER_ERROR_NO_MATCH:
break;
case RECOGNIZER_ERROR_RECOGNIZER_BUSY:
break;
case RECOGNIZER_ERROR_INSUFFICIENT_PERMISSIONS:
break;
}
}
public void onResults(Bundle results)
{
//辨識的結果
ArrayList data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
String firstMatched = (String) data.get(0);
txtResult.setText(firstMatched);
}
public void onPartialResults(Bundle partialResults)
{
}
public void onEvent(int eventType, Bundle params)
{
}
}
沒有留言:
張貼留言