Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TextToSpeech OnUtteranceCompletedListener causes delay

I need the TextToSpeech engine to speak my words one by one, and I am trying to catch the end of speaking of one word to start speaking the next one. But the OnUtteranceCompletedListener cause some delay of the speech. So my question is, how can I fix this or make a better implementation of the OnUtteranceCompletedListener?

public class AndroidTextToSpeechActivity extends Activity implements TextToSpeech.OnInitListener {

    int result = 0, CURRENT_WORD = 0;
    HashMap<String, String> myHash;
    String[] words;
    Button btnSpeak;
    TextToSpeech tts;
    Handler hand = new Handler();

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

        text = "Hi there how are you";
        words = text.split(" ", 50);
        myHash = new HashMap<String, String>();
        tts = new TextToSpeech(this, this);

        btnSpeak = (Button) findViewById(R.id.btnSpeak);
        btnSpeak.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                hand.postDelayed(run, 300);
            }
        });
    }

    @Override
    public void onInit(int status) {
        if (status == TextToSpeech.SUCCESS) {
            result = tts.setLanguage(Locale.getDefault());
            tts.setPitch(1f);
            tts.setSpeechRate(1f);
        } else
            Log.e("TTS", "Init failed");
    }

    Runnable run = new Runnable() {
        public void run() {
            text = words[CURRENT_WORD];
            tts.speak(text, 1, myHash);
            tts.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener() {

                @Override
                public void onUtteranceCompleted(String utteranceId) {
                    CURRENT_WORD++;
                    hand.post(run1);
                }
            }); 
        }
    };

}
like image 591
eevan2go Avatar asked May 24 '26 20:05

eevan2go


1 Answers

You can speed it up by not recreating the OnUtteranceCompleteListener in each run

OnUtteranceCompletedListener listener=new OnUtteranceCompletedListener(){
    @Override
    public void onUtteranceCompleted(String utteranceId) {
        CURRENT_WORD++;
        hand.post(run1);
    }
}
tts.setOnUtteranceCompletedListener(listener);
Runnable run = new Runnable() {
    public void run() {
        text = words[CURRENT_WORD];
        tts.speak(text, 1, myHash);
    }
};

Furthamore, instead of using a Runnable to call the speek() method of the engine through a handler, you can use the onUtteranceCompleted method to call the speak() method

OnUtteranceCompletedListener listener=new OnUtteranceCompletedListener(){
    @Override
    public void onUtteranceCompleted(String utteranceId) {
        CURRENT_WORD++;
        if(CURRENT_WORD<max_words){
            String text=words[CURRENT_WORD];
            tts.speak(text,1,myHash);
        }
    }
}
tts.setOnUtteranceCompletedListener(listener);
Runnable run = new Runnable() {
    public void run() {
        text = words[CURRENT_WORD];
        tts.speak(text, 1, myHash);
    }
};
like image 178
Blagoj Atanasovski Avatar answered May 26 '26 09:05

Blagoj Atanasovski