Reconnaissance vocale Android et enregistrement audio en même temps

mon application enregistre l'audio en utilisant la classe MediaRecorder dans AsyncTask et aussi utiliser L'API Google transform speech to text-Recognizer intention-en utilisant le code de cette question : Comment puis-je utiliser la reconnaissance vocale sans la boîte de dialogue ennuyeux dans les téléphones android

j'ai essayé aussi d'enregistrer l'audio dans le fil, mais c'est pire solution. Il provoque plus de problèmes. Mon problème est que mon application fonctionne correctement sur émulateur. Mais émulateur ne soutenez pas la réocognition de la parole en raison du manque de services de reconnaissance vocale. Et sur mon appareil mon application s'est écrasée quand j'ai commencé à enregistrer l'audio et la reconnaissance vocale - "s'est arrêté de manière inattendue". Cependant quand j'ai wifi éteint, l'application fonctionne correctement comme sur l'é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 problème avec une seule entrée audio? Comment puis-je résoudre ce problème? Google Speech Recognizer requiers de travailler dans le principal UI thread, de sorte que je ne peux pas par exemple le faire dans la tâche Async. J'ai donc un enregistrement audio dans une tâche asynchrone. Je ne sais pas pourquoi ça cause des problèmes.

j'ai connecté mon appareil à Eclipse et j'ai utilisé le débogage USB. Et voici l'exécution que J'ai dans 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.access00(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 cela une 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.access0(RecognitionController.java:75)
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):     at com.google.android.voicesearch.speechservice.RecognitionController.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
15
demandé sur Community 2011-08-23 16:02:59

5 réponses

j'ai obtenu une solution qui fonctionne bien pour avoir la reconnaissance de la parole et l'enregistrement audio. Voici le lien à un simple projet Android que j'ai créé pour montrer le fonctionnement de la solution. Aussi, j'ai mis quelques écrans d'impression à l'intérieur du projet pour illustrer l'application.

je vais essayer d'expliquer brièvement l'approche que j'ai utilisée. J'ai combiné deux fonctionnalités dans ce projet: Google Speech API et Flac recording.

API Google Speech est appelé par le biais de connexions HTTP. Mike Pultz donne plus de détails sur L'API:

(... la nouvelle API [Google] est une API de streaming full-duplex. Ce que cela signifie, c'est qu'il utilise en fait deux connexions HTTP - une requête POST pour télécharger le contenu sous forme de flux "en direct", et une seconde requête GET pour accéder aux résultats, ce qui est beaucoup plus logique pour les échantillons audio plus longs, ou pour la diffusion audio en continu."

cependant, cette API doit recevoir un fichier son FLAC pour fonctionner correctement. Cela nous amène à la deuxième partie: Flac recording

j'ai implémenté Flac recording dans ce projet en extrayant et en adaptant certains morceaux de code et bibliothèques à partir D'une application libre appelée AudioBoo. AudioBoo utilise le code natif pour enregistrer et jouer le format flac.

ainsi, il est possible d'enregistrer un son flac, l'Envoyer à L'API de Google Speech, obtenir le texte, et 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. Pour que cela fonctionne dans un scénario différent, il est nécessaire d'obtenir une clé API de Google Speech, qui est obtenue en faisant partie du groupe Google Chromium-dev. J'ai laissé une clé dans ce projet juste pour montrer que ça marche, mais je l'enlèverai éventuellement. Si quelqu'un a besoin de plus d'informations à ce sujet, faites-le moi savoir parce que je ne suis pas en mesure de mettre plus de 2 liens dans ce post.

6
répondu lsantsan 2014-04-17 20:46:54

réponse tardive, mais pour la première Exception, vous devez détruire votre SpeechRecognizer après cela ce que vous voulez a fait, par exemple (dans onStop () ou onDestroy () ou directement après que vous n'avez plus besoin du SpeechRecognizer):

    if (YourSpeechRecognizer != null)
    {
        YourSpeechRecognizer.stopListening();
        YourSpeechRecognizer.cancel();
        YourSpeechRecognizer.destroy();
    }
3
répondu Opiatefuchs 2013-03-24 17:22:23

j'ai réussi cela avec l'aide de CLOUD SPEECH API . Vous pouvez trouver sa démo par Google speech .

l'API reconnaît plus de 80 langues et variantes, pour soutenir votre base mondiale d'utilisateurs. Vous pouvez transcrire le texte des utilisateurs dictant à un le microphone de l'application, Activer la commande et le contrôle par la voix, ou transcrire des fichiers audio, parmi beaucoup d'autres cas d'utilisation. Reconnaître audio téléchargé dans la demande, et intégrer avec votre stockage audio sur Google Cloud Storage, en utilisant la même technologie que Google utilise pour la puissance de ses propres produits.

il utilise le tampon audio pour transcrire des données à l'aide de L'API de Google Speech. J'ai utilisé ce tampon pour stocker l'enregistrement Audio avec l'aide de AudioRecorder .

ainsi, avec cette démo, nous pouvons transcrire le discours de l'utilisateur en parallèle avec L'Audio Enregistrement.

en cela, il démarre et arrête la reconnaissance vocale basée sur la voix. Il donne également une facilité de SPEECH_TIMEOUT_MILLIS en VoiceRecorder.java qui est identique à EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS de RecognizerIntent , mais contrôlé par l'utilisateur.

donc tout dans l'ensemble, vous pouvez spécifier silence timeout et basé sur ce qu'il s'arrêtera après la sortie de l'utilisateur et recommencer dès que l'utilisateur commence à parler.

1
répondu Name is Nilay 2016-09-23 13:16:40

Je n'ai pas encore testé cette solution mais il y a peut-être 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 sauvegarder ce tampon dans la classe AudioRecord Android. Il a une méthode comme read(byte[] audioData, int offsetInBytes, int sizeInBytes) . Alors peut-être il est possible de connecter ces deux utilitaires de cette façon? Des problèmes ont pu se produire avec la configuration de AudioRecord et avec la conversion le résultat au format mp3 ou wav après l'enregistrement.

0
répondu woyaru 2012-07-11 12:02:21

projets Récents sur la " google-discours ' et ' android-opus ' (opuslib) permettre à la simple simultanées de reconnaissance avec enregistrement audio pour un opus fichier android ext. stockage.

en regardant le VoiceRecorder dans le projet speech, avec seulement quelques lignes supplémentaires de code après avoir lu le tampon du microphone, le tampon peut également être consommé par un fileSink (PCM16 à Opus-codec) en plus de le discours-observateur.

voir minimal de fusion des 2 projets ci-dessus dans Google-discours-opus-enregistreur

0
répondu Robert Rowntree 2016-12-05 23:57:51