Подтвердить что ты не робот

Как узнать, когда TTS завершена?

Я использую приложение интерактивного голосового ответа на Android. Я хотел бы знать, как определить, когда была выполнена функция tts.speak(), чтобы я мог вызвать функцию распознавания речи.

4b9b3361

Ответ 1

public class TTSActivity extends Activity implements OnInitListener, OnUtteranceCompletedListener, ... {
private TextToSpeech mTts;
...........
private void speak(String text) {
   if(text != null) {
      HashMap<String, String> myHashAlarm = new HashMap<String, String>();
      myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_ALARM));
      myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "SOME MESSAGE");
      mTts.speak(text, TextToSpeech.QUEUE_FLUSH, myHashAlarm);
   }
}
// Fired after TTS initialization
public void onInit(int status) {
    if(status == TextToSpeech.SUCCESS) {
        mTts.setOnUtteranceCompletedListener(this);
    }
}
// It callback
public void onUtteranceCompleted(String utteranceId) {
   Log.i(TAG, utteranceId); //utteranceId == "SOME MESSAGE"
   }
...........
}

Прочитайте Хороший учебник

Ответ 2

Функция setOnUtteranceCompletedListener устарела с уровня API 15. Вместо этого используйте setOnUtteranceProgressListener.

Я нашел фрагмент кода (здесь), который очень помог мне узнать, когда текст в речь закончен:

@Override
public void onInit(int status) {
    if (status == TextToSpeech.SUCCESS) {
        myTTS.setOnUtteranceProgressListener(new UtteranceProgressListener() {
            @Override
            public void onDone(String utteranceId) {
                // Log.d("MainActivity", "TTS finished");
            }

            @Override
            public void onError(String utteranceId) {
            }

            @Override
            public void onStart(String utteranceId) {
            }
        });
    } else {
        Log.e("MainActivity", "Initilization Failed!");
    }
}

http://www.codota.com/android/scenarios/52fcbd34da0ae25e0f855408/android.speech.tts.TextToSpeech?tag=dragonfly

Ответ 3

Я заметил, что есть люди, имеющие проблемы с использованием TextToSpeech, чтобы спросить, что решение для вас

Как узнать, когда TTS завершена? без использования setOnUtteranceCompletedListener

public void isTTSSpeaking(){

    final Handler h =new Handler();

    Runnable r = new Runnable() {

        public void run() {

            if (!tts.isSpeaking()) {
                onTTSSpeechFinished();
            }

            h.postDelayed(this, 1000);
        }
    };

    h.postDelayed(r, 1000);
}

Ответ 4

используйте SpeakableListener, когда текст должен говорить.

private volatile boolean finished;

private SpeakableListener listener = new SpeakableListener() {

    @Override
    public void markerReached(SpeakableEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void speakableCancelled(SpeakableEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void speakableEnded(SpeakableEvent arg0) {
        TestSpeaker.this.finished = true;

    }

    @Override
    public void speakablePaused(SpeakableEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void speakableResumed(SpeakableEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void speakableStarted(SpeakableEvent arg0) {
        TestSpeaker.this.finished = false;

    }

    @Override
    public void topOfQueue(SpeakableEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void wordStarted(SpeakableEvent arg0) {
        // TODO Auto-generated method stub

    }
};

/** Speak the following string. */
public void sayIt(String str) {
    System.out.print(" " + str + " ");
    /* The the synthesizer to speak. */
    synthesizer.speakPlainText(str, listener);