0

Stringそれぞれ5つの文を含むsの数があります。今、私はこれらを一度に 1 つずつ Android Text To Speech に渡したいと思います。つまり、最初の String がエンジンに渡され、2 番目のテキストはエンジンが読み上げを完了すると渡されます。以下は私のコードです。

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

    }

残念ながら、今起きていることは予想外です。音声エンジンは、順番ではなく、あちこちからテキストを読み上げるだけです! 最初のテキストを話すことはありません。どこかからテキストを選んで読むだけです。なぜこうなった?

4

2 に答える 2

2

ttsのパラメータを変更したい

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

私のアプリケーションではうまくいきます。

于 2013-10-16T10:47:37.710 に答える
1

これには AsyncTask を使用する必要はありません。

クラスを実装するOnUtteranceCompletedListener

次のように TextToSpeech オブジェクトを開始します。

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

次に、textToSpeech オブジェクトが指定された文字列を終了するとonUtteranceCompleted、次の文があればそれを話すように textToSpeech オブジェクトに指示できるメソッドが呼び出されます。

QUEUE_ADDまたは、フラグの代わりにフラグを使用できますQUEUE_FLUSH。これにより、既存のテキストを新しいテキストに置き換えるのではなく、新しいテキストがキューの最後に追加されます。

お役に立てれば :)

于 2013-10-16T10:04:10.307 に答える