webrtc的音頻處理模塊分為降噪ns和nsx,回音消除aec,回聲控制acem,音頻增益agc,靜音檢測部分。另外webrtc已經封裝好了一套音頻處理模塊APM,如果不是有特殊必要,使用者如果要用到回聲消除等較為復雜的模塊時,最好使用全部的音頻處理模塊,不要單獨編譯其中一部分以免浪費寶貴的時間。
但是音頻降噪,增益功能較為簡單,還能直接使用。這部分源碼是我從webrtc中摳出來,單獨放到VS2010工程下使用。其中包括重采樣以及濾波,降噪功能。這部分是直接復用之前的博文單獨使用webrtc降噪功能的代碼,也就是說,其實這部分博文只是從之前降噪的基礎上扣出了部分聲音增益的代碼而已。所以關於webrtc的介紹就不多說了,如果有興趣可以參考之前的博文;
單獨編譯和使用webrtc音頻降噪模塊(附源碼+測試demo)
單獨編譯和使用webrtc音頻回聲消除模塊(附完整源碼+測試音頻文件)
因為最近mac電腦不在身邊,所以不知道在xcode下能否編譯,不過簡單看代碼應該問題不大。另外測試效果也極為不錯,從一首8000采樣率的歌曲可以看到,其增益前和增益后的波形如下:
OK,波形還算比較滿意吧?不過實際效果如何,還需要聽一下才知道。
其實增益使用起來也很簡單,簡單代碼如下:
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采樣率音頻降噪的使用方法使用。
源碼下載:WebRtcAudioTest.rar