文本到语音停止后,如何开始语音识别。

时间:2018-09-19 07:54:45

标签: android speech-recognition 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步:初始化语音监听器以检查语音是否完成。

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

2 个答案:

答案 0 :(得分:2)

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

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

Could not get properties: Connection timed out

此外,在那里调用shutdown似乎是一个坏主意。您应该在活动的onDestroy方法上调用它。

关于最后一件事,我认为onDone在后台线程上运行,而startListening必须在主线程上,因此也应进行检查。

答案 1 :(得分:0)

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

    }