TextToSpeech OnUtteranceCompletedListener导致延迟



我需要TextToSpeech引擎一个接一个地说出我的单词,我试图抓住说一个单词的结束,开始说下一个单词。但是OnUtteranceCompletedListener造成了演讲的延迟。所以我的问题是,我怎样才能解决这个问题,或者更好地实现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);
                }
            }); 
        }
    };
}

您可以通过在每次运行中不重新创建OnUtteranceCompleteListener来加快速度

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);
    }
};

此外,您可以使用onUtteranceCompleted方法来调用speak()方法,而不是使用Runnable来通过处理程序调用引擎的speek()方法

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);
    }
};

如果不支持Locale.getDefault()语言或需要数据文件,您的代码将失败。此外,如果onInit()在按下btnSpeak后没有返回300 ms,则speak()将不起作用。您应该在xml布局文件中禁用btnSpeak,并在onInit中启用它。在btnSpeak listener循环中通过words调用speak()

btnSpeak = (Button) findViewById(R.id.btnSpeak);
    btnSpeak.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            for (int i = 0; i < words.length; i++) {
                tts.speak(text, 1, myHash);
                // call playSilence (long durationInMs, 1, myHash) 
                // if you want a slight delay between each word.
            }
        }
    });

最新更新