Naveen
Naveen

Reputation: 1060

TTS and play sound - Android

I've a viewpager in my application. When the user swipes to the right/left I use TTS engine to speak the text and MediaPlayer to play a sound.

The problem is both plays simultaneously.. How do I play the sound once TTS engine speaks the text is over?

P.S: I don't want to use sleep or wait.

Update:

Here is my code:

@SuppressLint("NewApi")
@SuppressWarnings("deprecation")
@Override
public void onInit(int status) {
    if (status == TextToSpeech.SUCCESS) {

        if (result == TextToSpeech.LANG_MISSING_DATA
                || result == TextToSpeech.LANG_NOT_SUPPORTED) {
        } else {
            //Do Something here
        }


        if(Build.VERSION.SDK_INT  >= 15 ){
            UtteranceProgressListener listener = new UtteranceProgressListener() {

                @Override
                public void onStart(String utteranceId) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void onError(String utteranceId) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void onDone(String utteranceId) {
                    // TODO Auto-generated method stub
                    //start MediaPlayer
                    playMedia(viewPager.getCurrentItem());
                }
            };
            tts.setOnUtteranceProgressListener(listener);
        }
        else{
            tts.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener(){

                @Override
                public void onUtteranceCompleted(String arg0) {
                     playMedia(viewPager.getCurrentItem());
                }

              });
        }
    } else {
        Intent installIntent = new Intent();
        installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
        startActivity(installIntent);
    }
}

Upvotes: 1

Views: 1709

Answers (2)

maxweber
maxweber

Reputation: 576

You have to give it an id param. Otherwise it doesn't call the listeners:

HashMap<String, String> params = new HashMap<String, String>();
params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,"stringId");

textToSpeech.speak(string,TextToSpeech.QUEUE_ADD, params);

Upvotes: 6

Mr.Me
Mr.Me

Reputation: 9276

In android their are two APIs to detect if the TTS engine finished speaking:

  • > Android 4 (ICS)

    UtteranceProgressListener listener = new UtteranceProgressListener() {
    
        @Override
        public void onStart(String utteranceId) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void onError(String utteranceId) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void onDone(String utteranceId) {
            // TODO Auto-generated method stub
            //start MediaPlayer
        }
    };
        yourTTSObject.setOnUtteranceProgressListener(listener);
    
  • Perior to ICS Android 4.0 you can use :

    yourTTSObject.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener(){
    
        @Override
        public void onUtteranceCompleted(String arg0) {
              // start your mediaplayer here
        }
    
      });
    

    take a look at the documentations here

Upvotes: 2

Related Questions