何时使用 UtteranceProgressListener
When to use the UtteranceProgressListener
我有一个带有两个 ImageButton 的 FrameLayout(Play、Stop)。默认
播放按钮是VISIBLE
,停止按钮是GONE
单击 播放 将启动读取文本的 TTS 引擎。阅读完文字后,我想设置
的可见性
播放到 GONE
,停止到 VISIBLE
我应该使用 UtteranceProgressListener 来达到目的吗?如果没有,
- 如何执行上述操作?
- UtteranceProgressListener 的用途是什么?
你的意思是:
- 阅读开始 -> 播放 消失并且 停止 可见
- 阅读结束-> 播放可见,停止消失
无论如何,UtteranceProgressListener
的目的正是您所描述的。用于监控语音合成进度。
您可以将 "utterance id"(此处为 "helloText")添加到任何说出的文本中:
tts.speak("Hello Stack Overflow!", TextToSpeech.QUEUE_ADD, "helloText");
但在你的情况下这并不是必需的,所以最后一个参数可以为 null:
tts.speak("Hello Stack Overflow!", TextToSpeech.QUEUE_ADD, null);
应该在调用speak()
之前添加UtteranceProgressListener
。例如,如果 TTS 状态为 TextToSpeech.SUCCESS
.
,您可以在 TTS 初始化回调 onInit()
中执行此操作
可以是一个单独的class或者只是一个匿名的内部class:
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()
后不久),因此这是切换可见按钮的一个可能位置。例如,Play 按钮可以切换为 Stop 按钮。
onDone()
方法在讲话结束时触发,这是另一个可以切换可见按钮的地方。例如,停止 按钮可以切换为 播放 按钮。
如您所见,如果您在 speak()
方法调用中提供了一个方法,则 "utterance id" 在两种方法中都可用。如果您需要确切地知道哪个文本 spoken/finished 被 spoken/failed 错误,这将很有用。
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();
}
};
}
我有一个带有两个 ImageButton 的 FrameLayout(Play、Stop)。默认
播放按钮是VISIBLE
,停止按钮是GONE
单击 播放 将启动读取文本的 TTS 引擎。阅读完文字后,我想设置
的可见性播放到 GONE
,停止到 VISIBLE
我应该使用 UtteranceProgressListener 来达到目的吗?如果没有,
- 如何执行上述操作?
- UtteranceProgressListener 的用途是什么?
你的意思是:
- 阅读开始 -> 播放 消失并且 停止 可见
- 阅读结束-> 播放可见,停止消失
无论如何,UtteranceProgressListener
的目的正是您所描述的。用于监控语音合成进度。
您可以将 "utterance id"(此处为 "helloText")添加到任何说出的文本中:
tts.speak("Hello Stack Overflow!", TextToSpeech.QUEUE_ADD, "helloText");
但在你的情况下这并不是必需的,所以最后一个参数可以为 null:
tts.speak("Hello Stack Overflow!", TextToSpeech.QUEUE_ADD, null);
应该在调用speak()
之前添加UtteranceProgressListener
。例如,如果 TTS 状态为 TextToSpeech.SUCCESS
.
onInit()
中执行此操作
可以是一个单独的class或者只是一个匿名的内部class:
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()
后不久),因此这是切换可见按钮的一个可能位置。例如,Play 按钮可以切换为 Stop 按钮。
onDone()
方法在讲话结束时触发,这是另一个可以切换可见按钮的地方。例如,停止 按钮可以切换为 播放 按钮。
如您所见,如果您在 speak()
方法调用中提供了一个方法,则 "utterance id" 在两种方法中都可用。如果您需要确切地知道哪个文本 spoken/finished 被 spoken/failed 错误,这将很有用。
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();
}
};
}