2011-08-23 12 views
14

Mi registro de aplicaciones de audio utilizando la clase MediaRecorder en AsyncTask y también utilizar la API de Google transformar la voz en texto - el reconocedor de Intención - utilizando el código de esta pregunta: ¿How can I use speech recognition without the annoying dialog in android phonesdiscurso Android reconocer y grabación de audio en el mismo tiempo

me han tratado también para grabar audio en Thread, pero esta es la peor solución. Causa más problemas. Mi problema es que mi aplicación funciona correctamente en el emulador. Pero el emulador no es compatible con el reconocimiento de voz debido a la falta de servicios de reconocimiento de voz. Y en mi dispositivo, mi aplicación se cuelga cuando empiezo a grabar audio y voz, "se ha detenido inesperadamente". Sin embargo, cuando tengo wifi apagado, la aplicación funciona correctamente como en el emulador.

grabación de audio requiere en AndroidManifest:

<uses-permission android:name="android.permission.RECORD_AUDIO" /> 

y de reconocimiento de voz requiers:

<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
<uses-permission android:name="android.permission.INTERNET" /> 

supongo que esto es un problema con la entrada de audio sola? ¿Como puedo resolver este problema? Google Speech Recognizer requiere que trabaje en el hilo principal de la interfaz de usuario, por lo que no puedo, por ejemplo, hacerlo en Async Task. Así que tengo una grabación de audio en Async Task. No tengo idea de por qué esto causa problemas.

He conectado mi dispositivo a Eclipse y he utilizado la depuración de USB. Y esto es lo que tengo en execption LogCat:

08-23 14:50:03.528: ERROR/ActivityThread(12403): Activity go.android.Activity has leaked ServiceConnection [email protected] that was originally bound here 
08-23 14:50:03.528: ERROR/ActivityThread(12403): android.app.ServiceConnectionLeaked: Activity go.android.Activity has leaked ServiceConnection [email protected] that was originally bound here 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ActivityThread$PackageInfo$ServiceDispatcher.<init>(ActivityThread.java:1121) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ActivityThread$PackageInfo.getServiceDispatcher(ActivityThread.java:1016) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ContextImpl.bindService(ContextImpl.java:951) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.content.ContextWrapper.bindService(ContextWrapper.java:347) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.speech.SpeechRecognizer.startListening(SpeechRecognizer.java:267) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at go.android.Activity.startRecordingAndAnimation(Activity.java:285) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at go.android.Activity.onResume(Activity.java:86) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1151) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.Activity.performResume(Activity.java:3823) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3118) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3143) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2684) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.os.Looper.loop(Looper.java:123) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at java.lang.reflect.Method.invoke(Method.java:521) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at dalvik.system.NativeStart.main(Native Method) 

y después de que otra excepción:

08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412): Failed to create session 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412): com.google.android.voicesearch.speechservice.ConnectionException: POST failed 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.SpeechServiceHttpClient.post(SpeechServiceHttpClient.java:176) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.SpeechServiceHttpClient.post(SpeechServiceHttpClient.java:88) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.ServerConnectorImpl.createTcpSession(ServerConnectorImpl.java:118) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.ServerConnectorImpl.createSession(ServerConnectorImpl.java:98) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.RecognitionController.runRecognitionMainLoop(RecognitionController.java:679) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.RecognitionController.startRecognition(RecognitionController.java:463) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.RecognitionController.access$200(RecognitionController.java:75) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.RecognitionController$1.handleMessage(RecognitionController.java:300) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at android.os.Looper.loop(Looper.java:123) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at android.os.HandlerThread.run(HandlerThread.java:60) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412): Caused by: java.net.SocketTimeoutException 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.harmony.luni.net.PlainSocketImpl.read(PlainSocketImpl.java:564) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.harmony.luni.net.SocketInputStream.read(SocketInputStream.java:88) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:191) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:82) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:174) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:179) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:235) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:259) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:279) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:410) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at android.net.http.AndroidHttpClient.execute(AndroidHttpClient.java:243) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.SpeechServiceHttpClient.post(SpeechServiceHttpClient.java:167) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  ... 10 more 
08-23 14:50:08.000: ERROR/RecognitionController(12412): Ignoring error 2 
+0

que estoy tratando de hacer exactamente lo mismo. Pero parece que solo podría haber una aplicación grabando audio. ¿Tuviste éxito?Ahora estoy intentando grabar el audio y hackearlo para enviarlo al reconocedor de voz, pero me resulta complicado encontrar la actividad o servicio que responde a RECOGNIZE_SPEECH. –

+1

No he probado esta solución, pero tal vez haya una posibilidad. En http://developer.android.com/reference/android/speech/RecognitionService.Callback.html existe el método 'void bufferReceived (byte [] buffer)'. La posible solución es guardar este búfer recibido en la clase AudioRecord de Android. Tiene un método como 'leer (byte [] audioData, int offsetInBytes, int sizeInBytes)'. Entonces, ¿tal vez es posible conectar estas dos utilidades de esta manera? Se pueden haber producido problemas al configurar AudioRecord y al convertir el resultado a formato mp3 o wav después de la grabación. – woyaru

+0

¿Alguien tiene algo de suerte? Esto sería muy útil para crear transcripciones de grabaciones de voz. Cree el archivo de voz a texto, pero luego podrá reproducir la grabación de voz para verificarlo. –

Respuesta

0

No he probado esta solución todavía, pero tal vez hay una posibilidad. En http://developer.android.com/reference/android/speech/RecognitionService.Callback.html existe el método void bufferReceived(byte[] buffer). La posible solución es guardar este búfer recibido en la clase de Android AudioRecord. Tiene un método como read(byte[] audioData, int offsetInBytes, int sizeInBytes). Entonces, ¿tal vez es posible conectar estas dos utilidades de esta manera? Se pueden haber producido problemas al configurar AudioRecord y al convertir el resultado a formato mp3 o wav después de la grabación.

