38 votes

Enregistrement de l'entrée audio du moteur de reconnaissance vocale Android Stock

Je suis en train d'enregistrer dans un fichier les données audio écouté par le service de reconnaissance vocale d'android.

En fait je mettre en oeuvre RecognitionListener comme expliqué ici: Parole-Texte sur Android

enregistrer les données dans une mémoire tampon, comme illustré ici: La capture de l'audio envoyé à la reconnaissance vocale de Google serveur

et d'écrire le contenu du buffer dans un fichier Wav, comme ici. Android Enregistrement raw octets dans un fichier WAVE pour le Streaming Http

Mon problème est de savoir comment obtenir les paramètres audio à enregistrer dans le fichier wav les en-têtes. En fait, quand je joue le fichier wav que vous n'entendrez un bruit bizarre, avec ces paramètres,

short nChannels=2;// audio channels
int sRate=44100;    // Sample rate
short bSamples = 16;// byteSample

ou rien avec ce:

short nChannels=1;// audio channels
int sRate=8000;    // Sample rate
short bSamples = 16;// byteSample

Ce qui est déroutant, c'est que le fait de regarder les paramètres de la reconnaissance vocale tâche de logcat je trouve la première LECTURE fréquence d'échantillonnage de 44100 HZ:

    12-20 14:41:34.007: DEBUG/AudioHardwareALSA(2364): Set PLAYBACK PCM format to S16_LE (Signed 16 bit Little Endian)
    12-20 14:41:34.007: DEBUG/AudioHardwareALSA(2364): Using 2 channels for PLAYBACK.
    12-20 14:41:34.007: DEBUG/AudioHardwareALSA(2364): Set PLAYBACK sample rate to 44100 HZ
    12-20 14:41:34.007: DEBUG/AudioHardwareALSA(2364): Buffer size: 2048
    12-20 14:41:34.007: DEBUG/AudioHardwareALSA(2364): Latency: 46439

et puis aInfo.Taux d'échantillonnage = 8000 , où il joue le fichier à envoyer au serveur de google:

    12-20 14:41:36.152: DEBUG/(2364): PV_Wav_Parser::InitWavParser
12-20 14:41:36.152: DEBUG/(2364): File open Succes
12-20 14:41:36.152: DEBUG/(2364): File SEEK End Succes
...
12-20 14:41:36.152: DEBUG/(2364): PV_Wav_Parser::ReadData
12-20 14:41:36.152: DEBUG/(2364): Data Read buff = RIFF?
12-20 14:41:36.152: DEBUG/(2364): Data Read = RIFF?
12-20 14:41:36.152: DEBUG/(2364): PV_Wav_Parser::ReadData
12-20 14:41:36.152: DEBUG/(2364): Data Read buff = fmt 
...
12-20 14:41:36.152: DEBUG/(2364): PVWAVPARSER_OK
12-20 14:41:36.156: DEBUG/(2364): aInfo.AudioFormat = 1
12-20 14:41:36.156: DEBUG/(2364): aInfo.NumChannels = 1
12-20 14:41:36.156: DEBUG/(2364): aInfo.SampleRate = 8000
12-20 14:41:36.156: DEBUG/(2364): aInfo.ByteRate = 16000
12-20 14:41:36.156: DEBUG/(2364): aInfo.BlockAlign = 2
12-20 14:41:36.156: DEBUG/(2364): aInfo.BitsPerSample = 16
12-20 14:41:36.156: DEBUG/(2364): aInfo.BytesPerSample = 2
12-20 14:41:36.156: DEBUG/(2364): aInfo.NumSamples = 2258

Alors, comment puis-je trouver les paramètres pour enregistrer l'audio de la mémoire tampon dans une bonne wav fichier audio?

6voto

Malcolm Smith Points 1890

Vous n'avez pas compris votre code pour écrire les données PCM, il est donc difficile à diagnostiquer, mais si vous entendez des bruits étranges alors il semble plus probable que vous avez tort endian lorsque vous écrivez les données, ou le mauvais nombre de canaux. L'obtention de la fréquence d'échantillonnage de mal à l'audio de sondage plus ou moins vite, mais si ça sonne complètement déformée c'est probablement une erreur dans la spécification du nombre de canaux ou d'endianess de votre flux d'octets.

Pour en être sûr, tout flux d'octets directement un fichier sans en-tête (raw PCM de données). De cette façon, vous pouvez exclure toute erreur lors de l'écriture de votre fichier d'en-tête. Ensuite utiliser Audacity pour importer les données brutes, d'expérimenter avec les différentes options (profondeur de bits, endian, canaux) jusqu'à ce que vous obtenez un fichier audio qui semble correct (un seul sera à droite). Vous faites cela à partir d'un Fichier->Importer->Données Brutes...

Une fois que vous avez identifié votre octet de format de cette façon, vous n'avez plus à vous inquiéter si vous mettez les en-têtes correctement. Vous pouvez vous reporter à cette référence http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html pour le format de fichier. Ou consultez les liens suivants sur Java existant des solutions sur l'écriture de fichiers audio, Java - la lecture, la manipulation et l'écriture de fichiers WAV , ou FMJ. Bien que je suppose que ce pourrait ne pas être utilisable sur Android.

Si vous lancer votre propre WAV/RIFF écrivain souviens de Java les types de données sont big-endian donc tout multi-octets primitives de vous écrire à votre fichier doit être écrit en inverser l'ordre des octets de match RIFF peu endianess.

2voto

chandru Points 21

8000 , little endian, 16 bits PCM , canal mono a fait le tour

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X