[Speex-dev] voice sound like robot voice :)
Tim Rijavec
rico at gama.us
Mon Sep 7 06:40:47 PDT 2009
a manage to trow out what robot voice, but i can't get rid of nasty noise.
I'll try to replace microphone and i'll see if i get any better quality out
from new microphone.
Lp, Tim
+--------------------------+
| email: rico at gama.us |
| www: http://gama.us |
|--------------------------|
| tel: 00386 31 457 627 |
+--------------------------+
2009/9/3 Tim Rijavec <rico at gama.us>
> 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/20090907/f502da41/attachment.htm
More information about the Speex-dev
mailing list