【问题标题】:Reading Number of "Strings" in TTS在 TTS 中读取“字符串”的数量
【发布时间】:2013-10-16 09:46:50
【问题描述】:

我有多个Strings,每个包含 5 个句子。现在,我想一次一个地将这些传递给 android Text To Speech。这意味着,第一个字符串被传递给引擎,第二个文本应该在引擎完成讲话后传递。下面是我的代码。

List<String>textCollection = new ArrayList<String>();

//Add sentences to 'textCollection '. Code removed//

for(int i=0;i<textCollection.size();i++)
{
    while(tts.isSpeaking())
    {

     }

    Toast.makeText(Talk.this, ""+i, Toast.LENGTH_LONG).show();

    new SpeakTheText().execute(textCollection.get(i));

}

//This class will speak the text
    private class SpeakTheText extends AsyncTask<String,Void,String>
    {

        @Override
        protected String doInBackground(String... params) {
            // TODO Auto-generated method stub

            tts.speak(params[0], TextToSpeech.QUEUE_FLUSH, null);
            return null;
        }

    }

不幸的是,现在发生的事情是出乎意料的。语音引擎只是从这里和那里说出文本,而不是按顺序!它从不说出第一个文本,只是从某个地方选择一个文本并阅读它。为什么会这样?

【问题讨论】:

    标签: java android for-loop while-loop text-to-speech


    【解决方案1】:

    你想改变 tts 的参数

    tts.speak(params[0], TextToSpeech.QUEUE_ADD, null);
    

    在我的应用程序中运行良好。

    【讨论】:

    • TextToSpeech.QUEUE_FLUSH 删除这个。
    【解决方案2】:

    您不需要为此使用 AsyncTask。

    让你的班级实现OnUtteranceCompletedListener

    像这样启动您的 TextToSpeech 对象:

    textToSpeech = new TextToSpeech(context, this); // this being the class that implements OnUtteranceCompletedListener.
    

    然后,一旦您的 textToSpeech 对象完成给定的字符串,它将调用onUtteranceCompleted 方法,您可以在该方法中告诉您的 textToSpeech 对象说出下一个句子(如果有的话)。

    或者,您可以使用QUEUE_ADD 标志代替QUEUE_FLUSH 标志。这会将新文本添加到队列的末尾,而不是用新文本替换现有文本。

    希望这会有所帮助:)

    【讨论】:

    • 非常感谢您的回复。你能给我提供一个更清晰的代码示例吗?队列添加可能不起作用,因为文本将超过 4000 个字符(最大 TTS 字符数)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 2011-04-15
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多