+3

Desafortunadamente, este método no es llamado (en absoluto) por todos los dispositivos, por lo tanto, no se garantiza la obtención de ningún tipo de datos de audio. Este es un resultado triste y frustrante, porque tratamos de aprovechar esta función en nuestra aplicación para dictados, Dictator. Además, el formato y la frecuencia de muestreo de estos datos no está formalmente definido, pero generalmente se ve como (8KHz pero depende de la implementación) mono de 16 bits. –

3

Respuesta tardía, debe destruir su SpeechRecognizer después de que esto haya hecho, por ejemplo (en onStop() o en Destroy() o directamente después Ya no necesita el SpeechRecognizer) :

if (YourSpeechRecognizer != null) 
    { 
     YourSpeechRecognizer.stopListening(); 
     YourSpeechRecognizer.cancel(); 
     YourSpeechRecognizer.destroy(); 
    } 
6

Tengo una solución que está funcionando bien para tener reconocimiento de voz y grabación de audio. Aquí está el link a un simple proyecto de Android que creé para mostrar que la solución funciona. Además, puse algunas pantallas de impresión dentro del proyecto para ilustrar la aplicación.

Voy a tratar de explicar brevemente el enfoque que utilicé. Combiné dos características en ese proyecto: Google Speech API y grabación Flac.

Google Speech API se llama a través de conexiones HTTP. Mike Pultz da más detalles acerca de la API:.

"(...) el nuevo [Google] API es un API de dúplex completo en streaming Lo que esto significa, es que en realidad utiliza HTTP conexiones-una solicitud POST a dos cargue el contenido como un flujo fragmentado "en vivo" y una segunda solicitud GET para acceder a los resultados, lo que tiene mucho más sentido para muestras de audio más largas o para la transmisión de audio.. "

Sin embargo, esta API necesita recibir un archivo de sonido FLAC para que funcione correctamente Eso hace que vayamos a la segunda parte: la grabación Flac

he implementado grabación Flac en ese proyecto a través de la extracción y la adaptación de algunas piezas de código y bibliotecas de una aplicación de código abierto llamada AudioBoo. AudioBoo usa código nativo para grabar y reproducir formato de flac

Por lo tanto, es posible grabar un sonido de flac, enviarlo a Google Speech API, obtener el texto y reproducir el sonido que acaba de grabar

El proyecto Creé tiene los principios básicos para que funcione y pueda mejorarse para situaciones específicas. Para que funcione en un escenario diferente, es necesario obtener una clave API de Google Speech, que se obtiene al formar parte del grupo Google Chromium-dev. Dejé una clave en ese proyecto solo para mostrar que está funcionando, pero eventualmente la eliminaré. Si alguien necesita más información al respecto, házmelo saber porque no puedo poner más de 2 enlaces en esta publicación.

+0

Voy a probar su solución pronto. No he tenido el dispositivo adecuado durante mucho tiempo. Finalmente tengo un dispositivo para probarlo. – woyaru

+0

@isantsan ¿Puede decirme por favor cómo es posible guardar el archivo de audio en la tarjeta de memoria y luego convertirlo en audio api de texto a voz? Quiero hacer las mismas funciones. ¿Puede decirme por favor el código de muestra para que pueda comenzar? – Google

+0

Registramos el audio como un archivo .flac (utilizando algunas bibliotecas desarrolladas por AudioBoo), y luego enviamos el archivo .flac a Google a través de una conexión HTTP. Hay un enlace en mi respuesta a un proyecto de GitHub que tiene un ejemplo simple de esta implementación. – lsantsan

1

Lo he logrado con éxito con la ayuda de CLOUD SPEECH API. Puede encontrar su demostración en google speech.

La API reconoce más de 80 idiomas y variantes, para admitir su base de usuario global . Puede transcribir el texto de los usuarios que dictan a un micrófono de la aplicación , habilitar el comando y control mediante voz o transcribir archivos de audio, entre muchos otros casos de uso. Reconozca audio cargado en la solicitud, e integrelo con su almacenamiento de audio en Google Cloud Storage, utilizando la misma tecnología que Google usa para alimentar sus propios productos.

Utiliza un búfer de audio para transcribir datos con la ayuda de Google Speech API. He usado este buffer para almacenar la grabación de audio con la ayuda de AudioRecorder.

Así que con esta demostración podemos transcribir la voz del usuario de forma paralela con la grabación de audio.

En esto, inicia y detiene el reconocimiento de voz en función de la voz. También ofrece un recurso de SPEECH_TIMEOUT_MILLIS en VoiceRecorder.java que es lo mismo que EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS de RecognizerIntent, pero controlado por el usuario.

Así que en total, puede especificar el tiempo de espera de silencio y en función de eso se detendrá después de la salida del usuario y comenzará de nuevo tan pronto como el usuario comience a hablar.

0

Proyectos recientes en 'google-speech' y en 'android-opus' (opuslib) permiten el reconocimiento simultáneo simple junto con la grabación de audio en un archivo opus en Android ext. almacenamiento.

Observando el VoiceRecorder en el proyecto de voz, con solo unas pocas líneas adicionales de código después de leer el buffer de micrófono, el buffer también puede ser consumido por un archivoSink (PCM16 a Opus-codec) además del discurso actual- observador.

ver de combinación mínima de los 2 proyectos anteriormente en Google-speech-opus-recorder

Cuestiones relacionadas