前言

在現有的軟體的搜索框中基本上都會加上語音搜索的圖示,以方便使用者輸入.我們xxxx的搜索框其實也可以借鑒這樣的輸入方式,提高使用者體驗.
語音辨識有3種方式實現①使用intent調用語音辨識程式;②通過sevice的方式實現;③選用接入第3方語音辨識庫;
下面就這一方案技術①,③實現進行描述.
1. 使用intent調用語音辨識程式
Android系統已經為我們提供了通過intent的方式來啟動,在代碼中只發出一個」android.speech.action.RECOGNIZE_SPEECH」的intent,就可以調用到系統中已經安裝好的語音辨識軟體.我們只要獲取傳回值並顯示即可.調用代碼如下:
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, getString(R.string.hint_code));
startActivityForResult(intent, REQUEST_CODE_RECOGNITION_REQUEST);

 

當然,如果使用者的機子沒有安裝相關的軟體,就會報錯,所以我們還需要做如下的處理之一.
1.為上面的程式碼片段添加異常捕獲並提示;
2.在調用之前判斷下時候使用者的機子已經安裝了相關的軟體,沒有則把語音輸入的按鈕隱藏或者不可操作,判斷的代碼如下:
public static boolean isApkInstalled(String strIntent){
PackageManager packageManager = coNtext.getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(new Intent(strIntent), 0);

 

return activities != null && !activities.isEmpty();
}
在調用之後在onActivityResult()裡添加對語音輸入返回的值的過濾.例如在intent中就存在結果集data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);下面示例就是顯示輸入結果讓使用者選擇正確的輸入值,這裡是彈出對話方塊的方式.
if(requestCode == REQUEST_CODE_RECOGNITION_REQUEST && resultCode == RESULT_OK) {
ArrayList<String> results=data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);

 

if(results!=null && !results.isEmpty()){
int size=results.size();
audioArray=new String[size];
results.toArray(audioArray);

 

for(int i=0; i<size;i++){
String str=results.get(i);
if(str!=null){
str.replaceAll(" ", "");
str.replaceAll(" ", "");
}

 

audioArray[i]=str;
}

 

showDialog(DIALOG_AUDIO);
}else{
Toast.makeText(this, R.string.hite_audio, Toast.LENGTH_SHORT).show();
}
}
20130313114503820  
2. 選用接入第3方語音辨識庫
上面那種是依賴于使用者自己已經安裝了語音輸入的方式,但如果使用者機子上沒有的話,可以用過提示使用者安裝.其實更好的方式是採用接入第2,3方的語音輸入來實現更可靠些. 下面介紹選用科大訊飛的語音辨識庫.
科大訊飛語音辨識庫中主要是用到RecognizerDialog,他是繼承與Dialog,所以只要用過showDialog()的方式即可直接顯示其輸入介面.createDialog代碼如下:
RecognizerDialog recognizerDialog = new RecognizerDialog(MainActivity.this, "appid=1234567");
appid應該寫從科大訊飛申請到的appid recognizerDialog.setEngine("sms", null, null);//」sms」:普通文本轉寫 recognizerDialog.setListener(new RecognizerDialogListener() {
@Override
public void onResults(ArrayList<RecognizerResult> results,
boolean arg1) {
StringBuffer result = new StringBuffer();
for (RecognizerResult r : results) {
result.append(r.text);
}
editText.setText(result.toString());
}

 

@Override
public void onEnd(SpeechError arg0) {

 

}
});
20130313114504779  
 
From:OSChina
arrow
arrow
    文章標籤
    android
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()