tts studio speak spanish languages español ejemplo android text-to-speech

studio - text to speech android español



TTS-UtteranceProgressListener no se llama (3)

Para agregar a la buena respuesta de WizardKnight:

La nueva API prefiere un paquete así que reemplace el HashMap con un paquete

Bundle params = new Bundle(); params.putString(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "");

luego cuando haces la llamada hablada

tts.speak(text, TextToSpeech.QUEUE_FLUSH, params, "UniqueID");

La clave es usar la ID en la llamada de voz. Puedes ponerlo en el paquete, pero no hará nada más por ti. Tiene que estar en la llamada de hablar para activar al oyente.

No quiero poner todo mi código aquí, así que solo estoy poniendo las piezas relevantes. Si necesita más, siéntase libre de preguntar.

Estoy usando Text To Speech (TTS) que conduce a un oyente de habla después de que hace una pregunta ... Descubrí a través de Log outputs que se llama a onInit de TTS, pero el UtteranceProgressListener no lo es y no puedo entender por qué. Cualquier ayuda es apreciada.

// ---Initialize TTS variables--- // Implement Text to speech feature tts = new TextToSpeech(this, new ttsInitListener()); // set listener to the TTS engine tts.setOnUtteranceProgressListener(new ttsUtteranceListener()); if (!tts.isSpeaking()) { tts.speak("Speak to me", TextToSpeech.QUEUE_FLUSH, null); }

// --- TEXT TO SPEECH && SPEECH TO TEXT METHODS --- class ttsInitListener implements OnInitListener { @Override public void onInit(int status) { if (status == TextToSpeech.SUCCESS) { tts.setLanguage(Locale.getDefault()); } else { tts = null; Toast.makeText(mContext, "Failed to initialize TTS engine.", Toast.LENGTH_SHORT).show(); } } } class ttsUtteranceListener extends UtteranceProgressListener { @Override public void onDone(String utteranceId) { if (processStart) { speech.startListening(intent); } else { ... } } @Override public void onError(String utteranceId) { } @Override public void onStart(String utteranceId) { } }

Agregué salidas de registro a todos mis métodos TTS y Speech. UtteranceProgressListener''s onStart ni siquiera se llama:

11-30 00:38:37.299: D/OpenGLRenderer(15842): Enabling debug mode 0 11-30 00:38:39.782: I/TextToSpeech(15842): Connected to ComponentInfo{com.google.android.tts/com.google.android.tts.service.GoogleTTSService} 11-30 00:38:39.782: I/TextToSpeech(15842): Set up connection to ComponentInfo{com.google.android.tts/com.google.android.tts.service.GoogleTTSService} 11-30 00:38:39.782: D/LOOK AT ME!!!(15842): ttsInitListener - onInit


Tengo una solución cableada para detectar el clima. TTS ha terminado de hablar.

Paso 1: crea esta clase en tu código.

class Waiter extends AsyncTask<Void,Void,Void>{ @Override protected Void doInBackground(Void... voids) { while (tts.isSpeaking()){ try{Thread.sleep(1000);}catch (Exception e){} } return null; } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); //TTS has finished speaking. WRITE YOUR CODE HERE } }

Paso 2: Llámalo cuando llames a tts.speak (...)

tts.speak(...); new Waiter().execute();


encontré la respuesta ...

Resulta que los recursos TTS que encontré en línea usaban un único origen de cadena TTS, por lo que el tercer parámetro en tts.speak (texto de cadena, int queueMode, parámetros HashMap) se estableció en nulo.

a cualquiera que tenga este problema en el futuro:

si configura el tercer parámetro en nulo, no hay ID para que UtteranceProgressListener lo rastree. La solución consistía en crear e inicializar un hashmap, y luego agregarlo a la matriz incluida para cada nuevo TTS con un nuevo ID que pudiera rastrearse. Aquí está el código:

HashMap<String, String> map = new HashMap<String, String>();

luego, antes de llamar a tts.speak ...

map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "UniqueID");

entonces puedes llamar hablar con todos los params ...

tts.speak(text, TextToSpeech.QUEUE_FLUSH, map);