3

単語を 1 つずつ読み上げるには、TextToSpeech エンジンが必要です。1 つの単語の読み上げをキャッチして、次の単語を読み上げようとしています。しかし、OnUtteranceCompletedListenerスピーチのいくつかの遅延を引き起こします。だから私の質問は、どうすればこれを修正したり、のより良い実装を行うことができ OnUtteranceCompletedListenerますか?

public class AndroidTextToSpeechActivity extends Activity implements TextToSpeech.OnInitListener {

    int result = 0, CURRENT_WORD = 0;
    HashMap<String, String> myHash;
    String[] words;
    Button btnSpeak;
    TextToSpeech tts;
    Handler hand = new Handler();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        text = "Hi there how are you";
        words = text.split(" ", 50);
        myHash = new HashMap<String, String>();
        tts = new TextToSpeech(this, this);

        btnSpeak = (Button) findViewById(R.id.btnSpeak);
        btnSpeak.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                hand.postDelayed(run, 300);
            }
        });
    }

    @Override
    public void onInit(int status) {
        if (status == TextToSpeech.SUCCESS) {
            result = tts.setLanguage(Locale.getDefault());
            tts.setPitch(1f);
            tts.setSpeechRate(1f);
        } else
            Log.e("TTS", "Init failed");
    }

    Runnable run = new Runnable() {
        public void run() {
            text = words[CURRENT_WORD];
            tts.speak(text, 1, myHash);
            tts.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener() {

                @Override
                public void onUtteranceCompleted(String utteranceId) {
                    CURRENT_WORD++;
                    hand.post(run1);
                }
            }); 
        }
    };

}
4

2 に答える 2

0

Locale.getDefault()言語がサポートされていない場合、またはデータ ファイルが必要な場合、コードは失敗します。また、をonInit()押してから 300 ms 経過しないと機能しません。xml レイアウト ファイルで無効にし、 で有効にする必要があります。ループスルーと呼び出しbtnSpeakspeak()btnSpeakonInitbtnSpeak listenerwordsspeak()

btnSpeak = (Button) findViewById(R.id.btnSpeak);
    btnSpeak.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            for (int i = 0; i < words.length; i++) {
                tts.speak(text, 1, myHash);
                // call playSilence (long durationInMs, 1, myHash) 
                // if you want a slight delay between each word.
            }
        }
    });
于 2014-03-19T03:40:01.453 に答える