Question

J'essaie d'implémenter la technologie de synthèse vocale d'Android dans mon activité mais je suis confronté à une erreur étrange.Je n'entends aucun son provenant de mon code.La méthode speak ne fonctionne que si je la place dans la méthode onInit, sinon elle ne parle pas.

Mon code est le suivant :

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);
         }         
    }

Ce qui est étrange, c'est que si je place la méthode say dans onInit, cela fonctionne bien !

J'ai regardé attentivement logcat et voici les résultats :

TTSService.Oncreate () TTS charge audioTrack démarré TTSService.SetLanguage chargé en-US définissant avec succès le taux de parole à 100

et puis rien ne se passe.

Une idée de ce qui ne va pas avec le code ci-dessus ?

Merci d'avance!

Était-ce utile?

La solution

Après encore des heures de recherche du code, j'ai remarqué que le problème est que l'initialisation du moteur TTS prend un certain temps.Si l'initialisation n'est pas terminée, l'appel de la méthode Speak échouera.

Si vous "disez" quelque chose sur le bouton Cliquez probablement, vous n'aurez probablement pas besoin de cela, car l'utilisateur prendra du temps pour réfléchir avant d'appuyer sur le bouton et l'initialisation sera terminée.

Si vous voulez "dire" quelque chose comme tès que l'initialisation finition, utilisez ce code:

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);
            }
        }
    });

Autres conseils

Il est recommandé de mettre en œuvre TextToSpeech.OnInitListener de votre activité principale.essaye ça

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;
}

Eh bien, une autre cause de ce problème pourrait être votre moteur TTS. Parfois, dans les téléphones SAMSUNG, le moteur TTS par défaut est le moteur SAMSUNG qui ne fonctionne pas dans certaines langues comme le persan (je ne parle pas du texte persan, même si vous essayez de lire un texte en anglais, ça ne marche toujours pas, c'est étrange mais ça arrive).Pour résoudre ce problème, il vous suffit de définir le moteur TTS sur votre code (ou de sélectionner Setting -> Language input -> Text to speech -> Google Text-to-speech manuellement)

Un problème que j'ai eu avec Text-TO-Speech est que s'il est installé sur la carte SD, il ne fonctionnera pas lorsque l'USB est branché.Vous pouvez donc essayer de débrancher votre appareil de test de la clé USB et voyez si cela résout le problème.

Une autre chose que vous pourriez essayer est de passer à travers le programme et de voir si vous modifiez votre objet Text-Speech de quelque manière que ce soit d'accident.Définissez un point de pause sur la partie Talk de votre code et jetez un coup d'œil à toutes les variables de votre objet Talker.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top