KitKat tarda 6 segundos más que Froyo para reaccionar a TextToSpeech.speak () en primera llamada

En un teléfono reciente que ejecuta una versión reciente de Android, el motor TextToSpeech puede tardar unos 6 segundos más en reaccionar cuando se llama por primera vez, en comparación con un teléfono antiguo.

Mi código de prueba se muestra a continuación. (EDITADO: Código alternativo para Android 4.0.3 Ice Cream Sandwich, API 15 y superior, que se muestra al final).

En un Motorola Moto G de 1 año de funcionamiento con Kit Kit 4.4.4, puede tardar más de 7 segundos para que el motor TextToSpeech complete la primera llamada para speak() la palabra "Iniciado". Esta es la salida de mi código.

 D/speak﹕ call: 1415501851978 D/speak﹕ done: 1415501859122, delay: 7144 

En un Samsung SGH-T499Y de 3 años con 2.2 Froyo, tarda menos de un segundo en terminar de hablar:

 D/speak﹕ call: 1415502283050 D/speak﹕ done: 1415502283900, delay: 850 

¿Hay una manera de descubrir qué está sucediendo durante este retraso de 6 segundos?
¿Hay alguna forma de que el dispositivo más nuevo (y supuestamente más rápido) reaccione más rápidamente?

 package com.example.speak import android.app.Activity; import android.speech.tts.TextToSpeech; import android.os.Bundle; import android.util.Log; import java.util.HashMap; import java.util.Locale; public class MainActivity extends Activity implements TextToSpeech.OnInitListener, TextToSpeech.OnUtteranceCompletedListener { private final String TAG = "speak"; private Activity activity; private TextToSpeech tts; private long launchTime; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tts = new TextToSpeech(getApplicationContext(), this); } public void onInit(int status) { if (status == TextToSpeech.SUCCESS) { tts.setOnUtteranceCompletedListener(this); tts.setLanguage(Locale.UK); ttsSay("Started"); } } private void ttsSay(String toSpeak) { int mode = TextToSpeech.QUEUE_FLUSH; HashMap hashMap = new HashMap<String, String>(); hashMap.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, TAG); launchTime = System.currentTimeMillis(); Log.d(TAG, "call: " + launchTime); tts.speak(toSpeak, mode, hashMap); } public void onUtteranceCompleted(String utteranceID) { long millis = System.currentTimeMillis(); Log.d(TAG, "done: " + millis + ", delay: " + (millis - launchTime)); } } 

EDIT: A partir de Ice Cream Sandwich 4.0.3, API 15, Android proporciona UtteranceProgressListener , que se puede utilizar para medir tanto el inicio como el final de la reproducción de texto a voz. Lo siguiente no es compatible con Froyo;

 package com.example.announceappprogress; import android.app.Activity; import android.speech.tts.TextToSpeech; import android.os.Bundle; import android.speech.tts.UtteranceProgressListener; import android.util.Log; import java.util.HashMap; import java.util.Locale; public class MainActivity extends Activity implements TextToSpeech.OnInitListener { private final String TAG = "speak"; private TextToSpeech tts; private long launchTime; private long startTime; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tts = new TextToSpeech(getApplicationContext(), this); tts.setOnUtteranceProgressListener(mProgressListener); } public void onInit(int status) { if (status == TextToSpeech.SUCCESS) { tts.setLanguage(Locale.UK); ttsSay("Started"); } } private void ttsSay(String toSpeak) { int mode = TextToSpeech.QUEUE_FLUSH; HashMap hashMap = new HashMap<String, String>(); hashMap.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, TAG); launchTime = System.currentTimeMillis(); Log.d(TAG, "called: " + launchTime); tts.speak(toSpeak, mode, hashMap); } private final UtteranceProgressListener mProgressListener = new UtteranceProgressListener() { @Override public void onStart(String utteranceId) { startTime = System.currentTimeMillis(); Log.d(TAG, "started: " + startTime + ", delay: " + (startTime - launchTime)); } @Override public void onError(String utteranceId) {} // Do nothing. @Override public void onDone(String utteranceId) { long millis = System.currentTimeMillis(); Log.d(TAG, "done: " + millis + ", total: " + (millis - launchTime) + ", duration: " + (millis - startTime)); } }; } 

Aquí está una muestra de la salida que esto da en el Motorola Moto G que funciona 4.4.4 KitKat:

 D/speak﹕ called: 1415654293442 D/speak﹕ started: 1415654299287, delay: 5845 D/speak﹕ done: 1415654299995, total: 6553, duration: 708 

Es probable que no utilice el mismo motor TTS en ambos dispositivos.

Los motores TTS concatenativos con más sonido humano (que puede haber instalado en su dispositivo más reciente) pueden utilizar cientos de megabytes de archivos de datos para generar voz. La mayoría de estos sistemas requieren una cierta cantidad de tiempo de configuración para el primer enunciado. Los sistemas basados ​​en formantes sencillos (y más sonidos mecánicos) pueden requerir sólo un par de megabytes, y así cargar mucho más rápidamente.

Un experimento interesante sería el tiempo de la "segunda" expresión. Predigo que será más rápido que el primero en su nuevo teléfono. También un sonido más natural TTS sistemas suelen tener un tiempo de latencia más largo entre la llamada de la TTS y el comienzo de sonido de la emisión. Particularmente si se da una oración larga ya que el sistema examina toda la oración para formular el mejor fraseado antes de comenzar el enunciado.

Además, ¿está seguro de que su nuevo dispositivo no está utilizando algún servicio TTS basado en la nube? Hay otras variables adicionales significativas que afectarán la latencia.

  • Cómo cambiar la voz de un motor TTS
  • ¿Cómo instalar el motor TTS específico programáticamente en Android?
  • ¿Cómo agregar voces nuevas a Android Pico TTS?
  • Inicializar el objeto TextToSpeech en un subproceso de trabajo
  • TTS omite al azar las primeras letras de la oración
  • Sistema lengua turca para el texto al discurso
  • Texto a voz (TTS) -Android
  • Android TTS no habla gran cantidad de texto
  • TTS-UtteranceProgressListener no se llama
  • ¿Cuál es el flujo de audio predeterminado de TTS?
  • ¿Cómo saber cuándo se termina el TTS?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.