[Speex-dev] Speex-dev Digest, Vol 64, Issue 2

Jean-Marc Valin Jean-Marc.Valin at USherbrooke.ca
Thu Sep 3 06:01:32 PDT 2009


Make sure you start from sampleenc.c/sampledec.c (see the doc). That's the best
way to avoid bugs.

Quoting Tim Rijavec <rico at gama.us>:

> hy,
>
> recording and playback is working perfectly without speex.
>
> i have try to set samplerat from 6000 to 441000 and quality from 1 to 10 sam
> with complexy, but the best i can get is with 16000 samplerate, 5quality and
> 3complexy .. but still, the voice that came out is annoying, artificial,
> robot ,...
>
> Lp, Tim
> +--------------------------+
> | email: rico at gama.us      |
> | www:    http://gama.us   |
> |--------------------------|
> | tel:    00386 31 457 627 |
> +--------------------------+
>
>
>
> 2009/9/3 <speex-dev-request at xiph.org>
>
> > Send Speex-dev mailing list submissions to
> >        speex-dev at xiph.org
> >
> > To subscribe or unsubscribe via the World Wide Web, visit
> >        http://lists.xiph.org/mailman/listinfo/speex-dev
> > or, via email, send a message with subject or body 'help' to
> >        speex-dev-request at xiph.org
> >
> > You can reach the person managing the list at
> >        speex-dev-owner at xiph.org
> >
> > When replying, please edit your Subject line so it is more specific
> > than "Re: Contents of Speex-dev digest..."
> >
> >
> > Today's Topics:
> >
> >   1. Re: voice sound like robot voice :) (Greger Burman)
> >   2. Re: voice sound like robot voice :) (Tim Rijavec)
> >
> >
> > ----------------------------------------------------------------------
> >
> > Message: 1
> > Date: Thu, 3 Sep 2009 10:21:49 +0200
> > From: Greger Burman <greger at mobile-robotics.com>
> > Subject: Re: [Speex-dev] voice sound like robot voice :)
> > To: speex-dev at xiph.org
> > Message-ID:
> >        <18b67100909030121w2ef10d34j2c44b81f716924d6 at mail.gmail.com>
> > Content-Type: text/plain; charset="iso-8859-1"
> >
> > Hi Tim!
> >
> > I haven't looked at your code. I would first make sure that recording and
> > playback of audio is working perfectly without the encoder. Bugs in the
> > handling of recording or playback can result in strange noises.
> >
> > cheers
> > Greger
> >
> >
> > 2009/9/2 Tim Rijavec <rico at gama.us>
> >
> > > hy,
> > >
> > > here is my speex encoder/decoder .. the sampleRate i use is 16000 and
> > > quality,complexity are at 5.
> > >
> > > can someone take a look in to the code and see if there is something that
> > > is making that robot voice
> > >
> > > here is a link to colored and numbered code, same as below
> > > http://barvanjekode.gama.us/temp/1257361243.html
> > >
> > > thanx.
> > >
> > > code
> > > -----------------------
> > > #include "codec.h"
> > >
> > > /////////////////////////////////////////////////////////////////
> > > // Constants
> > > /////////////////////////////////////////////////////////////////
> > > #define Cvoicecodecrawbuffersize       16 * Ckilobyte
> > >
> > > /////////////////////////////////////////////////////////////////
> > > //
> > > // TVoiceCodec
> > > //
> > > /////////////////////////////////////////////////////////////////
> > > TVoiceCodec::TVoiceCodec() :
> > > pMode( NULL ),
> > > pPreprocessorState( NULL ),
> > > pCodecEncoderState( NULL ),
> > > encoderQuality( 5 ),
> > > encoderComplexity( 3 ),
> > > encoderFrameSize( 0 ),
> > > encodedFrameBytes( 0 ),
> > > pCodecDecoderState( NULL ),
> > > sampleRate( VOICE_SAMPLE_RATE ),
> > > decoderFrameSize( 0 )
> > > {
> > >    /////////////////////////////////////////////////////////////////
> > >    // Prepare buffers
> > >    /////////////////////////////////////////////////////////////////
> > >    uint voicememsize = Cvoicecodecrawbuffersize + CODEC_MAX_BUFFER_SIZE;
> > >    byte *voicemem = (byte*)pMemoryMng->Alloc(voicememsize);
> > >    memset( voicemem, 0, voicememsize );
> > >
> > >    // raw voice input buffer
> > >    pCodecRawBuffer = voicemem;
> > >    pCodecRawBufferCur = pCodecRawBuffer;
> > >    //
> > >    voicemem += Cvoicecodecrawbuffersize;
> > >
> > >    // input/output voice buffer
> > >    pCodecBuffer = voicemem;
> > > }
> > >
> > >
> > > TVoiceCodec::~TVoiceCodec()
> > > {
> > >    if ( pCodecEncoderState )
> > >    {
> > >       speex_preprocess_state_destroy( pPreprocessorState );
> > >       speex_encoder_destroy( pCodecEncoderState );
> > >       speex_bits_destroy( &codecBits );
> > >       pCodecEncoderState = NULL;
> > >    }
> > >
> > >    if ( pCodecDecoderState )
> > >    {
> > >       speex_decoder_destroy( pCodecDecoderState );
> > >       speex_bits_destroy( &codecBits );
> > >       pCodecDecoderState = NULL;
> > >    }
> > > }
> > >
> > >
> > > void TVoiceCodec::setSampleRate( int samplerate )
> > > {
> > >    sampleRate = samplerate;
> > >
> > >    // determine the mode
> > >    int modeID = -1;
> > >
> > >    // speex has limits [6000 - 48000]
> > >    if ( sampleRate > 48000 )
> > >       return;
> > >
> > >    if ( sampleRate > 25000 )
> > >       modeID = SPEEX_MODEID_UWB;
> > >    else if ( sampleRate > 12500 )
> > >       modeID = SPEEX_MODEID_WB;
> > >    else if ( sampleRate >= 6000 )
> > >       modeID = SPEEX_MODEID_NB;
> > >    else
> > >       return;
> > >
> > >    // set up mode
> > >    pMode = speex_lib_get_mode( modeID );
> > > }
> > >
> > > void TVoiceCodec::setupEncoder( uint quality, uint complexity  )
> > > {
> > >    encoderQuality = quality;
> > >    encoderComplexity = complexity;
> > >
> > >    // catch invalid sample rates resulting in invalid mode
> > >    if ( !pMode )
> > >       return;
> > >    //
> > >    assert( ( pCodecEncoderState == NULL ) && "encoder already
> > initialized"
> > > );
> > >    //
> > >    int enabled   = 1;
> > >    int disabled  = 0;
> > >    //
> > >    float highpass = 80;
> > >
> > >    // setup encoder
> > >    pCodecEncoderState = speex_encoder_init( pMode );
> > >    //
> > >    speex_encoder_ctl( pCodecEncoderState, SPEEX_SET_SAMPLING_RATE,
> > > &sampleRate );
> > >    speex_encoder_ctl( pCodecEncoderState, SPEEX_SET_COMPLEXITY,
> > > &encoderComplexity );
> > >    speex_encoder_ctl( pCodecEncoderState, SPEEX_SET_QUALITY,
> > > &encoderQuality );
> > >    speex_encoder_ctl( pCodecEncoderState, SPEEX_SET_VBR,
> > > &disabled );
> > >    speex_encoder_ctl( pCodecEncoderState, SPEEX_SET_DTX,
> > > &disabled );
> > >
> > >    // init encoder
> > >    speex_bits_init( &codecBits );
> > >    speex_bits_reset( &codecBits );
> > >
> > >    // determine encoded bytes per frame with spx_int16_t type, speex can
> > > work with float;s, but not in this engine
> > >    speex_encode_int( pCodecEncoderState, (spx_int16_t*)pCodecBuffer,
> > > &codecBits );
> > >    encodedFrameBytes = (uint)speex_bits_nbytes( &codecBits );
> > >
> > >    // setup preprocessor
> > >    speex_encoder_ctl( pCodecEncoderState, SPEEX_GET_FRAME_SIZE,
> > > &encoderFrameSize );
> > >    //
> > >    pPreprocessorState = speex_preprocess_state_init( encoderFrameSize,
> > > sampleRate );
> > >    //
> > >    speex_preprocess_ctl( pPreprocessorState,
> > SPEEX_PREPROCESS_SET_DENOISE,
> > > &enabled );
> > >    speex_preprocess_ctl( pPreprocessorState, SPEEX_PREPROCESS_SET_VAD,
> > > &disabled );
> > > }
> > >
> > > void TVoiceCodec::setupDecoder()
> > > {
> > >    // catch invalid sample rates resulting in invalid mode
> > >    if ( !pMode )
> > >       return;
> > >    //
> > >    assert( ( pCodecDecoderState == NULL ) && "decoder already
> > initialized"
> > > );
> > >    //
> > >    int enabled = 1;
> > >    //
> > >    pCodecDecoderState = speex_decoder_init( pMode );
> > >    speex_decoder_ctl( pCodecDecoderState, SPEEX_SET_SAMPLING_RATE,
> > > &sampleRate );
> > >    speex_decoder_ctl( pCodecDecoderState, SPEEX_GET_FRAME_SIZE,
> > > &decoderFrameSize );
> > >    speex_decoder_ctl( pCodecDecoderState, SPEEX_SET_ENH,
> > > &enabled );
> > >    //
> > >    speex_bits_init( &codecBits );
> > > }
> > >
> > > uint TVoiceCodec::encode( byte *rawsoundbuffer, uint length, char
> > > *bitbuffer, float gain )
> > > {
> > >    if( !pCodecEncoderState )
> > >       return 1;
> > >
> > >    // copy raw voice data to temporary codec raw voice data buffer
> > >    memcpy( pCodecRawBufferCur, rawsoundbuffer, length );
> > >    pCodecRawBufferCur += length;
> > >
> > >    // determine the size of data
> > >    uint buffersize = (int)( pCodecRawBufferCur - pCodecRawBuffer );
> > >
> > >    // do we have enough data for encoding?
> > >    if ( buffersize < encoderFrameSize )
> > >    {
> > >       //pLog->Add("codec: encoder: return: buffersize: %d: needtoencode
> > > %d", buffersize, encoderFrameSize);
> > >       return 0;
> > >    }
> > >
> > >    int encodedbytes  = 0;
> > >    int pos = 0;
> > >    // while we have enough data
> > >    while( (uint)( pCodecRawBufferCur - pCodecRawBuffer ) >=
> > > encoderFrameSize )
> > >    {
> > >       // copy data from temporary buffer to codec buffer
> > >       memcpy( pCodecBuffer, pCodecRawBuffer, encoderFrameSize );
> > >
> > >       // move memory of temporary buffer
> > >       memmove( pCodecRawBuffer, pCodecRawBuffer + encoderFrameSize,
> > > buffersize - ( pos + encoderFrameSize ) );
> > >       pCodecRawBufferCur -= encoderFrameSize;
> > >
> > >       // increase current pos
> > >       pos += encoderFrameSize;
> > >
> > >       //encode
> > >       speex_bits_reset( &codecBits );
> > >       //
> > >       speex_encode_int( pCodecEncoderState, (spx_int16_t*)pCodecBuffer,
> > > &codecBits );
> > >       //
> > >       int nb = speex_bits_nbytes( &codecBits );
> > >       encodedbytes += speex_bits_write( &codecBits,
> > > &bitbuffer[encodedbytes], nb );
> > >    }
> > >
> > >    //pLog->Add("buffersize: %d: total left: %d enc buffersize: %d",
> > length,
> > > inputBufferArray.Count(), encodedbytes );
> > >    return encodedbytes;
> > > }
> > >
> > > uint TVoiceCodec::decode( char *bitbuffer, uint length, byte
> > *samplearray,
> > > float gain )
> > > {
> > >    // return if decoder is not initialized
> > >    if( !pCodecDecoderState )
> > >       return 0;
> > >
> > >    // return if there is not enough data to decode
> > >    if ( length < encodedFrameBytes )
> > >       return 0;
> > >
> > >    int buffersize       = length;
> > >    uint decodedbytes    = 0;
> > >    int pos              = 0;
> > >    //
> > >    while( (int)buffersize - (int)encodedFrameBytes >= 0 )
> > >    {
> > >       speex_bits_reset( &codecBits );
> > >       speex_bits_read_from( &codecBits, bitbuffer + pos,
> > encodedFrameBytes
> > > );
> > >       //
> > >       if( speex_decode_int( pCodecDecoderState, &codecBits,
> > > (spx_int16_t*)pCodecBuffer ) == 0 )
> > >       {
> > >          memcpy( &samplearray[decodedbytes], pCodecBuffer,
> > decoderFrameSize
> > > );
> > >          decodedbytes += decoderFrameSize;
> > >       }
> > >       //
> > >       pos += encodedFrameBytes;
> > >       buffersize -= encodedFrameBytes;
> > >    }
> > >
> > >    return decodedbytes;
> > > }
> > >
> > > -----------------------
> > > code
> > >
> > > Lp, Tim
> > > +--------------------------+
> > > | email: rico at gama.us      |
> > > | www:    http://gama.us   |
> > > |--------------------------|
> > > | tel:    00386 31 457 627 |
> > > +--------------------------+
> > >
> > >
> > > _______________________________________________
> > > Speex-dev mailing list
> > > Speex-dev at xiph.org
> > > http://lists.xiph.org/mailman/listinfo/speex-dev
> > >
> > >
> > -------------- next part --------------
> > An HTML attachment was scrubbed...
> > URL:
> >
>
http://lists.xiph.org/pipermail/speex-dev/attachments/20090903/86415e92/attachment-0001.htm
> >
> > ------------------------------
> >
> > Message: 2
> > Date: Thu, 3 Sep 2009 14:20:38 +0200
> > From: Tim Rijavec <rico at gama.us>
> > Subject: Re: [Speex-dev] voice sound like robot voice :)
> > To: speex-dev at xiph.org
> > Message-ID:
> >        <55bb9c6f0909030520x6f9f500tfdc1e6211d5b8003 at mail.gmail.com>
> > Content-Type: text/plain; charset="iso-8859-1"
> >
> > hy,
> > recording and playback without speex is working perfectly
> >
> >
> > Lp, Tim
> > +--------------------------+
> > | email: rico at gama.us      |
> > | www:    http://gama.us   |
> > |--------------------------|
> > | tel:    00386 31 457 627 |
> > +--------------------------+
> >
> >
> >
> > 2009/9/2 Tim Rijavec <rico at gama.us>
> >
> > > hy,
> > >
> > > here is my speex encoder/decoder .. the sampleRate i use is 16000 and
> > > quality,complexity are at 5.
> > >
> > > can someone take a look in to the code and see if there is something that
> > > is making that robot voice
> > >
> > > here is a link to colored and numbered code, same as below
> > > http://barvanjekode.gama.us/temp/1257361243.html
> > >
> > > thanx.
> > >
> > > code
> > > -----------------------
> > > #include "codec.h"
> > >
> > > /////////////////////////////////////////////////////////////////
> > > // Constants
> > > /////////////////////////////////////////////////////////////////
> > > #define Cvoicecodecrawbuffersize       16 * Ckilobyte
> > >
> > > /////////////////////////////////////////////////////////////////
> > > //
> > > // TVoiceCodec
> > > //
> > > /////////////////////////////////////////////////////////////////
> > > TVoiceCodec::TVoiceCodec() :
> > > pMode( NULL ),
> > > pPreprocessorState( NULL ),
> > > pCodecEncoderState( NULL ),
> > > encoderQuality( 5 ),
> > > encoderComplexity( 3 ),
> > > encoderFrameSize( 0 ),
> > > encodedFrameBytes( 0 ),
> > > pCodecDecoderState( NULL ),
> > > sampleRate( VOICE_SAMPLE_RATE ),
> > > decoderFrameSize( 0 )
> > > {
> > >    /////////////////////////////////////////////////////////////////
> > >    // Prepare buffers
> > >    /////////////////////////////////////////////////////////////////
> > >    uint voicememsize = Cvoicecodecrawbuffersize + CODEC_MAX_BUFFER_SIZE;
> > >    byte *voicemem = (byte*)pMemoryMng->Alloc(voicememsize);
> > >    memset( voicemem, 0, voicememsize );
> > >
> > >    // raw voice input buffer
> > >    pCodecRawBuffer = voicemem;
> > >    pCodecRawBufferCur = pCodecRawBuffer;
> > >    //
> > >    voicemem += Cvoicecodecrawbuffersize;
> > >
> > >    // input/output voice buffer
> > >    pCodecBuffer = voicemem;
> > > }
> > >
> > >
> > > TVoiceCodec::~TVoiceCodec()
> > > {
> > >    if ( pCodecEncoderState )
> > >    {
> > >       speex_preprocess_state_destroy( pPreprocessorState );
> > >       speex_encoder_destroy( pCodecEncoderState );
> > >       speex_bits_destroy( &codecBits );
> > >       pCodecEncoderState = NULL;
> > >    }
> > >
> > >    if ( pCodecDecoderState )
> > >    {
> > >       speex_decoder_destroy( pCodecDecoderState );
> > >       speex_bits_destroy( &codecBits );
> > >       pCodecDecoderState = NULL;
> > >    }
> > > }
> > >
> > >
> > > void TVoiceCodec::setSampleRate( int samplerate )
> > > {
> > >    sampleRate = samplerate;
> > >
> > >    // determine the mode
> > >    int modeID = -1;
> > >
> > >    // speex has limits [6000 - 48000]
> > >    if ( sampleRate > 48000 )
> > >       return;
> > >
> > >    if ( sampleRate > 25000 )
> > >       modeID = SPEEX_MODEID_UWB;
> > >    else if ( sampleRate > 12500 )
> > >       modeID = SPEEX_MODEID_WB;
> > >    else if ( sampleRate >= 6000 )
> > >       modeID = SPEEX_MODEID_NB;
> > >    else
> > >       return;
> > >
> > >    // set up mode
> > >    pMode = speex_lib_get_mode( modeID );
> > > }
> > >
> > > void TVoiceCodec::setupEncoder( uint quality, uint complexity  )
> > > {
> > >    encoderQuality = quality;
> > >    encoderComplexity = complexity;
> > >
> > >    // catch invalid sample rates resulting in invalid mode
> > >    if ( !pMode )
> > >       return;
> > >    //
> > >    assert( ( pCodecEncoderState == NULL ) && "encoder already
> > initialized"
> > > );
> > >    //
> > >    int enabled   = 1;
> > >    int disabled  = 0;
> > >    //
> > >    float highpass = 80;
> > >
> > >    // setup encoder
> > >    pCodecEncoderState = speex_encoder_init( pMode );
> > >    //
> > >    speex_encoder_ctl( pCodecEncoderState, SPEEX_SET_SAMPLING_RATE,
> > > &sampleRate );
> > >    speex_encoder_ctl( pCodecEncoderState, SPEEX_SET_COMPLEXITY,
> > > &encoderComplexity );
> > >    speex_encoder_ctl( pCodecEncoderState, SPEEX_SET_QUALITY,
> > > &encoderQuality );
> > >    speex_encoder_ctl( pCodecEncoderState, SPEEX_SET_VBR,
> > > &disabled );
> > >    speex_encoder_ctl( pCodecEncoderState, SPEEX_SET_DTX,
> > > &disabled );
> > >
> > >    // init encoder
> > >    speex_bits_init( &codecBits );
> > >    speex_bits_reset( &codecBits );
> > >
> > >    // determine encoded bytes per frame with spx_int16_t type, speex can
> > > work with float;s, but not in this engine
> > >    speex_encode_int( pCodecEncoderState, (spx_int16_t*)pCodecBuffer,
> > > &codecBits );
> > >    encodedFrameBytes = (uint)speex_bits_nbytes( &codecBits );
> > >
> > >    // setup preprocessor
> > >    speex_encoder_ctl( pCodecEncoderState, SPEEX_GET_FRAME_SIZE,
> > > &encoderFrameSize );
> > >    //
> > >    pPreprocessorState = speex_preprocess_state_init( encoderFrameSize,
> > > sampleRate );
> > >    //
> > >    speex_preprocess_ctl( pPreprocessorState,
> > SPEEX_PREPROCESS_SET_DENOISE,
> > > &enabled );
> > >    speex_preprocess_ctl( pPreprocessorState, SPEEX_PREPROCESS_SET_VAD,
> > > &disabled );
> > > }
> > >
> > > void TVoiceCodec::setupDecoder()
> > > {
> > >    // catch invalid sample rates resulting in invalid mode
> > >    if ( !pMode )
> > >       return;
> > >    //
> > >    assert( ( pCodecDecoderState == NULL ) && "decoder already
> > initialized"
> > > );
> > >    //
> > >    int enabled = 1;
> > >    //
> > >    pCodecDecoderState = speex_decoder_init( pMode );
> > >    speex_decoder_ctl( pCodecDecoderState, SPEEX_SET_SAMPLING_RATE,
> > > &sampleRate );
> > >    speex_decoder_ctl( pCodecDecoderState, SPEEX_GET_FRAME_SIZE,
> > > &decoderFrameSize );
> > >    speex_decoder_ctl( pCodecDecoderState, SPEEX_SET_ENH,
> > > &enabled );
> > >    //
> > >    speex_bits_init( &codecBits );
> > > }
> > >
> > > uint TVoiceCodec::encode( byte *rawsoundbuffer, uint length, char
> > > *bitbuffer, float gain )
> > > {
> > >    if( !pCodecEncoderState )
> > >       return 1;
> > >
> > >    // copy raw voice data to temporary codec raw voice data buffer
> > >    memcpy( pCodecRawBufferCur, rawsoundbuffer, length );
> > >    pCodecRawBufferCur += length;
> > >
> > >    // determine the size of data
> > >    uint buffersize = (int)( pCodecRawBufferCur - pCodecRawBuffer );
> > >
> > >    // do we have enough data for encoding?
> > >    if ( buffersize < encoderFrameSize )
> > >    {
> > >       //pLog->Add("codec: encoder: return: buffersize: %d: needtoencode
> > > %d", buffersize, encoderFrameSize);
> > >       return 0;
> > >    }
> > >
> > >    int encodedbytes  = 0;
> > >    int pos = 0;
> > >    // while we have enough data
> > >    while( (uint)( pCodecRawBufferCur - pCodecRawBuffer ) >=
> > > encoderFrameSize )
> > >    {
> > >       // copy data from temporary buffer to codec buffer
> > >       memcpy( pCodecBuffer, pCodecRawBuffer, encoderFrameSize );
> > >
> > >       // move memory of temporary buffer
> > >       memmove( pCodecRawBuffer, pCodecRawBuffer + encoderFrameSize,
> > > buffersize - ( pos + encoderFrameSize ) );
> > >       pCodecRawBufferCur -= encoderFrameSize;
> > >
> > >       // increase current pos
> > >       pos += encoderFrameSize;
> > >
> > >       //encode
> > >       speex_bits_reset( &codecBits );
> > >       //
> > >       speex_encode_int( pCodecEncoderState, (spx_int16_t*)pCodecBuffer,
> > > &codecBits );
> > >       //
> > >       int nb = speex_bits_nbytes( &codecBits );
> > >       encodedbytes += speex_bits_write( &codecBits,
> > > &bitbuffer[encodedbytes], nb );
> > >    }
> > >
> > >    //pLog->Add("buffersize: %d: total left: %d enc buffersize: %d",
> > length,
> > > inputBufferArray.Count(), encodedbytes );
> > >    return encodedbytes;
> > > }
> > >
> > > uint TVoiceCodec::decode( char *bitbuffer, uint length, byte
> > *samplearray,
> > > float gain )
> > > {
> > >    // return if decoder is not initialized
> > >    if( !pCodecDecoderState )
> > >       return 0;
> > >
> > >    // return if there is not enough data to decode
> > >    if ( length < encodedFrameBytes )
> > >       return 0;
> > >
> > >    int buffersize       = length;
> > >    uint decodedbytes    = 0;
> > >    int pos              = 0;
> > >    //
> > >    while( (int)buffersize - (int)encodedFrameBytes >= 0 )
> > >    {
> > >       speex_bits_reset( &codecBits );
> > >       speex_bits_read_from( &codecBits, bitbuffer + pos,
> > encodedFrameBytes
> > > );
> > >       //
> > >       if( speex_decode_int( pCodecDecoderState, &codecBits,
> > > (spx_int16_t*)pCodecBuffer ) == 0 )
> > >       {
> > >          memcpy( &samplearray[decodedbytes], pCodecBuffer,
> > decoderFrameSize
> > > );
> > >          decodedbytes += decoderFrameSize;
> > >       }
> > >       //
> > >       pos += encodedFrameBytes;
> > >       buffersize -= encodedFrameBytes;
> > >    }
> > >
> > >    return decodedbytes;
> > > }
> > >
> > > -----------------------
> > > code
> > >
> > > Lp, Tim
> > > +--------------------------+
> > > | email: rico at gama.us      |
> > > | www:    http://gama.us   |
> > > |--------------------------|
> > > | tel:    00386 31 457 627 |
> > > +--------------------------+
> > >
> > >
> > -------------- next part --------------
> > An HTML attachment was scrubbed...
> > URL:
> >
>
http://lists.xiph.org/pipermail/speex-dev/attachments/20090903/5a8cf708/attachment.htm
> >
> > ------------------------------
> >
> > _______________________________________________
> > Speex-dev mailing list
> > Speex-dev at xiph.org
> > http://lists.xiph.org/mailman/listinfo/speex-dev
> >
> >
> > End of Speex-dev Digest, Vol 64, Issue 2
> > ****************************************
> >
>





More information about the Speex-dev mailing list