这是我的代码,
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
initialized = true;
tts.setLanguage(Locale.ENGLISH);
if (queuedText != null) {
speak(queuedText);
}
}
}
public void speak(String text) {
// If not yet initialized, queue up the text.
if (!initialized) {
queuedText = text;
return;
}
queuedText = null;
// Before speaking the current text, stop any ongoing speech.
tts.stop();
// Speak the text.
tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}
我正在调用这样的发言功能,
speak("ten");
speak("nine");
我只能听到九个。我正在尝试实施一个计数器,我将在通话之间添加延迟。
答案 0 :(得分:2)
关于你如何按顺序说话,大致有两个相关的问题:
tts.speak()是一个异步操作。它实际上并没有在那时进行音频,而是将其排队以供音频系统播放。它通常不久后播放,但不能保证它会立即开始说话。
调用tts.stop()会停止当前正在进行的任何发言,并且使用QUEUE_FLUSH意味着任何尚未播放的文字都不会被播放。因此,如果您在speak("nine")
之后立即致电speak("ten")
,那么"九"立即删除" ten"从队列中。
您有几个选择,因为我不知道哪一个会最符合您的需求。
所以将代码改为这样的代码应该有效:
public void speak(String text) {
// If not yet initialized, queue up the text.
if (!ttsInitialized) {
queuedText = text;
return;
}
queuedText = null;
// Before speaking the current text, stop any ongoing speech.
//tts.stop();
// Speak the text.
tts.speak(text, TextToSpeech.QUEUE_ADD, null);
}
执行此操作的代码可能类似于
private void countdown( final int start ){
speak( ""+start );
if( start > 0 ){
Handler handler = new Handler();
handler.postDelayed( new Runnable(){
@Override
public void run(){
countdown( start-1 );
}
}, 1000 );
}
}
并通过
进行调用countdown(10);