歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Qrobot開發總結之Android語音識別

Qrobot開發總結之Android語音識別

日期:2017/3/1 10:52:33   编辑:Linux編程

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. super.onActivityResult(requestCode, resultCode, data);
  9. }

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

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

Copyright © Linux教程網 All Rights Reserved