web-dev-qa-db-fra.com

Comment savoir quand TTS est terminé?

J'implémente une application Interactive Voice Response sur Android. Je voudrais savoir comment déterminer quand la fonction tts.speak() a fini de parler pour que je puisse appeler ma fonction de reconnaissance vocale.

35
Felipeap
public class TTSActivity extends Activity implements OnInitListener, OnUtteranceCompletedListener, ... {
private TextToSpeech mTts;
...........
private void speak(String text) {
   if(text != null) {
      HashMap<String, String> myHashAlarm = new HashMap<String, String>();
      myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_ALARM));
      myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "SOME MESSAGE");
      mTts.speak(text, TextToSpeech.QUEUE_FLUSH, myHashAlarm);
   }
}
// Fired after TTS initialization
public void onInit(int status) {
    if(status == TextToSpeech.SUCCESS) {
        mTts.setOnUtteranceCompletedListener(this);
    }
}
// It's callback
public void onUtteranceCompleted(String utteranceId) {
   Log.i(TAG, utteranceId); //utteranceId == "SOME MESSAGE"
   }
...........
}

Lire n bon tutoriel

47
mysuperass

SetOnUtteranceCompletedListener est déconseillé depuis le niveau 15 de l'API. À la place, utilisez setOnUtteranceProgressListener .

J'ai trouvé un extrait de code ( ici ) qui m'a vraiment permis de savoir quand la synthèse vocale est terminée:

@Override
public void onInit(int status) {
    if (status == TextToSpeech.SUCCESS) {
        myTTS.setOnUtteranceProgressListener(new UtteranceProgressListener() {
            @Override
            public void onDone(String utteranceId) {
                // Log.d("MainActivity", "TTS finished");
            }

            @Override
            public void onError(String utteranceId) {
            }

            @Override
            public void onStart(String utteranceId) {
            }
        });
    } else {
        Log.e("MainActivity", "Initilization Failed!");
    }
}

http://www.codota.com/Android/scenarios/52fcbd34da0ae25e0f855408/Android.speech.tts.TextToSpeech?tag=dragonfly

18
kevinweber

J'ai remarqué qu'il y a des gens qui ont des problèmes dans l'utilisation de TextToSpeech pour vous demander la solution

Comment savoir quand TTS est terminé? sans utilisation setOnUtteranceCompletedListener

public void isTTSSpeaking(){

    final Handler h =new Handler();

    Runnable r = new Runnable() {

        public void run() {

            if (!tts.isSpeaking()) {
                onTTSSpeechFinished();
            }

            h.postDelayed(this, 1000);
        }
    };

    h.postDelayed(r, 1000);
}
5

Pour savoir quand TTS est terminé, vous devez appeler le setOnUtteranceProgressListener qui a 3 méthodes de rappel onStart, onDone et onError, puis inclure un identifiant d'utilité dans le parler méthode

Extrait de code

textToSpeech=new TextToSpeech(this, new TextToSpeech.OnInitListener() {
    @Override
    public void onInit(int status) {
        if (status==TextToSpeech.SUCCESS){
            int result=textToSpeech.setLanguage(Locale.ENGLISH);

            if (result==TextToSpeech.LANG_MISSING_DATA||result==TextToSpeech.LANG_NOT_SUPPORTED){
                Log.i("TextToSpeech","Language Not Supported");
            }

            textToSpeech.setOnUtteranceProgressListener(new UtteranceProgressListener() {
                @Override
                public void onStart(String utteranceId) {
                    Log.i("TextToSpeech","On Start");
                }

                @Override
                public void onDone(String utteranceId) {
                    Log.i("TextToSpeech","On Done");
                }

                @Override
                public void onError(String utteranceId) {
                    Log.i("TextToSpeech","On Error");
                }
            });

        }else {
            Log.i("TextToSpeech","Initialization Failed");
        }
    }
});


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
        textToSpeech.speak(text,TextToSpeech.QUEUE_FLUSH,null,TextToSpeech.ACTION_TTS_QUEUE_PROCESSING_COMPLETED);
    }
2
kelvin andre

Essayez ce code suivant qui montre un toast une fois TTS terminé. Remplacez le toast par votre propre action.

public class MainActivity extends AppCompatActivity implements TextToSpeech.OnInitListener{


private boolean initialized;
private String queuedText;
private String TAG = "TTS";
private TextToSpeech tts;




@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



    tts = new TextToSpeech(this /* context */, this /* listener */);
    tts.setOnUtteranceProgressListener(mProgressListener);


    speak("hello world");

}




public void speak(String text) {

    if (!initialized) {
        queuedText = text;
        return;
    }
    queuedText = null;

    setTtsListener(); // no longer creates a new UtteranceProgressListener each time
    HashMap<String, String> map = new HashMap<String, String>();
    map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "MessageId");
    tts.speak(text, TextToSpeech.QUEUE_ADD, map);
}


private void setTtsListener() {

}





@Override
public void onInit(int status) {
    if (status == TextToSpeech.SUCCESS) {
        initialized = true;
        tts.setLanguage(Locale.ENGLISH);

        if (queuedText != null) {
            speak(queuedText);
        }
    }
}



private abstract class runnable implements Runnable {
}




private UtteranceProgressListener mProgressListener = new UtteranceProgressListener() {
    @Override
    public void onStart(String utteranceId) {
    } // Do nothing

    @Override
    public void onError(String utteranceId) {
    } // Do nothing.

    @Override
    public void onDone(String utteranceId) {

        new Thread()
        {
            public void run()
            {
                MainActivity.this.runOnUiThread(new runnable()
                {
                    public void run()
                    {

                        Toast.makeText(getBaseContext(), "TTS Completed", Toast.LENGTH_SHORT).show();

                    }
                });
            }
        }.start();

    }
}; }
1
Mohammed Javad