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).
- UtteranceProgressListener no funciona para Android TTS
- Android TTS no habla
- ¿Cómo puedo guardar el archivo Text to Speech como formato .wav / .mp3 en idioma árabe en External Storage?
- ¿Qué significan los nombres / códigos de Android Voice?
- Android TTS añadir idiomas
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
- TextToSpeech: función de palabra obsoleta en el nivel 21 de la API
- ¿Qué es un Earcon?
- Resalte la palabra actual que el motor TTS está hablando
- TextToSpeech.setEngineByPackageName () no establece nada
- Android "speak fallado: no está vinculado al motor tts"
- Android: escucha un comando de voz (todo el tiempo)
- Usar texto a voz en una llamada de voz
- SpeechToText y ejecutando la intención ACTION_CHECK_TTS_DATA
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.
- Obteniendo la instancia Switch dentro de ActionBar
- XML Layout – Identificador de entrada 0x11a es más grande que el recuento de entradas 0xb2