Enregistrement audio envoyé au serveur de reconnaissance vocale de Google
pour reconnaître la parole par Google server, j'utilise la classe SpeechRecognizer en combinaison avec RecognitionListener comme suggéré dans Stephan 's réponse à cette question . En outre, j'essaie de capturer le signal audio étant reconnu en utilisant onBufferReceived () callback de RecognitionListener comme:
byte[] sig = new byte[500000] ;
int sigPos = 0 ;
...
public void onBufferReceived(byte[] buffer) {
System.arraycopy(buffer, 0, sig, sigPos, buffer.length) ;
sigPos += buffer.length ;
}
...
cela semble bien fonctionner, sauf quand SpeechRecognizer ne se connecte pas pour le serveur Google, lorsqu'un morceau d'audio n'est pas copié dans le tableau sig
mentionné ci-dessus, et qu'une exception de temporisation de connexion HTTP est lancée. SpeechRecognizer se connecte éventuellement au serveur Google et les résultats de reconnaissance indiquent qu'un signal audio complet a été reçu; seul le tableau sig
manque un morceau(s) audio.
est-ce que quelqu'un a le même problème? Tout soupçon de solution? Je vous remercie!
3 réponses
j'ai tendance à dire que cela pourrait être une incohérence dans le comportement du service de reconnaissance, peut-être même un bug dans la version Android que vous utilisez. Toutefois, la documentation indique qu'il n'est pas garanti que cette méthode soit appelée de sorte qu'elle s'insère dans la spécification. Ce que j'ai remarqué jusqu'à présent est le suivant (sur Android 2.3.4): j'obtiens les octets pendant l'enregistrement, mais s'il y a par exemple un SocketTimeout
il essaie de renvoyer les données au serveur après un certain temps, mais sans appeler onBufferReceived
encore une fois pour les mêmes données. Le code utilisé pour tester qui était le même que celui que vous avez lié dans votre affichage.
Pourquoi pensez-vous que certains morceaux sont absents de l'audio que vous avez reçu dans la méthode? S'il ne manquait que quelques morceaux, il se pourrait même que la reconnaissance ait fonctionné bien que ces morceaux aient disparu.
dans les versions modernes surbufferreceieved ne fonctionne pas, vous pouvez cocher Enregistrer/Enregistrer l'audio de la reconnaissance vocale intention à la place.
la meilleure façon d'y parvenir est de faire le tour. Capturez vos données audio en utilisant le AudioRecord
, (je recommande d'utiliser VOICE_COMMUNICATION
plutôt que MIC
comme une entrée de sorte que vous obtenez audio vraiment propre), puis passez-le à la SpeechRecognizer
. :)