歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Qrobot開發總結之Android語音識別

Android sdk提供了語音識別的接口,有些人在網上找了例子發現運行不了(PS:網上的例子基本就那一個,都是各種轉載的),原因在於手機沒有安裝google語音搜索軟件!去網上下載一個安上就可以了,另外需保持手機網絡暢通。

 

第一種方法:這種方法會顯示一個語音對話框,各種提示信息會顯示的比較清晰,也是實現起來最簡單的。

觸發語音識別是調用

  1. Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);  
  2. intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);  
  3. intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "您的語音將轉化為文字");  
  4. startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);  

VOICE_RECOGNITION_REQUEST_CODE這個是一個靜態的全局變量

sdk解釋是:requestCode If>= 0, this code will be returned in onActivityResult() when the activity exits.

然後復寫onActivityResult()方法:

  1. @Override  
  2.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  3.         if(requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK){  
  4.             ArrayList<String> results = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);  
  5.             Toast.makeText(MainActivity.this, matches.get(0), Toast.LENGTH_LONG).show();  
  6.             //to do sth        
  7.         }  
  8.           
  9.         super.onActivityResult(requestCode, resultCode, data);  
  10.     }  

第2中方法:這種方法是不顯示對話框,完全在後台運行,給用戶的體驗會更好一些。

初始化:

  1. SpeechRecognizer recognizer = SpeechRecognizer.createSpeechRecognizer(this);  
  2. recognizer.setRecognitionListener(new listener());  

觸發語音識別時調用

  1. Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);  
  2. intent.putExtra("calling_package""VoiceIME");  
  3. intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1);  
  4. recognizer.startListening(intent);  

區別於第一種方法,這種方法要實現一個接口RecognitionListener類

  1. class listener implements RecognitionListener {  
  2.         public void onReadyForSpeech(Bundle params) {  
  3.               
  4.         }  
  5.   
  6.         public void onBeginningOfSpeech() {  
  7.               
  8.         }  
  9.   
  10.         public void onRmsChanged(float rmsdB) {  
  11.               
  12.         }  
  13.   
  14.         public void onBufferReceived(byte[] buffer) {  
  15.               
  16.         }  
  17.   
  18.         public void onEndOfSpeech() {  
  19.               
  20.         }  
  21.   
  22.         public void onError(int error) {  
  23.             String s = "";  
  24.             switch(error){  
  25.             case SpeechRecognizer.ERROR_AUDIO:  
  26.                 s = "錄音設別錯誤";  
  27.                 break;  
  28.             case SpeechRecognizer.ERROR_CLIENT:  
  29.                 s = "其他客戶端錯誤";  
  30.                 break;  
  31.             case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:  
  32.                 s = "權限不足";  
  33.                 break;  
  34.             case SpeechRecognizer.ERROR_NETWORK:  
  35.                 s = "網絡連接錯誤";  
  36.                 break;  
  37.             case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:  
  38.                 s = "網絡連接超時";  
  39.                 break;  
  40.             case SpeechRecognizer.ERROR_NO_MATCH:  
  41.                 s = "沒有匹配項";  
  42.                 break;  
  43.             case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:  
  44.                 s = "識別服務繁忙";  
  45.                 break;  
  46.             case SpeechRecognizer.ERROR_SERVER:  
  47.                 s = "識別服務器錯誤";  
  48.                 break;  
  49.             case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:  
  50.                 s = "無語音輸入";  
  51.                 break;  
  52.             }  
  53.              s += " 請重試";  
  54.             Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();  
  55.               
  56.         }  
  57.   
  58.         public void onResults(Bundle results) {  
  59.               
  60.             recognizer_result = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION).get(0);  
  61.             Toast.makeText(MainActivity.this, recognizer_result, Toast.LENGTH_SHORT).show();  
  62.               
  63.         }  
  64.   
  65.         public void onPartialResults(Bundle partialResults) {  
  66.               
  67.         }  
  68.   
  69.         public void onEvent(int eventType, Bundle params) {  
  70.               
  71.         }  
  72.           
  73.     }  

看方法的名字相信大家應該就知道要干什麼了,多看文檔。起初我覺得用第2中方法給用戶的提示信息太少,往往出錯了,用戶不知道是怎麼回事。後面看文檔才發現google android sdk已經定義了很多錯誤的錯誤號,只要根據不同錯誤給出恰當的提示就好了!

Copyright © Linux教程網 All Rights Reserved