Enregistrer/Enregistrer l'audio de l'intention de reconnaissance vocale

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

je veux enregistrer/enregistrer l'audio que google recognition service utilisé pour la parole à l'opération de texte (en utilisant RecognizerIntent ou SpeechRecognizer).

j'ai vécu beaucoup d'idées:

  1. onBufferReceived de RecognitionListener: je sachez, cela ne fonctionne pas, il suffit de le tester pour voir ce qui se passe et onbufferreceivered n'est jamais appelé (testé sur galaxy nexus avec JB 4.3)
  2. utilise un magnétophone: ne fonctionne pas. ça brise la reconnaissance vocale. une seule opération est autorisée pour la mic
  3. a essayé de trouver où le service de reconnaissance est en train de sauvegarder le fichier audio temporaire avant l'exécution de l'api speech to text pour le copier, mais sans succès

j'étais presque désespéré mais je viens de remarquer que Google Keep application fait ce que je dois faire!!!! J'ai débuté un peu l'application keep en utilisant logcat et l'application appelle aussi "RecognizerIntent".ACTION_RECOGNIZE_SPEECH" (comme nous, les développeurs, do) pour déclencher la parole au texte. mais, comment garder est sauver l'audio? ça peut être une api de cache? est-ce que google "tricherie" :)?

Merci pour votre aide

meilleures salutations

22
demandé sur user13267 2014-04-13 23:31:16

3 réponses

la réponse de @Karel est presque complète - le résultat audio est dans intent.getData() et peut être lu en utilisant ContentResolver

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

Si vous trouvez un moyen d'obtenir un enregistrement de haute qualité - s'il vous plaît commentaire 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
}
16
répondu Iftah 2014-06-25 08:54:37

la dernière fois que j'ai vérifié, Google Keep a mis ces extras:

  • android.discours.supplémentaire.GET_AUDIO_FORMAT: audio / AMR
  • android.discours.supplémentaire.GET_AUDIO: true

ceux-ci ne sont pas documentés dans la documentation Android, ils ne constituent donc pas une API Android. En outre, Google Keep ne se fonde pas sur l'intention de reconnaître ces extras. Il serait certainement bien si ces suppléments ont été popularisé et documenté par Google.

pour savoir quels extras sont définis par Google Keep quand il appelle le RecognizerIntent , mettre en œuvre une application qui répond au RecognizerIntent et imprimer tous les extras qu'il reçoit. Vous pouvez également installer Kõnele ( http://kaljurand.github.io/K6nele / ), qui est une mise en œuvre de RecognizerIntent . Lorsque Kõnele est lancé par Google Keep, puis long-appuyez sur l'icône des paramètres en forme de clé. Cela montre une certaine technicité détails sur l'appelant, et comprend également les extras entrants.

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

9
répondu Kaarel 2015-04-06 22:02:59

j'ai eu cette réponse d'ici, j'ai vérifié les dates et j'ai vu qu'elle était postée quelques jours après votre poste, donc j'ai pensé que vous l'aviez manquée. Android discours de reconnaissance et d'enregistrement audio en même temps

un mec là dit:

j'ai obtenu une solution qui fonctionne bien pour avoir la reconnaissance de la parole et l'enregistrement audio. Ici ( https://github.com/katchsvartanian/voiceRecognition ) est le lien pour un simple projet Android que j'ai créé pour montrer que la solution fonctionne. Aussi, j'ai mis quelques écrans d'impression à l'intérieur du projet pour illustrer les App.

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

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

" (...) le la nouvelle API [Google] est une API de streaming full-duplex. Ce que ce signifie, Est-ce qu'il utilise en fait deux connexions HTTP - une requête POST pour télécharger le contenu d'un "live" chunked flux, et une seconde demande d'accès aux résultats, ce qui est beaucoup plus logique pour plus longtemps des échantillons audio, ou pour le streaming audio."

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

j'ai mis en œuvre L'enregistrement Flac dans ce projet par l'extraction et adaptation de quelques morceaux de code et bibliothèques à partir d'une application open source appelé AudioBoo. AudioBoo utilise le code natif pour enregistrer et jouer flac format.

ainsi, il est possible d'enregistrer un son flac, envoyez-le à Google Speech API, récupère le texte, et joue 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é D'API de discours de Google, qui est obtenu en faisant partie de Google Chrome dev groupe. J'ai quitté une clé dans ce projet juste pour montrer que ça marche, mais je vais l'enlever. finalement. Si quelqu'un a besoin de plus d'informations à ce sujet, laissez-moi savoir parce que je ne suis pas en mesure de mettre plus de 2 liens dans ce post.

3
répondu Kappa 2017-12-30 07:38:39