Как начать распознавание речи, как только текст прекратится. - PullRequest
0 голосов
/ 19 сентября 2018

Я хочу начать распознавание речи, как только остановится текст в речь.Ниже приведены шаги, которые я предпринял.

Шаг 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 голосов
/ 19 сентября 2018

Как сказал @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);

    }
0 голосов
/ 19 сентября 2018

Метод onDone относится к конкретному высказыванию.Это означает, что если вы выполняете несколько (непрерывных) вызовов метода mTTS.speak, onDone вызывается каждый раз.Что, очевидно, может вызвать серьезные проблемы с тем, чего вы пытаетесь достичь.

Когда мне нужно было выполнить действия после завершения TTS, я бы создал переменную наподобие lastUtteranceId, установил для нее последнее высказывание в очереди и проверил на наличиесовпадение внутри onDone вроде:

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

Кроме того, вызывать завершение работы там кажется плохой идеей.Вы должны вызывать его в методе onDestroy вашей деятельности.

В заключение, я думаю, что onDone работает в фоновом потоке, а startListening должен быть в основном потоке, поэтому проверьте это тоже.

...