由于我的文本长度超过 TTS 的 4000 个字符限制,我将字符串划分为更多部分,并将这些部分循环添加到 tts 队列中,例如:
int pos = 0;
while(true) {
String var = "";
try {
var = str.substring(pos, 3999);
pos += 3999;
} catch(Exception e) {
var = str.substring(pos, str.length());
break;
}
Bundle params = new Bundle();
params.putString(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "");
tts.speak(var, TextToSpeech.QUEUE_ADD, params, "myID");
}
但是这有效,但是在演讲结束后,我需要再次更改停止按钮以进行播放按钮。我正在 onDone(( 中更改此按钮。
tts.setOnUtteranceProgressListener(new UtteranceProgressListener() {
@Override
public void onDone(String utteranceId) {
Log.d("Speak", "TTS finished");
runOnUiThread(new Runnable() {
public void run() {
Button view2 = findViewById(R.id.speech);
view2.setCompoundDrawablesWithIntrinsicBounds(R.drawable.play, 0, 0, 0);
}
});
}
@Override
public void onError(String utteranceId) {
}
@Override
public void onStart(String utteranceId) {
}
});
问题是,onDone 在每个队列完成后调用。因此,如果队列中有更多部分,则会多次调用 onDone。我无法确定何时处理最后一个队列,以便何时更改按钮。
我想我已经找到了一个解决方案 - 通过在
tts.speak(var, TextToSpeech.QUEUE_ADD, params, id1);
在下一个条件 ID2 中。然后签入完成话语 ID 并据此更改按钮。
似乎工作得很好。