在语音聊天室源码开发中,做好回音消除功能对提升用户使用体验非常关键,比较完善的回音消除模块就是Speex了,有许多中小公司也拿它作为回音消除功能 。经过测试,Speex的消除效果还是不错的。
编写个jni文件,NDK 环境编译一下即可得到so 文件,在Android环境中调用即可。
//初始化回音消除参数
/*
* jint frame_size 帧长 一般都是 80,160,320
* jint filter_length 尾长 一般都是 80*25 ,160*25 ,320*25
* jint sampling_rate 采样频率 一般都是 8000,16000,32000
* 比如初始化
* InitAudioAEC(80, 80*25,8000) //8K,10毫秒采样一次
* InitAudioAEC(160,160*25,16000) //16K,10毫秒采样一次
* InitAudioAEC(320,320*25,32000) //32K,10毫秒采样一次
*/
jint Java_com_audioaec_talkdemo_AudioAEC_InitAudioAEC( JNIEnv* env,jobject thiz,
jint frame_size,jint filter_length,jint sampling_rate)
{
if(nInitSuccessFlag == 1)
return 1 ;
m_nFrameSize = frame_size;
m_nFilterLen = filter_length;
m_nSampleRate = sampling_rate;
//计算采样时长,即是10毫秒,还是20毫秒,还是30毫秒
nSampleTimeLong = (frame_size / (sampling_rate / 100)) * 10 ;
m_pState = speex_echo_state_init(m_nFrameSize, m_nFilterLen);
if(m_pState == NULL)
return -1 ;
m_pPreprocessorState = speex_preprocess_state_init(m_nFrameSize, m_nSampleRate);
if(m_pPreprocessorState == NULL)
return -2 ;
iArg = m_nSampleRate;
speex_echo_ctl(m_pState, SPEEX_SET_SAMPLING_RATE, &iArg);
speex_preprocess_ctl(m_pPreprocessorState, SPEEX_PREPROCESS_SET_ECHO_STATE, m_pState);
nInitSuccessFlag = 1 ;
return 1 ;
}
/*
参数:
jbyteArray recordArray 录音数据
jbyteArray playArray 放音数据
jbyteArray szOutArray
*/
jint Java_com_audioaec_talkdemo_AudioAEC_AudioAECProc(JNIEnv* env,jobject thiz,
jbyteArray recordArray,jbyteArray playArray,jbyteArray szOutArray )
{
if(nInitSuccessFlag == 0)
return 0 ;
jbyte* recordBuffer = (jbyte *)(*env)->GetByteArrayElements(env,recordArray, 0);
jbyte* playBuffer = (jbyte *)(*env)->GetByteArrayElements(env,playArray, 0);
jbyte* szOutBuffer = (jbyte *)(*env)->GetByteArrayElements(env,szOutArray, 0);
speex_echo_cancellation(m_pState,(spx_int16_t *)recordBuffer,
(spx_int16_t *)playBuffer,(spx_int16_t *)szOutBuffer);
int flag=speex_preprocess_run(m_pPreprocessorState,(spx_int16_t *)szOutBuffer);
(*env)->ReleaseByteArrayElements(env,recordArray,recordBuffer,0) ;
(*env)->ReleaseByteArrayElements(env,playArray,playBuffer,0) ;
(*env)->ReleaseByteArrayElements(env,szOutArray,szOutBuffer,0) ;
return 1 ;
}
//退出
jint Java_com_sosea_xmeeting_SpeexAEC_ExitSpeexDsp( JNIEnv* env,jobject thiz)
{
if(nInitSuccessFlag == 0)
return 0 ;
if (m_pState != NULL)
{
speex_echo_state_destroy(m_pState);
m_pState = NULL;
}
if (m_pPreprocessorState != NULL)
{
speex_preprocess_state_destroy(m_pPreprocessorState);
m_pPreprocessorState = NULL;
}
nInitSuccessFlag = 0 ;
return 1 ;
}
用户在使用语音聊天室源码进行语音社交时,语音通话中的回声是非常影响使用体验的,所以无论如何都需要在开发时利用一定的技术手段实现回声消除,以上就是回声消除功能的实现方式了,希望对大家有帮助。
本文转载自网络,转载仅为分享干货知识,如有侵权欢迎联系云豹科技进行删除处理