¿Qué en TtsService podría explicar la falta de onUtteranceCompleted () para playEarcon ()?

Hace un tiempo, descubrí que playEarcon() nunca produce onUtteranceCompleted() .

En ese momento acabo de interpretar la documentación que decía "Llamado cuando se ha sintetizado un enunciado", ya que onUtteranceCompleted() no es aplicable para earcons porque, un earcon no es realmente un resultado de la sintetización TTS.

Pero mirando de nuevo código fuente de Android, simplemente no puedo encontrar una explicación que justificaría mi interpretación.

Algunos datos sobre mi gabinete de prueba :

  1. onUtteranceCompleted() siempre llega para el ID de la emisión que precede al earcon. Ese enunciado es un enunciado TTS ordinario, no un earcon.
  2. El earcon después de que se juega (es decir, exactamente como se pretende).
  3. onUtteranceCompleted() para que earcon nunca aparece. Este comportamiento es muy consistente y reproducible.

Al profundizar en el código fuente de TtsService, parece haber sólo 2 métodos que podrían afectar la llegada (o ausencia) de onUtteranceCompleted() :

  1. TtsService.processSpeechQueue ()
  2. TtsService.onCompletion ()

Si examina ese código, verá que un tercer candidato, TtsService.getSoundResource () es descartado (como responsable de la falta de onUtteranceComplete para mi earcon) debido al hecho # 2 anterior: El earcon siempre juega, por lo tanto getSoundResource() No puede devolver nulo.

Utilizando la misma lógica, también se puede descartar el primer candidato, TtsService.processSpeechQueue () , por el mismo hecho # 2: El earcon siempre juega, por lo tanto las siguientes 2 sentencias críticas siempre se ejecutan:

 1108 mPlayer.setOnCompletionListener(this); ... 1111 mPlayer.start(); 

Por lo tanto, nos quedamos con el segundo candidato sólo, TtsService.onCompletion () , como una posible explicación de por qué un playEarcon() nunca produce onUtteranceCompleted() :

 public void onCompletion(MediaPlayer arg0) { // mCurrentSpeechItem may become null if it is stopped at the same // time it completes. SpeechItem currentSpeechItemCopy = mCurrentSpeechItem; if (currentSpeechItemCopy != null) { String callingApp = currentSpeechItemCopy.mCallingApp; ArrayList<String> params = currentSpeechItemCopy.mParams; String utteranceId = ""; if (params != null) { for (int i = 0; i < params.size() - 1; i = i + 2) { String param = params.get(i); if (param.equals(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID)) { utteranceId = params.get(i + 1); } } } if (utteranceId.length() > 0) { dispatchUtteranceCompletedCallback(utteranceId, callingApp); } } processSpeechQueue(); } 

En allí, sólo hay 2 condiciones que no podrían producir el comando dispatchUtteranceCompletedCallback () :

  1. CurrentSpeechItemCopy == null
  2. UtteranceId.length () == 0

Pero sé con seguridad que la condición # 2 se puede descartar porque registro todos los utteranceIds y los earcon son definitivamente allí.

Además, examinar todo el registro del sistema:

 Log.v(SERVICE_TAG, "TTS callback: dispatch started"); 

El onUtteranceCompleted() podría ser el resultado de que dispatchUtteranceCompletedCallback () no fue llamado, pero también podría ser el resultado de mCallbacksMap.get(packageName) devolviendo null.

Así, nos quedamos de nuevo con 2 posibilidades, las cuales no me hacen mucho sentido:

  1. En el momento en que se llama a onCompletion () de earcon, mCurrentSpeechItem de earcon es nulo. ¿ Pero por qué?
  2. MCallbacksMap está vacío. ¿Qué es y cuándo se llena?

¿Alguna sugerencia u otra explicación para resolver este misterio?

Compruebe android.speech.tts.TextToSpeech # playEarcon () en la línea 807 . El argumento params pasado al lazo de servicio de texto a voz es nulo, lo que significa que el servicio nunca recibe su ID de emisión.

  public int playEarcon(String earcon, int queueMode, HashMap<String,String> params) { synchronized (mStartLock) { ... result = mITts.playEarcon(mPackageName, earcon, queueMode, null); } ... } 
  • ¿Cómo saber cuándo se termina el TTS?
  • ¿Por qué no se llama a UtteranceProgress Listener a Text to Speach?
  • Agrega mi motor TTS a Android TTS Serivce como SAPI
  • Usar texto a voz en una llamada de voz
  • Hablar con TTS como Hindi
  • ¿Cómo configurar el volumen para el método de "hablar" de texto a voz?
  • Cómo cambiar programáticamente el motor predeterminado TTS
  • Cómo dar pausa o brecha entre palabras en TTS en android
  • ¿Por qué UtteranceProgressListener no es una interfaz?
  • Android texto a voz es muy lento para inicializar
  • Pausa tono del teléfono mientras habla a través de texto a voz y luego reanudar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.