2011-12-20 17 views
38

Próbuję zapisać w pliku dane audio słuchane przez usługę rozpoznawania mowy Androida.Zapisywanie danych wejściowych dźwięku z Androida Zdjęcie rozpoznawania mowy silnika

Właściwie zaimplementować RecognitionListener jak wyjaśniono tutaj: Speech to Text on Android

zapisać dane w buforze, jak pokazano tutaj: Capturing audio sent to Google's speech recognition server

i zapis bufora do pliku wav, jak tutaj. Android Record raw bytes into WAVE file for Http Streaming

Mój problem polega na tym, jak uzyskać odpowiednie ustawienia audio do zapisania w nagłówkach pliku wav. W rzeczywistości, kiedy odtworzyć plik wav tylko słychać dziwny dźwięk, z tym parametrów

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

albo nic z tego:

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

Co jest mylące jest to, że patrząc na parametry zadania rozpoznawania mowy z LogCat znajdę pierwszy zestaw ODTWARZANIA częstotliwość próbkowania do 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 

a następnie aInfo.SampleRate = 8000 gdy odtwarza plik do wysłania do serwera 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 

Tak, jak mogę znaleźć odpowiednie parametry, aby zapisać bufor dźwięku w dobrym pliku audio wav?

+2

Czy kiedykolwiek znalazłeś rozwiązanie? – Doug

+0

Wygląda na to, że dotarłeś najdalej, robiąc to. mmmx, czy byłeś w stanie rozwiązać ten problem? – ComputerEngineer88

Odpowiedz

6

Nie uwzględniłeś swojego kodu do faktycznego zapisania danych PCM, więc trudno jest go zdiagnozować, ale jeśli słyszysz dziwne odgłosy, najprawdopodobniej masz błędny endian podczas zapisywania danych, lub złą liczbę kanałów. Osłabienie częstotliwości próbkowania spowoduje jedynie, że dźwięk będzie brzmiał wolniej lub szybciej, ale jeśli brzmi to kompletnie zniekształcone, prawdopodobnie jest to błąd w określaniu liczby kanałów lub nieskończoności strumienia bajtów.

Aby się upewnić, po prostu przenieś swoje bajty bezpośrednio do pliku bez nagłówka (surowe dane PCM). W ten sposób możesz wykluczyć wszelkie błędy podczas pisania nagłówka pliku. Następnie użyj Audacity, aby zaimportować nieprzetworzone dane, eksperymentując z różnymi opcjami (głębia bitowa, endian, kanały), aż uzyskasz plik dźwiękowy, który brzmi poprawnie (tylko jeden będzie miał rację). Robisz to z Plik-> Importuj-> Dane surowe ...

Po zidentyfikowaniu formatu bajtów musisz się tylko martwić, czy ustawiasz nagłówki poprawnie. Możesz odwołać się do tego pliku referencyjnego http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html dla formatu pliku. Lub zobacz następujące łącza w istniejących rozwiązaniach Java do pisania plików audio, Java - reading, manipulating and writing WAV files lub FMJ. Chociaż domyślam się, że te mogą nie być użyteczne w systemie Android.

Jeśli masz toczyć własne WAV/RIFF pisarz pamiętać typy danych Java są big-endian więc wszelkie prymitywy wielobajtowe piszesz do pliku musi być napisana w reverse byte order dopasować riff za mało kolejność bajtów.

2

, little endian, 16 bit PCM, kanał mono wystarczyły

+0

FWIW, powyższe informacje były prawdziwe dla dźwięku z Samsunga GS2 –

Powiązane problemy