2011-05-01 12 views
11

Por varias razones, necesito usar la API SpeechRecognizer sin formato en lugar de RecognizerIntent (RECOGNIZE_SPEECH) activity más fácil.Does RecognitionListener.onError() automáticamente SpeechRecognizer.cancel()?

Eso significa, entre otras cosas, que tengo que manejar RecognitionListener.onError() mismo.

En respuesta a algunos de los errores, simplemente quiero volver a comenzar a escuchar. Esto parece sencillo, pero cuando acabo de llamar SpeechRecognizer.startListening() en caso de error, esto a veces parece desencadenar dos errores diferentes:

ERROR/ServerConnectorImpl(619): Previous session not destroyed 

y

"concurrent startListening received - ignoring this call" 

que apunta que debería haber hecho un poco de limpieza antes de intentar llamar SpeechRecognizer.startListening() de nuevo.

Si esto es cierto, significa que con un error RecognitionListener, la escucha no se detiene y/o cancela automáticamente.

También es posible que algunos errores detengan/cancelen la escucha, mientras que otros no. En realidad, hay sólo 9 SpeechRecognizer errores:

  1. ERROR_NETWORK_TIMEOUT
  2. ERROR_NETWORK
  3. ERROR_AUDIO
  4. ERROR_SERVER
  5. ERROR_CLIENT
  6. ERROR_SPEECH_TIMEOUT
  7. ERROR_NO_MATCH
  8. ERROR_RECOGNIZER_BUSY
  9. ERROR_INSUFFICIENT_PERMISSIONS

Dado que la documentación no es muy detallada sobre el cual se cancela el error de escuchar y que no lo hace, ¿te sucede saber, basándose en su experiencia, que los errores requieren hacer la limpieza (y en qué medida) antes de intentando SpeechRecognizer.startListening() nuevamente?

+0

No hay mucha gente que sepa lo suficiente como para responder aquí. Te sugiero que intentes detectar los errores y Log.w en consecuencia en lugar de esperar una respuesta. Debería poder averiguar qué errores lo cierran. – SuhailSherif

Respuesta

2

No, cancel no se invoca cuando se invoca onError. Puede mirar la fuente here.

1

puede destruir la sesión actual mediante destroy(). Y puede reiniciarlo nuevamente

1

En realidad Femi, algunas de las condiciones de error HACEN que el servicio de transcripción no se escuche (SpeechRecognizer.ERROR_SPEECH_TIMEOUT por ejemplo). No es necesario llamar a destroy, solo startlistening nuevamente.

+0

En realidad @Shroud, si miras el [código fuente] (http://hi-android.info/src/android/speech/SpeechRecognizer.java.html) que publiqué en mi pregunta original, verás que ' SpeechRecognizer.ERROR_SPEECH_TIMEOUT' no se maneja de manera diferente a otros errores. Todos los errores son transmitidos por 'mInternalHandler.handleMessage()' a 'mInternalListener.onError()'. Que a su vez lo retransmite a 'Mensaje.obtener (mInternalHandler, MSG_ERROR, error) .sendToTarget(); '. ¿Dónde lo ves empapando el servicio de transcripción? – srf

Cuestiones relacionadas