在Cupcake中,Android引入了對語音識別的支持。語音識別主要位于android.speech包中,主要的類包括SpeechRecognizer、RecognitionService、RecognizerIntent、RecognizerResultsIntent、RecognitionListener等類和接口。
SpeechRecognizer提供了接入語音識別服務(wù)的接口,下面是SpeechRecognizer的常用方法:
createSpeechRecognizer() //創(chuàng)建語音識別器
setRecognitionListener() //設(shè)置監(jiān)聽器
startListening() //開始語音識別
stopListening() //結(jié)束語音識別
語音識別要求"android.permission.RECORD_AUDIO"權(quán)限。
為了進(jìn)行語音識別,首先需要發(fā)布一個語音識別的Activity,然后系統(tǒng)會啟動語音識別引擎,并對用戶的語音進(jìn)行處理,處理的結(jié)果將會通過onActivityResult()方法被返回。下面是Android中的一個實現(xiàn):
發(fā)起語音識別
private void startVoiceRecognitionActivity()
{
//語音識別的Action
Intent intent=new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
//設(shè)置附加信息
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Speech recognition demo");
startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
}
對語音識別結(jié)果的處理如下:
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (requestCode==VOICE_RECOGNITION_REQUEST_CODE && resultCode==RESULT_OK)
{
ArrayList< String> matches=data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
mList.setAdapter(new ArrayAdapter< String>(this,android.R.layout.simple_list_item_1,matches));
}
super.onActivityResult(requestCode, resultCode, data);
}
在目前的實現(xiàn)中,Android支持兩種類型的Action:ACTION_RECOGNIZE_SPEECH和ACTION_WEB_SEARCH?紤]到可能沒有處理對應(yīng)的Action的應(yīng)用,在代碼的實現(xiàn)中需要捕獲ActivityNotFoundException異常。
Action為ACTION_RECOGNIZE_SPEECH時,請求語音識別的附加信息為EXTRA_LANGUAGE_MODEL,可選附加信息為EXTRA_PROMPT、EXTRA_LANGUAGE、EXTRA_MAX_RESULTS、EXTRA_RESULTS_PENDINGINTENT、EXTRA_RESULTS_ PENDINGINTENT_BUNDLE,結(jié)果附加信息為EXTRA_RESULTS。
Action為ACTION_WEB_SEARCH時,請求語音識別的附加信息為EXTRA_ LANGUAGE_MODEL,可選附加信息為EXTRA_PROMPT、EXTRA_LANGUAGE、EXTRA_MAX_RESULTS,結(jié)果附加信息為EXTRA_RESULTS。