1. 程式人生 > 其它 >語音聊天室原始碼開發,如何實現迴音消除功能?

語音聊天室原始碼開發,如何實現迴音消除功能?

在語音聊天室原始碼開發中,做好迴音消除功能對提升使用者使用體驗非常關鍵,比較完善的迴音消除模組就是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 ; }

使用者在使用語音聊天室原始碼進行語音社交時,語音通話中的回聲是非常影響使用體驗的,所以無論如何都需要在開發時利用一定的技術手段實現回聲消除,以上就是回聲消除功能的實現方式了,希望對大家有幫助。
本文轉載自網路,轉載僅為分享乾貨知識,如有侵權歡迎聯絡雲豹科技進行刪除處理

原文連結:https://www.cnblogs.com/jianglijs/p/8583603.html