2011-12-20 29 views
38

Tôi đang cố gắng lưu vào một tệp dữ liệu âm thanh được nghe bởi dịch vụ nhận dạng giọng nói của Android.Lưu đầu vào âm thanh của công cụ nhận dạng giọng nói Android Stock

Thật sự tôi thực hiện RecognitionListener như đã giải thích ở đây: Speech to Text on Android

tiết kiệm dữ liệu vào một bộ đệm như minh họa ở đây: Capturing audio sent to Google's speech recognition server

và ghi các bộ đệm vào một tập tin Wav, như ở đây. Android Record raw bytes into WAVE file for Http Streaming

Vấn đề của tôi là cách cài đặt âm thanh phù hợp để lưu vào tiêu đề của tệp wav. Trong thực tế khi tôi chơi file wav chỉ nghe tiếng động lạ, với các thông số này,

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

hoặc không có gì với điều này:

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

gì là khó hiểu là nhìn vào các thông số của nhiệm vụ nhận dạng giọng nói từ logcat tôi thấy Set sample rate PLAYBACK đầu tiên 44.100 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 

và sau đó aInfo.SampleRate = 8000 khi nó đóng file để gửi cho google server:

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 

Vì vậy, làm thế nào tôi có thể tìm hiểu các thông số đúng để lưu đệm âm thanh trong một wav tập tin âm thanh tốt?

+2

Bạn đã bao giờ tìm thấy giải pháp của mình chưa? – Doug

+0

có vẻ như bạn đã nhận được những điều xa nhất về việc này. mmmx, bạn có thể giải quyết vấn đề này không? – ComputerEngineer88

Trả lời

6

Bạn chưa bao gồm mã của mình để thực sự ghi dữ liệu PCM, do đó khó chẩn đoán, nhưng nếu bạn nghe thấy âm thanh lạ thì có vẻ như bạn có sai số endian khi bạn đang ghi dữ liệu hoặc số lượng kênh sai. Lấy tỷ lệ mẫu sai sẽ chỉ dẫn đến âm thanh nghe chậm hơn hoặc nhanh hơn, nhưng nếu âm thanh hoàn toàn bị cắt xén, có thể là do nhầm lẫn trong việc xác định số kênh hoặc endianess luồng byte của bạn.

Để biết chắc chắn, chỉ cần truyền trực tiếp byte của bạn tới tệp mà không có bất kỳ tiêu đề nào (dữ liệu PCM thô). Bằng cách này, bạn có thể loại trừ bất kỳ lỗi nào khi viết tiêu đề tệp của mình. Sau đó sử dụng Audacity để nhập dữ liệu thô, thử nghiệm với các tùy chọn khác nhau (độ sâu bit, cuối, kênh) cho đến khi bạn nhận được tệp âm thanh chính xác (chỉ có một tệp sẽ đúng). Bạn thực hiện việc này từ Tệp-> Nhập-> Dữ liệu thô ...

Khi bạn đã xác định định dạng byte theo cách này, bạn chỉ phải lo lắng liệu bạn có đang đặt tiêu đề chính xác hay không. Bạn có thể tham khảo tài liệu tham khảo này http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html cho định dạng tệp. Hoặc xem các liên kết sau đây trên các giải pháp Java hiện có về cách ghi tệp âm thanh, Java - reading, manipulating and writing WAV files hoặc FMJ. Mặc dù tôi đoán những điều này có thể không sử dụng được trên Android.

Nếu bạn đang phải cuộn của riêng nhà văn WAV/RIFF bạn nhớ các kiểu dữ liệu Java là big-endian vì vậy bất kỳ nguyên thủy đa byte bạn viết thư cho tập tin của bạn phải được viết bằng reverse byte order để phù hợp với ít endianess RIFF của.

2

, little endian, 16 bit PCM, kênh mono đã làm các trick

+0

FWIW, thông tin trên là đúng đối với âm thanh từ Samsung GS2 –

Các vấn đề liên quan