【问题标题】:How to start Speech Recognition as Soon the Text To Speech stops.如何在文本到语音停止后立即开始语音识别。
【发布时间】:2018-09-19 07:54:45
【问题描述】:

我想在 Text To Speech 停止后立即启动语音识别。 以下是我采取的步骤。

第 1 步:初始化语音识别。

    mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
    mSpeechRecognizer.setRecognitionListener(recognitionListener);

    mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
            RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE,
            Locale.getDefault());

第 2 步:初始化文本到语音。

    TextToSpeech myTTS = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
        @Override
        public void onInit(int status) {
            if(myTTS.getEngines().size() == 0){
                Toast.makeText(Robo.this,"No Engines Installed",Toast.LENGTH_LONG).show();
            }else{


                if (status == TextToSpeech.SUCCESS){
                    //Toast.makeText(MainActivity.this,"Status working.",Toast.LENGTH_LONG).show();
                    //message = "How may i help you.";
                    myTTS.setLanguage(Locale.US);
                    ttsInitialized();
                    speak("what is your name.");
                }

            }
        }
    });

第 3 步:初始化 Utterance Listener 以检查语音是否完成。

    myTTS.setOnUtteranceProgressListener(new UtteranceProgressListener() {
        @Override
        public void onStart(String utteranceId) {

        }

        @Override
        public void onDone(String utteranceId) {

            //btn.performClick();
            myTTS.shutdown();
            mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
        }

        @Override
        public void onError(String utteranceId) {

        }
    });

在 onDone() 方法中的 mSpeechRecognizer.startListening(mSpeechRecognizerIntent);用于启动语音识别,但不启动语音识别。 请检查问题。

【问题讨论】:

    标签: android speech-recognition text-to-speech


    【解决方案1】:

    onDone 方法指的是特定的话语。这意味着如果您对 mTTS.speak 方法执行多次(连续)调用,则每次都会调用 onDone。这显然会导致您想要实现的目标出现严重问题。

    当我必须在 TTS 完成后执行操作时,我会创建一个类似 lastUtteranceId 的变量,将其设置为最后一个排队的话语并检查 onDone 中的匹配项,例如:

    if (utteranceId.equals(lastUtteranceId) {
       // TTS finished talking...
    }
    

    另外,在那里调用关机似乎是个坏主意。您应该在 Activity 的 onDestroy 方法中调用它。

    最后,我认为 onDone 在后台线程上运行,而 startListening 需要在主线程上,所以也要检查一下。

    【讨论】:

      【解决方案2】:

      正如@Regulus 所说,我添加了一个处理程序并且它起作用了。

          @Override
          public void onDone(String utteranceId) {
      
              Handler mainHandler = new Handler(Looper.getMainLooper());
                  Runnable myRunnable = new Runnable() {
                      @Override
                      public void run() {
                          mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
                      } // This is your code
                  };
                  mainHandler.post(myRunnable);
      
          }
      

      【讨论】:

        猜你喜欢
        • 2016-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        • 2016-12-04
        • 1970-01-01
        相关资源
        最近更新 更多