本文共 1710 字,大约阅读时间需要 5 分钟。
#include <speex/speex_echo.h>
#include <speex/speex_preprocess.h> static SpeexEchoState *echo_state = NULL; static SpeexPreprocessState *denoise_state; static pthread_mutex_t mutex_aec; static char* rec_buffer = NULL; static char* play_buffer = NULL; static int sampleRate = 8000; void aec_init(int frame_size) { if(echo_state || denoise_state) return; rec_buffer = (char*)malloc(frame_size*2); play_buffer = (char*)malloc(frame_size*2); echo_state = speex_echo_state_init(frame_size, frame_size*10); denoise_state = speex_preprocess_state_init(frame_size, sampleRate); speex_echo_ctl(echo_state, SPEEX_ECHO_SET_SAMPLING_RATE, &sampleRate); speex_preprocess_ctl(denoise_state, SPEEX_PREPROCESS_SET_ECHO_STATE, echo_state); pthread_mutex_init(&mutex_aec, NULL); } void aec_uninit() { if(echo_state) speex_echo_state_destroy(echo_state); if(denoise_state) speex_preprocess_state_destroy(denoise_state); echo_state = NULL; denoise_state = NULL; pthread_mutex_destroy(&mutex_aec); if(rec_buffer) free(rec_buffer); if(play_buffer) free(play_buffer); play_buffer = NULL; rec_buffer = NULL; } void aec_record_audio(void* audio_rec_buffer, unsigned int audio_data_len) { if(echo_state == NULL || denoise_state == NULL || rec_buffer == NULL) return; memset(rec_buffer, 0, audio_data_len); speex_echo_capture(echo_state, (spx_int16_t*)audio_rec_buffer, (spx_int16_t*)rec_buffer); speex_preprocess_run(denoise_state, (spx_int16_t*)rec_buffer); memcpy(audio_rec_buffer, rec_buffer, audio_data_len); } void aec_play_audio(void* audio_play_buffer, unsigned int audio_data_len) { if(echo_state == NULL || denoise_state == NULL|| play_buffer == NULL) return; speex_echo_playback(echo_state, (spx_int16_t*)audio_play_buffer); }转载地址:http://kpedz.baihongyu.com/