android – 处理RecognitionListener错误

前端之家收集整理的这篇文章主要介绍了android – 处理RecognitionListener错误前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在使用Android的语音API来不断获取用户的输入.但是,当发生错误时,这不能很好地工作.

我所做的是在检测错误方法中重新启动监听器.它有时会工作,但识别器会经常挂起一段时间.特别是在检测到服务器,网络超时和识别器忙碌错误后.这很烦人!

我找到了一些解决这个问题的尝试,但没有一个能为我工作.

你有更好的主意吗?

这是我的代码

  1. private void startSR(){
  2. intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
  3. //intent.putExtra(RecognizerIntent.,value)
  4. intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
  5. intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,mContext.getPackageName());
  6. intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS,10);
  7. Log.d(TAG,"Speech recognition started!");
  8. if (recognizer != null) {
  9. recognizer = null;
  10. mListener = null;
  11. }
  12. Log.d(TAG,"setRecognitionListener");
  13. recognizer = SpeechRecognizer.createSpeechRecognizer(mContext);
  14. mListener = new Listener();
  15. recognizer.setRecognitionListener(mListener);
  16. recognizer.startListening(intent);
  17. }
  18. class Listener implements RecognitionListener{
  19. @Override
  20. public void onBeginningOfSpeech() {
  21. Log.i(TAG,"onBeginningOfSpeech");
  22. mStatus = "Beginning speech";
  23. }
  24. @Override
  25. public void onBufferReceived(byte[] buffer) {
  26. Log.i(TAG,"onBufferReceived");
  27. }
  28. @Override
  29. public void onEndOfSpeech() {
  30. Log.i(TAG,"onEndOfSpeech");
  31. mStatus = "Speech ended";
  32. }
  33. @Override
  34. public void onEvent(int eventType,Bundle params) {
  35. Log.i(TAG,"onEvent " + eventType);
  36. }
  37. @Override
  38. public void onPartialResults(Bundle partialResults) {
  39. Log.i(TAG,"onPartialResults");
  40. mStatus = "Partial results";
  41. }
  42. @Override
  43. public void onReadyForSpeech(Bundle params) {
  44. Log.i(TAG,"onReadyForSpeech");
  45. mReady = true;
  46. mStatus = "Speech engine ready";
  47. }
  48. @Override
  49. public void onRmsChanged(float rmsdB) {
  50. // TODO Auto-generated method stub
  51. }
  52. @Override
  53. public void onError(int error) {
  54. // TODO Auto-generated method stub
  55. mError = "";
  56. mStatus = "Error detected";
  57. switch (error) {
  58. case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
  59. mError = " network timeout";
  60. startListening();
  61. break;
  62. case SpeechRecognizer.ERROR_NETWORK:
  63. mError = " network" ;
  64. //toast("Please check data bundle or network settings");
  65. return;
  66. case SpeechRecognizer.ERROR_AUdio:
  67. mError = " audio";
  68. break;
  69. case SpeechRecognizer.ERROR_SERVER:
  70. mError = " server";
  71. startListening();
  72. break;
  73. case SpeechRecognizer.ERROR_CLIENT:
  74. mError = " client";
  75. break;
  76. case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
  77. mError = " speech time out" ;
  78. break;
  79. case SpeechRecognizer.ERROR_NO_MATCH:
  80. mError = " no match" ;
  81. startListening();
  82. break;
  83. case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
  84. mError = " recogniser busy" ;
  85. break;
  86. case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
  87. mError = " insufficient permissions" ;
  88. break;
  89. }
  90. Log.i(TAG,"Error: " + error + " - " + mError);
  91. //startSR();
  92. }
  93. @Override
  94. public void onResults(Bundle results) {
  95. mStatus = "Got some results";
  96. mResultAvailable = true;
  97. String str = new String();
  98. Log.d(TAG,"onResults " + results);
  99. mResults = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
  100. //mConfidences = results.getDoubleArray(SpeechRecognizer.CONFIDENCE_scoreS);
  101. Log.i(TAG,toString());
  102. startListening();
  103. }
  104. }// class Listener
  105. public ArrayList
最佳答案
>如果出现识别器忙碌错误,则必须调用cancel,然后调用startListening
>如果出现服务器或网络错误,则必须在调用startListening之前检查网络连接

猜你在找的Android相关文章