[JAVA] Remarques sur le rappel de TextToSpeech

Un mémo lors de la création d'une application à l'aide de TextToSpeech avec Android

point important

  1. Le rappel ne peut être reçu que si utterance_id est défini.
  2. Le rappel à l'arrêt pendant la lecture peut être différent.
  3. Le traitement dans le rappel est effectué dans le thread d'interface utilisateur.

1. Le rappel ne peut être reçu que si utterance_id est défini.

Pour obtenir le rappel dans TextToSpeech onInit textToSpeech.setOnUtteranceProgressListener(…) je fais Si vous ne définissez pas l'utteranceId de la méthode qui joue réellement la voix, vous ne recevrez pas le rappel. Surtout pour 4 séries ou moins, c'est difficile à comprendre car il faut le paramétrer correctement avec HashMap.

tts.java


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
	      //Plus qu'une sucette
                String id = String.valueOf(orderNo);
                textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, null, utteranceId);
            } else {
	      //Sous kitkat
                HashMap<String, String> params = new HashMap<String, String>();
                String id = String.valueOf(orderNo);
                params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, id);
                textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, params);
            }

2. Le rappel à l'arrêt pendant la lecture peut être différent.

Il y avait une différence dans le comportement de onDone appelé lorsque la lecture était terminée sur mon terminal, et j'en étais assez accro. OnDone est appelé lorsqu'il est arrêté dans la série 4 Galaxy et la série 5 Nexus. OnDone n'est pas appelé lorsqu'il est arrêté dans 6 series Xperia. .. .. Dans mon cas, lorsque j'arrête la lecture avec le bouton d'arrêt, J'avais du mal à contrôler pour définir le texte suivant et démarrer la lecture lorsque la lecture était terminée.

Pour contourner le problème, conservez le statut TextToSpeech dans enum et Lorsque le bouton d'arrêt est enfoncé, l'état passe à l'état arrêté. Lorsque cette option est activée, vérifiez l'état et définissez la lecture suivante si elle est arrêtée Corrigé en définissant l'état sur l'état de lecture au moment du rappel onStart.

tts.java


//Au moment de setOnClickListener du bouton d'arrêt
//ttsStatus = TTSStatusEnum.STOP;À

textToSpeech.setOnUtteranceProgressListener(new UtteranceProgressListener() {
                @Override
                public void onStart(String utteranceId) {
		          ttsStatus = TTSStatusEnum.PLAY;
                }

                @Override
                public void onDone(String utteranceId) {
		          if (ttsStatus == TTSStatusEnum.STOP) {
		            //Déjà arrêter
		            return;
		          }
		          ttsStatus = TTSStatusEnum.STOP;
		          //Prochain processus de lecture ...
                }
...

3. Le traitement dans le rappel est effectué dans le thread d'interface utilisateur.

Traitement de l'interface utilisateur qui souhaite changer la couleur du libellé lu dans le rappel Vous devez le traiter explicitement dans le thread d'interface utilisateur.

tts.java


textToSpeech.setOnUtteranceProgressListener(new UtteranceProgressListener() {
                @Override
                public void onStart(String utteranceId) {
		            runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                           //Traitement pour rendre la couleur du texte rouge
                        }
                    });
                }

                @Override
                public void onDone(String utteranceId) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
			           //Traitement pour restaurer la couleur du texte
                       }
                    });
                }
...

Référence: Le rappel Android TTS onUtteranceCompleted n'est pas appelé

Recommended Posts

Remarques sur le rappel de TextToSpeech
[Android] Notes sur xml
Remarques sur l'appel du programme d'installation sur l'application Android
Remarques sur la migration de CircleCI 1.0 vers 2.0
Remarques sur le traitement des threads Android (java)
Appeler java depuis C ++ sur Android NDK
Remarques sur la création d'un plug-in Android pour Unity
[Android] Notes détaillées
Que faire si TextToSpeech ne fonctionne pas sur Android 11
Notes sur la mise à jour d'Ubuntu à partir de la ligne de commande (16.04 → 18.04, 18.04 → 20.04 les deux)