web-dev-qa-db-fra.com

enregistrer / sauvegarder l'audio de l'intention de reconnaissance vocale

Avant de poser cette question, j'ai vérifié tous les autres threads stackoverflow liés à ce problème sans succès, donc s'il vous plaît, ne répondez pas avec des liens vers d'autres threads, :)

Je souhaite enregistrer/enregistrer l'audio utilisé par le service de reconnaissance Google pour les opérations de synthèse vocale (à l'aide de RecognizerIntent ou de SpeechRecognizer).

J'ai vécu de nombreuses idées:

  1. onBufferReceived from RecognitionListener: Je sais, cela ne fonctionne pas, testez-le simplement pour voir ce qui se passe et onBufferReceived n'est jamais appelé (testé sur galaxy nexus avec JB 4.3)
  2. utilisé un enregistreur multimédia: ne fonctionne pas. c'est briser la reconnaissance vocale. une seule opération est autorisée pour le micro
  3. essayé de trouver où le service de reconnaissance enregistre le fichier audio temporaire avant l'exécution de l'api de synthèse vocale pour le copier, mais sans succès

J'étais presque désespéré mais je viens de remarquer que application Google Keep fait ce que je dois faire !!!! J'ai débogué un peu l'application keep à l'aide de logcat et l'application appelle également "RecognizerIntent.ACTION_RECOGNIZE_SPEECH" (comme nous, les développeurs, le faisons) pour déclencher la synthèse vocale en texte. mais comment conserver l’audio? peut-il être un api masqué? est-ce que google "triche" :)?

Merci de votre aide

Meilleures salutations

26
Slim

@ La réponse de Kaarel est presque complète - l'audio résultant est dans intent.getData() et peut être lu à l'aide de ContentResolver

Malheureusement, le fichier AMR qui est renvoyé est de faible qualité - je n'ai pas pu trouver un moyen d'obtenir un enregistrement de haute qualité. Toute valeur que j'ai essayée autre que "audio/AMR" a renvoyé null dans intent.getData().

Si vous trouvez un moyen d'obtenir un enregistrement de haute qualité - veuillez commenter ou ajouter une réponse!

public void startSpeechRecognition() {
   // Fire an intent to start the speech recognition activity.
   Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
   // secret parameters that when added provide audio url in the result
   intent.putExtra("Android.speech.extra.GET_AUDIO_FORMAT", "audio/AMR");
   intent.putExtra("Android.speech.extra.GET_AUDIO", true);

   startActivityForResult(intent, "<some code you choose>");
}

// handle result of speech recognition
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    // the resulting text is in the getExtras:
    Bundle bundle = data.getExtras();
    ArrayList<String> matches = bundle.getStringArrayList(RecognizerIntent.EXTRA_RESULTS)
    // the recording url is in getData:
    Uri audioUri = data.getData();
    ContentResolver contentResolver = getContentResolver();
    InputStream filestream = contentResolver.openInputStream(audioUri);
    // TODO: read audio file from inputstream
}
19
Iftah

La dernière fois que j'ai vérifié, Google Keep a défini ces extras:

  • Android.speech.extra.GET_AUDIO_FORMAT: audio/AMR
  • Android.speech.extra.GET_AUDIO: true

Ceux-ci ne sont pas documentés dans le cadre de la documentation Android, donc ils ne constituent pas une API Android. De plus, Google Keep ne se fonde pas sur l'intention du reconnaisseur de considérer ces extras. Ce serait certainement bien si ces extras étaient popularisés et documentés par Google.

Pour savoir quels extras sont définis par Google Keep lorsqu'il appelle le RecognizerIntent, implémentez une application qui répond au RecognizerIntent et imprimez tous les extras qu'il reçoit. Vous pouvez également installer Kõnele ( http://kaljurand.github.io/K6nele/ ), qui est une implémentation de RecognizerIntent. Lorsque Kõnele est lancé par Google Keep, appuyez longuement sur l'icône des paramètres en forme de clé. Cela montre quelques détails techniques sur l'appelant et inclut également les extras entrants.

La réponse de @Iftah explique comment Google Keep renvoie l'enregistrement audio à l'appelant de RecognizerIntent.

9
Kaarel

J'ai obtenu cette réponse d'ici, j'ai vérifié les dates et j'ai vu qu'elle avait été publiée quelques jours après votre publication, alors j'ai pensé que vous l'aviez manquée. reconnaissance vocale Android et enregistrement audio en même temps

un mec dit:

J'ai obtenu une solution qui fonctionne bien pour la reconnaissance vocale et l'enregistrement audio. Ici ( https://github.com/katchsvartanian/voiceRecognition ) est le lien vers un simple Android projet 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: l'API Google Speech et l'enregistrement Flac.

L'API Google Speech est appelée via des connexions HTTP. Mike Pultz donne plus de détails sur l'API:

"(...) la nouvelle [Google] API est une API de streaming en duplex intégral. Ce que cela signifie, c'est qu'elle utilise en fait deux connexions HTTP: une POST demande de téléchargement du contenu en tant que un flux fragmenté "en direct" et une deuxième demande GET pour accéder aux résultats, ce qui est beaucoup plus logique pour des échantillons audio plus longs ou pour la diffusion audio. "

Cependant, cette API doit recevoir un fichier son FLAC pour fonctionner correctement. Cela nous fait passer à la deuxième partie: enregistrement Flac

J'ai implémenté l'enregistrement Flac dans ce projet en extrayant et en adaptant des morceaux de code et des bibliothèques à partir d'une application open source appelée AudioBoo. AudioBoo utilise du code natif pour enregistrer et lire le format flac.

Ainsi, il est possible d'enregistrer un son flac, de l'envoyer à l'API Google Speech, d'obtenir le texte et de lire le son qui vient d'être enregistré.

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 scénario différent, il est nécessaire d'obtenir une clé API Google Speech, qui est obtenue en faisant partie du groupe Google Chromium-dev. J'ai laissé une clé dans ce projet juste pour montrer qu'il fonctionne, mais je la supprimerai finalement. Si quelqu'un a besoin de plus d'informations à ce sujet, faites-le moi savoir car je ne suis pas en mesure de mettre plus de 2 liens dans ce message.

3
Kappa