Как предотвратить Android SpeechRecognizer от шума после уничтожения? - PullRequest
3 голосов
/ 28 апреля 2020

Я использую android.speech.SpeechRecognizer и у меня возникла проблема, когда он издает характерный лязглый звук даже после того, как я назвал его методы stopListening(), cancel() и destroy().

Вот как я создаю и уничтожаю SpeechRecognizer в MainActivity.kt.

private fun startSpeechRecognition() {
    Log.e(TAG, "At start of startSpeechRecognition()")
    if (recognizer == null) {
        recognizer = SpeechRecognizer.createSpeechRecognizer(this)
        Log.e(TAG, "Creating new recognizer: $recognizer")
        recognizer?.setRecognitionListener(Listener())
    }
    val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
    intent.putExtra(
        RecognizerIntent.EXTRA_LANGUAGE_MODEL,
        RecognizerIntent.LANGUAGE_MODEL_FREE_FORM
    )
    Log.e(TAG, "Starting listening")
    recognizer?.startListening(intent)
}

private fun closeRecognizer() {
    Log.e(TAG, "At start of closeRecognizer()")
    recognizer?.run {
        Log.e(TAG, "Stopping recognizer: $this")
        stopListening()
        cancel()
        destroy()
        recognizer = null
    } ?: Log.e(TAG, "Recognizer already null")
}

Вот мой журнал:

E/voice.assistan: Unknown bits set in runtime_flags: 0x8000
E/MainActivity: At start of closeRecognizer()
E/MainActivity: Recognizer already null
E/MainActivity: At start of startSpeechRecognition()
E/MainActivity: Creating new recognizer: android.speech.SpeechRecognizer@573d161
E/MainActivity: Starting listening
E/MainActivity: At start of closeRecognizer()
E/MainActivity: Stopping recognizer: android.speech.SpeechRecognizer@573d161
E/SpeechRecognizer: not connected to the recognition service
E/SpeechRecognizer: not connected to the recognition service
E/MainActivity: At start of closeRecognizer()
E/MainActivity: Recognizer already null

I Я тестирую код на Pixel 2, работающем Android 10, и компилирую с minSdkVersion 21 и targetSdkVersion 28.

Может кто-нибудь сказать мне, что я могу делать неправильно или, если есть ошибка в библиотеке?

В настоящее время у меня есть неуклюжий обходной путь, при котором я отключаю аудиопоток мультимедиа после закрытия распознавателя.

1 Ответ

0 голосов
/ 07 мая 2020

Вы уверены, что вам нужно позвонить SpeechRecognizer.cancel()? Согласно этого ответа на вызов может быть достаточно SpeechRecognizer.destroy().

Также не замечайте ошибку connected to the recognition service в вашем журнале, что указывает на то, что что-то не так в SpeechRecognizer. Вы можете попытаться удалить вызов cancel() и проверить, исчезла ли ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...