读取TTS中“字符串”的数量

时间:2013-10-16 09:46:50

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

我有String个,每个包含5个句子。现在,我想将它们一个接一个地传递给android Text To Speech。这意味着,第一个String传递给引擎,第二个文本应该在引擎完成说话后传递。以下是我的代码。

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;
        }

    }

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

2 个答案:

答案 0 :(得分:2)

您想要更改tts的参数

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

在我的申请工作中。

答案 1 :(得分:1)

您不需要使用AsyncTask。

让您的班级实施OnUtteranceCompletedListener

启动TextToSpeech对象,如下所示:

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

然后,一旦你的textToSpeech对象完成一个给定的字符串,它就会调用onUtteranceCompleted方法,你可以告诉你的textToSpeech对象如果有的话就说下一句话。

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

希望这会有所帮助:)