使用吐司作为CC与文本到语音

时间:2014-05-21 15:35:51

标签: android text-to-speech

我想知道在使用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的速度和文字长度进行估算。现在更有意义吗?

1 个答案:

答案 0 :(得分:2)

您可以通过将UtteranceProgressListener与我的Boast课程相结合,在API 15+上执行此操作。

BoastToast的替代品,可以取消当前的Toast或替换当前的Toast。这意味着祝酒词不会排队,但会准确显示你想要的时间。

如何知道何时展示它们?

API 15+为我们提供了您可以在TextToSpeech个实例上设置的UtteranceProgressListener

使用UtteranceProgressListener.onStart()方法触发CC Boast播放。请注意,需要在主(UI)线程上调用BoastToast

下面的一些代码片段应该说明这个想法。


我打电话给我的主要活动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设置代码:

我已将完整的工作代码上传到这个要点: