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 > **************************************** >-------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.xiph.org/pipermail/speex-dev/attachments/20090903/fe825970/attachment-0001.htm
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 > > **************************************** > > >