Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

367
Visualizações
Android RecognitionListener: onResults siendo llamado dos veces

Tengo un proyecto usando RecognitionListener escrito en Kotlin. La función de voz a texto siempre fue un éxito y nunca presentó ningún problema.

Desde la semana pasada, su función onResult comenzó a llamarse dos veces. No se realizaron cambios en el proyecto. Probé versiones antiguas del proyecto (de hace meses) y tenían el mismo problema.

Hay tres casos diferentes:

  1. Texto pequeño (de 1 a 8 palabras) y SpeechRecognizer se detiene automáticamente -> onResult() llamado dos veces;
  2. Texto grande (9 palabras o más) y SpeechRecognizer se detiene automáticamente -> Comportamiento normal (onResult() llamado una vez);
  3. Cualquier tamaño de texto y la función SpeechRecognizer stopListening() llamada manualmente (desde el código) -> Comportamiento normal.

Aquí está el código de clase de voz a texto de VoiceRecognition:

 class VoiceRecognition(private val activity: Activity, language: String = "pt_BR") : RecognitionListener { private val AudioLogTag = "AudioInput" var voiceRecognitionIntentHandler: VoiceRecognitionIntentHandler? = null var voiceRecognitionOnResultListener: VoiceRecognitionOnResultListener? = null //Must have this var voiceRecognitionLayoutChanger: VoiceRecognitionLayoutChanger? = null var isListening = false private val intent: Intent private var speech: SpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(activity) init { speech.setRecognitionListener(this) intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH) intent.putExtra( RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM ) intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, language) } //It is important to put this function inside a clickListener fun listen(): Boolean { if (ContextCompat.checkSelfPermission(activity, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(activity, arrayOf(Manifest.permission.RECORD_AUDIO), 1) return false } speech.startListening(intent) Log.i(AudioLogTag, "startListening") return true } //Use this if you want to stop listening but still get recognition results fun endListening(){ Log.i(AudioLogTag, "stopListening") speech.stopListening() isListening = false } fun cancelListening(){ Log.i(AudioLogTag, "cancelListening") speech.cancel() voiceRecognitionLayoutChanger?.endListeningChangeLayout() isListening = false } override fun onReadyForSpeech(p0: Bundle?) { Log.i(AudioLogTag, "onReadyForSpeech") voiceRecognitionLayoutChanger?.startListeningChangeLayout() isListening = true } override fun onRmsChanged(p0: Float) { // Log.i(AudioLogTag, "onRmsChanged: $p0") // progressBar.setProgress((Int) p0) } override fun onBufferReceived(p0: ByteArray?) { Log.i(AudioLogTag, "onBufferReceived: $p0") } override fun onPartialResults(p0: Bundle?) { Log.i(AudioLogTag, "onPartialResults") } override fun onEvent(p0: Int, p1: Bundle?) { Log.i(AudioLogTag, "onEvent") } override fun onBeginningOfSpeech() { Log.i(AudioLogTag, "onBeginningOfSpeech") } override fun onEndOfSpeech() { Log.i(AudioLogTag, "onEndOfSpeech") voiceRecognitionLayoutChanger?.endListeningChangeLayout() isListening = false } override fun onError(p0: Int) { speech.cancel() val errorMessage = getErrorText(p0) Log.d(AudioLogTag, "FAILED: $errorMessage") voiceRecognitionLayoutChanger?.endListeningChangeLayout() isListening = false } override fun onResults(p0: Bundle?) { val results: ArrayList<String> = p0?.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION) as ArrayList<String> Log.i(AudioLogTag, "onResults -> ${results.size}") val voiceIntent: Int? = voiceRecognitionIntentHandler?.getIntent(results[0]) if (voiceIntent != null && voiceIntent != 0) { voiceRecognitionIntentHandler?.handle(voiceIntent) return } voiceRecognitionOnResultListener!!.onResult(results[0]) } private fun getErrorText(errorCode: Int): String { val message: String when (errorCode) { SpeechRecognizer.ERROR_AUDIO -> message = "Audio recording error" SpeechRecognizer.ERROR_CLIENT -> message = "Client side error" SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS -> message = "Insufficient permissions" SpeechRecognizer.ERROR_NETWORK -> message = "Network error" SpeechRecognizer.ERROR_NETWORK_TIMEOUT -> message = "Network timeout" SpeechRecognizer.ERROR_NO_MATCH -> message = "No match" SpeechRecognizer.ERROR_RECOGNIZER_BUSY -> message = "RecognitionService busy" SpeechRecognizer.ERROR_SERVER -> message = "Error from server" SpeechRecognizer.ERROR_SPEECH_TIMEOUT -> message = "No speech input" else -> message = "Didn't understand, please try again." } return message } //Use it in your overriden onPause function. fun onPause() { voiceRecognitionLayoutChanger?.endListeningChangeLayout() isListening = false speech.cancel() Log.i(AudioLogTag, "pause") } //Use it in your overriden onDestroy function. fun onDestroy() { speech.destroy() }

listen(), endListening() y cancelListening() se llaman desde un botón.

over 4 years ago · Hanz Gallego
6 Respostas
Responde à pergunta

0

Esto acaba de empezar a suceder en una de mis aplicaciones ayer. Agregué un booleano para permitir que el código se ejecute solo una vez, pero me encantaría una explicación de por qué de repente comenzó a hacer esto. ¿Alguna actualización?

over 4 years ago · Hanz Gallego Relatório

0

Encontré este problema abierto: https://issuetracker.google.com/issues/152628934

Como comenté, asumo que es un problema con el "servicio de reconocimiento de voz" y no con la clase RecognitionListener de Android.

over 4 years ago · Hanz Gallego Relatório

0

Tuve el mismo problema y acabo de agregar un indicador booleano en mi código, pero, por supuesto, es una solución temporal y no conozco el origen de este problema.

 val recognizer = SpeechRecognizer.createSpeechRecognizer(context) recognizer.setRecognitionListener( object : RecognitionListener { var singleResult = true override fun onResults(results: Bundle?) { if (singleResult) { results?.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION).let { // do something with result } // next result will be ignored singleResult = false } } }
over 4 years ago · Hanz Gallego Relatório

0

esta es mi solución temporal

 singleResult=true; @Override public void onResults(Bundle results) { Log.d(TAG, "onResults"); //$NON-NLS-1$ if (singleResult) { ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); if (matches != null && matches.size() > 0) { Log.d("single Result", "" + matches.get(0)); } singleResult=false; } getHandler().postDelayed(new Runnable() { @Override public void run() { singleResult=true; } },100); }
over 4 years ago · Hanz Gallego Relatório

0

Utilizo el siguiente código basado en las diferencias de tiempo, que debería continuar funcionando si Google alguna vez soluciona este error.

 long mStartTime = System.currentTimeMillis(); // Global Var @Override public void onResults(Bundle results) { long difference = System.currentTimeMillis() - mStartTime; if (difference < 100) { return; } mStartTime = System.currentTimeMillis(); ArrayList<String> textMatchList = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); Event_Handler(VOICE_DATA, textMatchList.get(0)); // process event }
over 4 years ago · Hanz Gallego Relatório

0

incluso yo enfrenté el mismo problema con mi aplicación, pero lo arreglé con una lógica personalizada que usa un indicador que significa que una variable deja que sea una variable temporal y, de forma predeterminada, la configura como falsa.

lo que debe hacer establezca la temperatura como verdadera donde sea que comience a escuchar la voz. Luego, en su controlador, lo que debe hacer es simplemente agregar una condición if en función de la variable temporal como

if (temp) {hacer algo temp = false}

Entonces, ¿qué sucederá? Se llamará a su controlador dos veces como de costumbre, pero solo podrá manejar estos datos.

over 4 years ago · Hanz Gallego Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda