Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在文本到语音转换停止后立即启动语音识别。_Android_Speech Recognition_Text To Speech - Fatal编程技术网

Android 如何在文本到语音转换停止后立即启动语音识别。

Android 如何在文本到语音转换停止后立即启动语音识别。,android,speech-recognition,text-to-speech,Android,Speech Recognition,Text To Speech,我想在文本到语音转换停止后立即启动语音识别。 以下是我采取的步骤 步骤1:初始化语音识别 mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this); mSpeechRecognizer.setRecognitionListener(recognitionListener); mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_R

我想在文本到语音转换停止后立即启动语音识别。 以下是我采取的步骤

步骤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.");
                }

            }
        }
    });
第三步:初始化话语监听器,检查语音是否完成

    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);用于启动语音识别,但不启动语音识别。
请调查这个问题。

onDone方法指的是一种特定的话语。这意味着,如果对mTTS.speak方法执行多个(连续)调用,则每次都会调用onDone。这显然会给你的目标带来严重的问题

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

if (utteranceId.equals(lastUtteranceId) {
   // TTS finished talking...
}
而且,在那里叫停似乎是个坏主意。您应该在活动的onDestroy方法中调用它


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

onDone方法引用了一个特定的语句。这意味着,如果对mTTS.speak方法执行多个(连续)调用,则每次都会调用onDone。这显然会给你的目标带来严重的问题

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

if (utteranceId.equals(lastUtteranceId) {
   // TTS finished talking...
}
而且,在那里叫停似乎是个坏主意。您应该在活动的onDestroy方法中调用它


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

正如@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);

    }

正如@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);

    }