Как предотвратить шум Android SpeechRecognizer после уничтожения?

Я использую 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

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

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

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


person Ellen Spertus    schedule 27.04.2020    source источник


Ответы (1)


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

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

person fdermishin    schedule 07.05.2020