How to know when TTS is finished?

前端 未结 6 1033
臣服心动
臣服心动 2020-11-28 08:06

I\'m implementing an Interactive Voice Response application on Android. I would like to know how to determine when the tts.speak() function has done talking so

相关标签:
6条回答
  • 2020-11-28 08:24

    Try this following code which shows a toast after TTS completed. Replace toast with your own 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();
    
        }
    }; }
    
    0 讨论(0)
  • 2020-11-28 08:31

    I noticed that there are people having problems in the use of TextToSpeech to ask that the solution to you

    How to know when TTS is finished? without use 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);
    }
    
    0 讨论(0)
  • 2020-11-28 08:35

    use a SpeakableListener when do text to speak.

    private volatile boolean finished;
    
    private SpeakableListener listener = new SpeakableListener() {
    
        @Override
        public void markerReached(SpeakableEvent arg0) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void speakableCancelled(SpeakableEvent arg0) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void speakableEnded(SpeakableEvent arg0) {
            TestSpeaker.this.finished = true;
    
        }
    
        @Override
        public void speakablePaused(SpeakableEvent arg0) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void speakableResumed(SpeakableEvent arg0) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void speakableStarted(SpeakableEvent arg0) {
            TestSpeaker.this.finished = false;
    
        }
    
        @Override
        public void topOfQueue(SpeakableEvent arg0) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void wordStarted(SpeakableEvent arg0) {
            // TODO Auto-generated method stub
    
        }
    };
    
    /** Speak the following string. */
    public void sayIt(String str) {
        System.out.print(" " + str + " ");
        /* The the synthesizer to speak. */
        synthesizer.speakPlainText(str, listener);
    
    0 讨论(0)
  • 2020-11-28 08:48

    The setOnUtteranceCompletedListener is deprecated since API level 15. Instead, use setOnUtteranceProgressListener.

    I found a code snippet (here) that made it really easy for me to know when text to speech is finished:

    @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

    0 讨论(0)
  • 2020-11-28 08:49

    To know when TTS is finished you have to call the setOnUtteranceProgressListener which has 3 call back methods onStart,onDone and onError then include a Utterance Id to the speak method

    Code Snippet

    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);
        }
    
    0 讨论(0)
  • 2020-11-28 08:51
    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"
       }
    ...........
    }
    

    Read A good tutorial

    0 讨论(0)
提交回复
热议问题