Reconnaissance vocale Android et enregistrement audio dans le même temps
Ma demande enregistrements audio à l'aide de MediaRecorder classe AsyncTask et aussi l'utilisation de l'API Google transformer la parole en texte - Reconnaissance de l'Intention à l'aide du code à partir de cette question : Comment puis-je utiliser la reconnaissance vocale, sans le désagrément de dialogue dans les téléphones android
J'ai essayé également enregistrer de l'audio dans le Thread, mais c'est la pire solution. Il provoque plus de problèmes. Mon problème est que mon application fonctionne correctement sur émulateur. Mais émulateur ne supporte discours reocognition en raison du manque de services de reconnaissance vocale. Et sur mon appareil mon application crash quand je démarre l'enregistrement de l'audio et de la parole reognizing - "s'arrête de manière inattendue". Cependant, lorsque j'ai le wifi désactivé, l'application fonctionne correctement comme sur émulateur.
Enregistrement audio nécessite en AndroidManifest:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
et de reconnaissance de la parole prevoit:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
Je suppose que c'est le problème avec une seule entrée audio? Comment puis-je résoudre ce problème?
Google Reconnaissance Vocale prevoit de travailler dans main thread de l'INTERFACE utilisateur, donc je ne peux pas par exemple faire en Async Tâche. J'ai donc l'enregistrement audio dans Async Tâche. Je n'ai pas d'idée de pourquoi cela provoque des problèmes.
J'ai connecté mon appareil pour Eclipse et j'ai utilisé le débogage USB. Et c'est l'exception, j'ai dans le LogCat:
08-23 14:50:03.528: ERROR/ActivityThread(12403): Activity go.android.Activity has leaked ServiceConnection android.speech.SpeechRecognizer$Connection@48181340 that was originally bound here
08-23 14:50:03.528: ERROR/ActivityThread(12403): android.app.ServiceConnectionLeaked: Activity go.android.Activity has leaked ServiceConnection android.speech.SpeechRecognizer$Connection@48181340 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)
Et après un autre exception:
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
source d'informationauteur woyaru
Vous devez vous connecter pour publier un commentaire.
J'ai une solution qui fonctionne bien pour avoir de la parole la reconnaissance et l'enregistrement audio. Voici la lien à un simple projet Android que j'ai créé pour montrer la solution de travail. Aussi, j'ai mis quelques écrans d'impression à l'intérieur du projet pour illustrer l'application.
Je vais essayer d'expliquer brièvement la démarche que j'ai utilisée. J'ai combiné deux caractéristiques dans ce projet: Google Speech API et Flac enregistrement.
Google Speech API est appelée par le biais de connexions HTTP. Mike Pultz donne plus de détails sur l'API:
"(...) la nouvelle [Google] API est un full-duplex streaming API. Ce que cela signifie, c'est qu'il utilise deux connexions HTTP en - un POST de demande de télécharger le contenu d'un “live” chunked flux, et une deuxième demande d'OBTENIR l'accès aux résultats, ce qui fait beaucoup plus de sens pour plus d'échantillons audio, ou pour le streaming audio."
Toutefois, cette API doit recevoir un FLAC fichier son pour fonctionner correctement. Ce qui nous oblige à aller à la deuxième partie: Flac enregistrement
J'ai mis en place Flac enregistrement dans ce projet par le biais de l'extraction et de l'adaptation de certains morceaux de code et les bibliothèques de l'open source application appelée AudioBoo. AudioBoo utilisation de code natif pour enregistrer et lire le format flac.
Ainsi, il est possible d'enregistrer un flac son, de l'envoyer à Google Speech API, le texte, et de jouer le son que vous venez d'enregistrer.
Le projet que j'ai créé a les principes de base pour le faire fonctionner, et peut être amélioré pour des situations spécifiques. Afin de le faire fonctionner dans un autre scénario, il est nécessaire d'obtenir un Google Speech API clé, qui est obtenu en faisant partie de Google Chrome dev groupe. J'ai quitté l'une des clés de ce projet juste pour montrer que ça fonctionne, mais je vais l'enlever par la suite. Si quelqu'un a besoin de plus d'informations à ce sujet, laissez-moi savoir parce que je ne suis pas capable de mettre plus de 2 liens dans ce post.
Réponse tardive, mais pour la première Exception, Vous devez détruire Votre SpeechRecognizer après ce que Vous souhaitez a fait, par exemple (dans onStop() ou onDestroy() ou directement après Vous n'avez pas besoin de la SpeechRecognizer plus):
J'ai accompli avec succès avec l'aide de CLOUD SPEECH API.
Vous pouvez trouver la démo par google discours.
Il utilise de la mémoire tampon audio à transcrire des données avec l'aide de Google Speech API. J'ai utilisé ce tampon pour stocker l'enregistrement de l'Audio avec l'aide de Enregistreur audio.
Donc, avec cette démonstration, nous pouvons transcrire de l'utilisateur du discours de rapprochement avec l'Enregistrement Audio.
En cela, il démarre et s'arrête de reconnaissance vocale basée sur la voix. Il donne aussi une facilité de SPEECH_TIMEOUT_MILLIS dans VoiceRecorder.java qui est juste comme EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS de RecognizerIntentmais contrôlé par l'utilisateur.
Donc de tous, vous pouvez spécifier le silence de délai d'expiration et basé sur ce qu'il s'arrête après la sortie de l'utilisateur et de recommencer dès que l'utilisateur commence à parler.
Je n'ai pas testé cette solution mais peut-être il ya une possibilité. Dans http://developer.android.com/reference/android/speech/RecognitionService.Callback.html il y a la méthode
void bufferReceived(byte[] buffer)
. La solution possible est de sauver ce recived tampon dansAudioRecord
Android de classe. Il a méthode commeread(byte[] audioData, int offsetInBytes, int sizeInBytes)
. Alors peut-être il est possible de connecter ces deux utilitaires de cette façon? Des problèmes peuvent survenir avec la configuration deAudioRecord
et avec le résultat de la conversion de format mp3 ou wav après l'enregistrement.Projets récents sur " google-parole "et sur" android-opus ' (opuslib) permettre à la simple simultanées de reconnaissance avec enregistrement audio pour un opus fichier android ext. le stockage.
À la recherche à la VoiceRecorder dans le discours du projet , avec seulement quelques lignes de code supplémentaires après la lecture du microphone de la mémoire tampon, le tampon peut également être consommée par un fileSink (PCM16 Opus-codec) en plus de l'actuel discours-observateur.
voir minimal de fusion des 2 projets ci-dessus dans Google-discours-opus-enregistreur