El reconocimiento de voz no funciona cuando la voz está bajo grabación

Estoy trabajando en una función que cuando un botón es presionado, lanzará reconocimiento de voz y al mismo tiempo registrará lo que dice el usuario. Códigos como sigue:

button_start.setOnTouchListener( new View.OnTouchListener() { @Override public boolean onTouch(View arg0, MotionEvent event) { if (pressed == false) { Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,"voice.recognition.test"); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "zh-HK"); intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS,1); sr.startListening(intent); Log.i("111111","11111111"); pressed = true; } recordAudio(); } if((event.getAction()==MotionEvent.ACTION_UP || event.getAction()==MotionEvent.ACTION_CANCEL)) { stopRecording(); } return false; } }); } public void recordAudio() { isRecording = true; try { mediaRecorder = new MediaRecorder(); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mediaRecorder.setOutputFile(audioFilePath); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); mediaRecorder.prepare(); } catch (Exception e) { e.printStackTrace(); } mediaRecorder.start(); } public void stopRecording() { if (isRecording) { mediaRecorder.stop(); mediaRecorder.reset(); // set state to idle mediaRecorder.release(); mediaRecorder = null; isRecording = false; } else { mediaPlayer.release(); mediaPlayer.reset(); mediaPlayer = null; } } class listener implements RecognitionListener { // standard codes onReadyForSpeech, onBeginningOfSpeech, etc } 

Preguntas:

He hecho la aplicación paso a paso, y al principio la aplicación no tiene funciones de grabación, y el reconocimiento de voz funciona perfectamente.

Después de haber probado muchas veces y considerado el reconocimiento de voz está bien, empecé a incorporar las funciones de grabación usando el MediaRecorder .

Entonces probé, una vez presionado el ERROR3 AUDIO , el mensaje ERROR3 AUDIO aparece inmediatamente antes de tratar de hablar.

Reproduzco la grabación de voz. La voz se graba y se guarda correctamente también.

¿Que esta pasando? ¿Por qué no se puede grabar al mismo tiempo cuando se utiliza reconocimiento de voz?

¡Gracias!

One Solution collect form web for “El reconocimiento de voz no funciona cuando la voz está bajo grabación”

–EDIT– para Opus-Record WHILE El reconocimiento de voz también se ejecuta

–EDIT– 'V1BETA1' streaming, continuo, reconocimiento con menor cambio en el proyecto de muestra . Altere ese ' readData () ', por lo que el PCM en bruto en 'sData' es compartido por dos subprocesos (fileSink thread, recognizerAPI thread from sample project). Para el receptor, sólo conecte un codificador usando un flujo de PCM actualizado en cada 'sData' IO. Recuerde CLO la corriente y funcionará. Revisión ' writeAudiaDataToFile () ' para más información sobre fileSink ….

–EDIT– ver este hilo

Va a haber un conflicto básico sobre el HAL y el buffer del micrófono cuando intentes hacer:

 speechRecognizer.startListening(recognizerIntent); // <-- needs mutex use of mic 

y

 mediaRecorder.start(); // <-- needs mutex use of mic 

¡Sólo puedes elegir una u otra de las acciones anteriores para poseer la API de audio que subyace al micrófono!

Si quieres imitar la funcionalidad de Google Keep donde solo hablas una vez y como salida del proceso de una entrada (tu discurso en micrófono) obtienes dos tipos separados de salida (STT y un fileSink de decir el MP3) entonces debes dividir Algo que sale de la capa HAL del micrófono.

Por ejemplo:

  1. Recoge el audio RAW como PCM 16 que sale del buffer del micrófono

  2. Dividir los bytes del búfer anterior (puede obtener un flujo del búfer y canalizar el flujo 2 lugares)

  3. STRM 1 a la API para STT, ya sea antes o después de codificarla (hay STT API que aceptan tanto PCM crudo 16 como codificado)

  4. STRM 2 a un codificador, luego al fileSink para su captura de la grabación

Split puede funcionar tanto en el buffer real producido por el micrófono como en un flujo derivado de esos mismos bytes.

Para lo que te estás metiendo, te recomiendo que mires a getCurrentRecording() y consumeRecording() aquí .

Referencia API STT: Google "pultz speech-api" . Tenga en cuenta que hay casos de uso en la API que se menciona allí.

  • BuferUtils
  • código
  • Más código
  • Comparar voz wav en android o etiqueta de voz (comandos de voz) API
  • Es posible hacer SpeechRecognizer más rápido?
  • Cómo simular la entrada de audio a micrófono utilizando el archivo .wav
  • Comparar dos voces en android
  • Tono DTMF en RecognitionListener.onReadyForSpeech () confundido con el discurso
  • ¿Cómo puede hacer que el reconocimiento de voz del soporte para el emulador android
  • Biometría de voz para Android
  • Tiempo de espera del reconocimiento de voz de Google
  • ¿Reconoce RecognitionListener.onError () automáticamente SpeechRecognizer.cancel ()?
  • Uso de la API de SpeechRecognizer directamente - onResults () sigue devolviendo null
  • Limitación del diccionario de reconocimiento de voz para una mejor coincidencia y buena precisión
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.