我想知道在使用Text to speech时是否有办法将Toast用作CC(字幕)。 问题不在于可以同时显示的特定文本,而是在正确的时间显示CC 我认为TTS队列可以提供帮助,但无法弄清楚它是如何工作的。
TIA! 米尔顿
修改1 我想使用Toast作为字幕(CC)。在toast msg。
中显示发送给tts的相同文本 编辑2
好的,让我解释一下这个想法:假设我有一个来自服务的文本,并且我将从该服务中获得的每个文本排入队列,并向用户发出os语音。那没关系,而且很有效。现在我想添加tts所说的字幕。假设我有来自服务的3个文本["This is the first text", "This is the second text", "This is the third text"]
,我将它排入tts。操作系统会一次一个地说出来。但是,如果我对吐司做同样的事情,那么我能看到的唯一一个就是最后一个,因为吐司不排队消息,一个吐司会覆盖前一个。也许有一种方法可以将消息排入队列,这就是解决方案。所以,我想在一段时间内展示吐司(带有排队的文字),我可以根据tts的速度和文字长度进行估算。现在更有意义吗?
答案 0 :(得分:2)
您可以通过将UtteranceProgressListener
与我的Boast
课程相结合,在API 15+上执行此操作。
Boast
是Toast
的替代品,可以取消当前的Toast或替换当前的Toast。这意味着祝酒词不会排队,但会准确显示你想要的时间。
如何知道何时展示它们?
API 15+为我们提供了您可以在TextToSpeech
个实例上设置的UtteranceProgressListener
:
使用UtteranceProgressListener.onStart()
方法触发CC Boast
播放。请注意,需要在主(UI)线程上调用Boast
或Toast
。
下面的一些代码片段应该说明这个想法。
我打电话给我的主要活动SubtitleTextToSpeechDemo
。通过在onCreate()
中发送正确的意图来检查TTS:
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// check to TTS
Intent ttsInstallCheck = new Intent();
ttsInstallCheck.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(ttsInstallCheck, TTS_REQUEST_CODE);
}
此代码将返回TtsDemoActivity
中的onActivityResult()
。在这里,我们设置监听器以显示Boast
并记录话语:
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (TTS_REQUEST_CODE == requestCode)
{
if (TextToSpeech.Engine.CHECK_VOICE_DATA_PASS == resultCode)
{
tts = new TextToSpeech(this, this);
tts.setOnUtteranceProgressListener(new UtteranceProgressListener()
{
@Override
public void onStart(final String utteranceId)
{
SubtitleTextToSpeechDemo.this.runOnUiThread(new Runnable()
{
public void run()
{
Boast.showText(TtsDemoActivity.this, utteranceId, Toast.LENGTH_LONG);
}
});
Log.d("mobiRic", "start: " + utteranceId);
}
@Override
public void onError(String utteranceId)
{
}
@Override
public void onDone(String utteranceId)
{
}
});
}
else
{
// not installed
}
}
}
为了开始说话,我通过OnInitListener
回调拨打电话:
/**
* TextToSpeech.OnInitListener callback is called when the TTS engine has initialised.
*/
public void onInit(int i)
{
doSpeak("Hello Milton");
doSpeak("Here is the answer");
doSpeak("each utterance triggers the listener");
doSpeak("so you can Boast about it");
}
方法doSpeak()
只是一个辅助方法,因为我们需要将HashMap
个参数传递给每个调用,以便识别每个话语。为方便起见,我使用实际文本作为键:
private void doSpeak(String text)
{
HashMap<String, String> params = new HashMap<String, String>();
// use the actual text as the key to ID the utterance
params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, text);
tts.speak(text, TextToSpeech.QUEUE_ADD, params);
}
我应该赞扬James Elsey在github上的演示TTS项目,该项目向我展示了样板TTS设置代码:
我已将完整的工作代码上传到这个要点: