Android TTS non parla
-
12-12-2019 - |
Domanda
Sto cercando di implementare il testo alla tecnologia vocale di Android nella mia attività, ma affronto uno strano errore.Non riesco a sentire alcun suono, dal mio codice.Il metodo Speak funziona solo se lo metto nel metodo Oninit, altrimenti non parla.
Il mio codice è il seguente:
..public class GameOverActivity extends Activity implements OnInitListener { private TextToSpeech talker; .... talker = new TextToSpeech(this, this); say("Something",false); ... public void onInit(int status) { if (status == TextToSpeech.SUCCESS) { talker.setLanguage(Locale.US); } else if (status == TextToSpeech.ERROR) { Toast.makeText(this,"Error occurred while initializing Text-To-Speech engine", Toast.LENGTH_LONG).show(); } void say(String text, boolean flush) { if(flush == true) { talker.speak(text,TextToSpeech.QUEUE_FLUSH,null); } if(flush == false) { talker.speak(text,TextToSpeech.QUEUE_ADD,null); } }
La cosa strana è che se metto il metodo dire in oninit, funziona bene!
Ho visto il logcat con attenzione e qui ci sono i risultati:
ttsservice.oncreate () Sta caricando Audiotrack ha iniziato Ttsservice.setlanguage. caricato it-noi con successo Impostazione del tasso vocale a 100
E poi non succede nulla.
Qualche idea su ciò che è sbagliato nel codice sopra?
Grazie in anticipo!
Soluzione
Dopo alcune ore in più guardando il codice, ho notato che il problema è che l'inizializzazione del motore TTS richiede un po 'di tempo.Se l'inizializzazione non è finita, la chiamata del metodo Speak fallirà.
Se tu "dica" qualcosa sul pulsante clicca, probabilmente non avrai bisogno di questo, perché l'utente richiederà del tempo per pensare prima di premere il pulsante e l'inizializzazione sarà finita.
Se vuoi "dire" qualcosa come la prossima inizializzazione finisce, usa questo codice:
talker = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int arg0) {
if(arg0 == TextToSpeech.SUCCESS)
{
talker.setLanguage(Locale.US);
say(gameover,true);
say(line,false);
say(definition_string,false);
}
}
});
. Altri suggerimenti
Si consiglia di implementare TextToSpeech.OnInitListener
dall'attività principale.Prova questo
public class GameOverActivity extends Activity implements TextToSpeech.OnInitListener {
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
int result = mTts.setLanguage(Locale.US);
// Try this someday for some interesting results.
// int result mTts.setLanguage(Locale.FRANCE);
if (result == TextToSpeech.LANG_MISSING_DATA ||
result == TextToSpeech.LANG_NOT_SUPPORTED) {
// Lanuage data is missing or the language is not supported.
//Log.e(TAG, "Language is not available.");
} else {
// Check the documentation for other possible result codes.
// For example, the language may be available for the locale,
// but not for the specified country and variant.
// The TTS engine has been successfully initialized.
// Allow the user to press the button for the app to speak again.
// mAgainButton.setEnabled(true);
// Greet the user.
//sayHello();
}
} else {
// Initialization failed.
}
}
private TextToSpeech mTts;
}
. Bene un'altra causa di questo problema potrebbe essere il tuo motore TTS, a volte nei telefoni Samsung il motore TTS predefinito è il motore Samsung che non funziona su alcune lingue come persiano (non intendo per il testo persiano, anche se tu "Sta cercando di leggere un testo inglese, ancora non funziona, è strano ma succede).
Per risolvere tutto ciò che devi fare è impostare il motore TTS sul tuo codice (o selezionare Manualmente Setting -> Language input -> Text to speech -> Google Text-to-speech
)
Un problema che ho avuto con testo-to-discorso è che se è installato nella scheda SD, non funzionerà quando l'USB è collegato.Quindi potresti provare a scollegare il tuo dispositivo di prova dal USB e vedere se risolve il problema.
Un'altra cosa che potresti provare sta facendo un passo attraverso il programma e vedere se stai modificando il tuo oggetto TEXT-TO-SPEGNO in alcun modo in caso di incidente.Imposta un punto di interruzione nella parte del tuo codice del tuo codice e dai un'occhiata a tutte le variabili nell'oggetto del talker.