我有一个带有两个ImageButtons的FrameLayout(播放,停止)。默认情况下
播放按钮为VISIBLE
,停止按钮为GONE
单击播放启动读取文本的TTS引擎。在阅读完文本后,我想设置
的可见性播放至GONE
,停至VISIBLE
我应该使用UtteranceProgressListener来达到目的吗?如果没有,
答案 0 :(得分:7)
您是否意味着:
无论如何,UtteranceProgressListener
的目的正是你所描述的。它用于监控语音合成的进度。
您可以在任何说出的文字中添加“话语ID”(此处为“helloText”):
tts.speak("Hello Stack Overflow!", TextToSpeech.QUEUE_ADD, "helloText");
但是在你的情况下这并不是必需的,所以最后一个参数可以为null:
tts.speak("Hello Stack Overflow!", TextToSpeech.QUEUE_ADD, null);
应在调用UtteranceProgressListener
之前添加speak()
。如果TTS状态为onInit()
,您可以在TTS初始化回调TextToSpeech.SUCCESS
中执行此操作。
它可以是一个单独的类,也可以只是一个匿名的内部类:
speech.setOnUtteranceProgressListener(new UtteranceProgressListener() {
@Override
public void onStart(String utteranceId) {
// Speaking started.
}
@Override
public void onDone(String utteranceId) {
// Speaking stopped.
}
}
@Override
public void onError(String utteranceId) {
// There was an error.
}
});
语音开始时(呼叫onStart()
后不久)会触发speak()
方法,以便切换可见按钮。例如,播放按钮可以切换到停止按钮。
语音结束时会触发onDone()
方法,这是切换可见按钮的另一个可能位置。例如,停止按钮可以切换到播放按钮。
正如您所看到的那样,如果您在speak()
方法调用中提供了一个“话语ID”,则可以使用“话语ID”。如果您需要确切地知道正在讲话/完成哪些文本/因错误而失败,那将非常有用。
答案 1 :(得分:3)
UtteranceProgressListener可用于识别TTS何时完成。请尝试以下代码,该代码显示TTS完成后的祝酒词。
public class MainActivity extends AppCompatActivity implements TextToSpeech.OnInitListener{
private boolean initialized;
private String queuedText;
private String TAG = "TTS";
private TextToSpeech tts;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tts = new TextToSpeech(this /* context */, this /* listener */);
tts.setOnUtteranceProgressListener(mProgressListener);
speak("hello world");
}
public void speak(String text) {
if (!initialized) {
queuedText = text;
return;
}
queuedText = null;
setTtsListener(); // no longer creates a new UtteranceProgressListener each time
HashMap<String, String> map = new HashMap<String, String>();
map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "MessageId");
tts.speak(text, TextToSpeech.QUEUE_ADD, map);
}
private void setTtsListener() {
}
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
initialized = true;
tts.setLanguage(Locale.ENGLISH);
if (queuedText != null) {
speak(queuedText);
}
}
}
private abstract class runnable implements Runnable {
}
private UtteranceProgressListener mProgressListener = new UtteranceProgressListener() {
@Override
public void onStart(String utteranceId) {
} // Do nothing
@Override
public void onError(String utteranceId) {
} // Do nothing.
@Override
public void onDone(String utteranceId) {
new Thread()
{
public void run()
{
MainActivity.this.runOnUiThread(new runnable()
{
public void run()
{
Toast.makeText(getBaseContext(), "TTS Completed", Toast.LENGTH_SHORT).show();
}
});
}
}.start();
}
};
}