[Speex-dev] Speex encoding/decoding producing garbled audio

Jean-Marc Valin jean-marc.valin at usherbrooke.ca
Sun Sep 12 19:38:17 PDT 2004


Hi,

If you're having problems with simple encoding/decoding with Speex, I
strongly suggest starting with the sampleenc.c/sampledec.c programs that
are included in the appendix of the manual. From there, you can start
adding more stuff, but at least you start from something that works. If
you need a more complicated example, see speexenc.c and speexdec.c .

	Jean-Marc

On dim, 2004-09-12 at 19:03 -0400, Nathaniel Meyer wrote:
> I'm getting garbled playback with decoded fragments and I'm hoping someone 
> here can point me in the right direction to correcting the problem.
> 
> 
> 
> Essentially I'm capturing audio from the microphone. I stream it over the 
> net, but for testing purposes with this API I'm just grabbing the whole 
> chunk and encoding / decoding it right away and then updating the sound 
> buffer for playback. The playback sounds very scratchy with a bit of a buzz 
> sound and some skipping; yet I can still make it out somewhat. At first I 
> though maybe I was doing data conversion between bytes and shorts 
> incorrectly, so I temporarily moved over to a short-based system. Still the 
> problem persisted, so perhaps it could be a setting or two I'm missing? I 
> posted my code below, demonstrating how I'm encoding and decoding the 
> buffers. I can't see anything wrong with it, so I'm guessing my problem lies 
> elsewhere. If anyone experienced a similar problem beforehand, it would be 
> nice to know what I could be doing wrong. As far as the system itself, I can 
> perfectly record audio at any channel setting, sample rate, or bit-rate and 
> play it back fine.
> 
> 
> 
> - I'm using Speex version 1.1.6. I've also used 1.0.4 beforehand and 
> experienced the same problem with it.
> 
> 
> 
> 1) I initialize the bits, encoder, and decoder as normal (default settings 
> seemed appropriate):
> 
> speex_bits_init(&mBits);
> 
> mEncode = speex_encoder_init(&speex_nb_mode);
> 
> mDecode = speex_decoder_init(&speex_nb_mode);
> 
> 
> 
> 2) I record my audio at mono 8000Hz, 16bits per sample.
> 
> 
> 
> 3) I encode frame-sized (320 bytes) fragments. Since I deal only with char 
> data types, I convert to 2-byte short values first and then set the float 
> buffer.
> 
> char *CSpeex::encode (char *buffer, int size, int &encodeSize)
> 
> {
> 
>       char *encodedBuffer = new char[160];
> 
>       short speexShort;
> 
>       float *speexFloat = new float[160];
> 
> 
> 
>       // Convert the audio to a short then to a float buffer
> 
>       for (int i = 0; i < 160; i++)
> 
>       {
> 
>             memcpy(&speexShort, &buffer[i*2], sizeof(short));
> 
>             speexFloat[i] = speexShort;
> 
>       }
> 
> 
> 
>       // Encode the sound data using the float buffer
> 
>       speex_bits_reset(&mBits);
> 
>       speex_encode(mEncode, speexFloat, &mBits);
> 
>       encodeSize = speex_bits_write(&mBits, encodedBuffer, 160);
> 
>       delete[] speexFloat;
> 
> 
> 
>       // Return the encoded buffer
> 
>       return encodedBuffer;
> 
> }
> 
> 
> 
> 4) I immediately decode the encoded buffer. Encoded size is always 38 bytes 
> for this sample set and expected decoded size is 320 bytes
> 
> char *CSpeex::decode (char *buffer, int encodeSize)
> 
> {
> 
>       char *decodedBuffer = new char[320];
> 
>       short speexShort;
> 
>       float *speexFloat = new float[160];
> 
> 
> 
>       // Decode the sound data into a float buffer
> 
> speex_bits_reset(&mBits);
> 
>       speex_bits_read_from(&mBits, buffer, encodeSize);
> 
>       speex_decode(mDecode, &mBits, speexFloat);
> 
> 
> 
>       // Convert from float to short to char
> 
>       for (int i = 0; i < 160; i++)
> 
>       {
> 
>             speexShort = speexFloat[i];
> 
>             memcpy(&decodedBuffer[i*2], &speexShort, sizeof(short));
> 
>       }
> 
>       delete[] speexFloat;
> 
> 
> 
>       // Return the buffer
> 
>       return decodedBuffer;
> 
> }
> 
> 
> 
> 
> 
> Hope no one minds the source post. I'm really stumped on this one, but the 
> benefits of using Speex versus the bloat offered in the competitors are well 
> worth the hassle. I'm looking forward to incorporating this into several 
> games for VoIP support.
> 
> 
> 
> 
> 
> Thanks.
> _______________________________________________
> Speex-dev mailing list
> Speex-dev at xiph.org
> http://lists.xiph.org/mailman/listinfo/speex-dev




More information about the Speex-dev mailing list