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 

One Solution collect form web for “KitKat tarda 6 segundos más que Froyo para reaccionar a TextToSpeech.speak () en primera llamada”

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.

  • Transmisión de notificaciones de texto a voz durante la conducción
  • Manejo de múltiples idiomas sin demora en el TTS de Android
  • La interfaz de usuario de texto a voz es un android lento
  • Android TTS añadir idiomas
  • ¿Cómo saber cuándo se termina el TTS?
  • ¿Qué significan los nombres / códigos de Android Voice?
  • Inicializar el objeto TextToSpeech en un subproceso de trabajo
  • TextToSpeech: función de palabra obsoleta en el nivel 21 de la API
  • ¿Cómo instalar el motor TTS específico programáticamente en Android?
  • Android TTS (texto a voz) no pronuncia letra única correctamente
  • Problemas con TTS en el Samsung Galaxy S3
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.