在同时执行STT和TTS的服务中不调用UtteranceProgressListener

时间:2017-12-05 13:01:53

标签: android text-to-speech

我需要在同一个应用程序中执行STT和TTS。 STT按预期工作。 TTS部分工作到正确读出文本的程度。但是,麦克风拾取TTS读取的文本,然后再次执行STT。

所以,我们有一个循环,TTS一次又一次地重复声音,即使用户说了一次。

为了避免这个问题,我尝试从UtteranceProgressListener执行麦克风的静音/取消静音。整个功能在服务中定义。

我在" onCreate()"中有以下代码服务方法。

    @Override
public void onCreate() {
    super.onCreate();
    context = getApplicationContext();
    VoiceRecognitionListener.getInstance().setListener(this); // Here we set the current listener

    // TTS initialization
    tts = new TextToSpeech(this, this);

    UtteranceProgressListener upListener = new UtteranceProgressListener()
    {
        public void enableMic(String s)
        {
            if(s.contains(UTTERANCE_ID)) {
                AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
                // Unmute the microphone
                Toast.makeText(context, "Unmuting the mic", Toast.LENGTH_LONG).show();
                audioManager.setMicrophoneMute(false);
            }
            return;
        }

        public void disableMic(String s)
        {
            if(s.equals(UTTERANCE_ID)) {
                AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
                // Unmute the microphone
                Toast.makeText(context, "Muting the mic", Toast.LENGTH_LONG).show();
                audioManager.setMicrophoneMute(true);
            }
            return;
        }

        @Override
        public void onStart(String s) {
            disableMic(s);
        }

        @Override
        public void onDone(String s) {
            enableMic(s);
        }

        @Override
        public void onStop(String s, boolean i) {
            enableMic(s);
        }

        @Override
        public void onError(String s) {
            enableMic(s);
        }

        @Override
        public void onError(String s, int e) {
            enableMic(s);
        }

        @Override
        public void onBeginSynthesis(String s, int sampleRateInHz, int audioFormat, int channelCount)
        {
            disableMic(s);
        }
    };
    tts.setOnUtteranceProgressListener(upListener);
}

以下方法调用TTS发言方法。

    public int speakOut(String text, String utteranceId)
{
    int rc = 0; // Return code
    try
    {
        Bundle params = new Bundle();
        params.putString(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, utteranceId);
        rc = tts.speak(text, TextToSpeech.QUEUE_FLUSH, params, utteranceId);
    }
    catch(RuntimeException r) {
        Toast.makeText(context, r.getMessage(), Toast.LENGTH_LONG).show();
    }
    return rc;
}

请帮助您提出建议。如果需要,我可以提供更多细节。

0 个答案:

没有答案