webrtc的音頻處理模塊分爲降噪ns和nsx,迴音消除aec,回聲控制acem,音頻增益agc,靜音檢測部分。另外webrtc已經封裝好了一套音頻處理模塊APM,若是不是有特殊必要,使用者若是要用到回聲消除等較爲複雜的模塊時,最好使用所有的音頻處理模塊,不要單獨編譯其中一部分以避免浪費寶貴的時間。html
可是音頻降噪,增益功能較爲簡單,還能直接使用。這部分源碼是我從webrtc中摳出來,單獨放到VS2010工程下使用。其中包括重採樣以及濾波,降噪功能。這部分是直接複用以前的博文單獨使用webrtc降噪功能的代碼,也就是說,其實這部分博文只是從以前降噪的基礎上扣出了部分聲音增益的代碼而已。因此關於webrtc的介紹就很少說了,若是有興趣能夠參考以前的博文;git
單獨編譯和使用webrtc音頻降噪模塊(附源碼+測試demo)web
單獨編譯和使用webrtc音頻回聲消除模塊(附完整源碼+測試音頻文件)xcode
由於最近mac電腦不在身邊,因此不知道在xcode下可否編譯,不過簡單看代碼應該問題不大。另外測試效果也極爲不錯,從一首8000採樣率的歌曲能夠看到,其增益前和增益後的波形以下:post
OK,波形還算比較滿意吧?不過實際效果如何,還須要聽一下才知道。測試
其實增益使用起來也很簡單,簡單代碼以下:ui
void WebRtcAgcTest(char *filename, char *outfilename,int fs) { FILE *infp = NULL; FILE *outfp = NULL; short *pData = NULL; short *pOutData = NULL; void *agcHandle = NULL; do { WebRtcAgc_Create(&agcHandle); int minLevel = 0; int maxLevel = 255; int agcMode = kAgcModeFixedDigital; WebRtcAgc_Init(agcHandle, minLevel, maxLevel, agcMode, fs); WebRtcAgc_config_t agcConfig; agcConfig.compressionGaindB = 20; agcConfig.limiterEnable = 1; agcConfig.targetLevelDbfs = 3; WebRtcAgc_set_config(agcHandle, agcConfig); infp = fopen(filename,"rb"); int frameSize = 80; pData = (short*)malloc(frameSize*sizeof(short)); pOutData = (short*)malloc(frameSize*sizeof(short)); outfp = fopen(outfilename,"wb"); int len = frameSize*sizeof(short); int micLevelIn = 0; int micLevelOut = 0; while(TRUE) { memset(pData, 0, len); len = fread(pData, 1, len, infp); if (len > 0) { int inMicLevel = micLevelOut; int outMicLevel = 0; uint8_t saturationWarning; int nAgcRet = WebRtcAgc_Process(agcHandle, pData, NULL, frameSize, pOutData,NULL, inMicLevel, &outMicLevel, 0, &saturationWarning); if (nAgcRet != 0) { printf("failed in WebRtcAgc_Process\n"); break; } micLevelIn = outMicLevel; fwrite(pOutData, 1, len, outfp); } else { break; } } } while (0); fclose(infp); fclose(outfp); free(pData); free(pOutData); WebRtcAgc_Free(agcHandle); }
固然,這段代碼只是對於8K和16K採樣率的音頻,若是是32K採樣率須要採用濾波分頻,而後分別傳入最後傳出,具體用法和降噪是同樣的道理,因此我就再也不單獨列出來了。具體用法能夠下載本文所附的源碼,參考32K採樣率音頻降噪的使用方法使用。spa
源碼下載:WebRtcAudioTest.rarcode