操作系統:Debian 12.5_x64 & Windows10_x64
rnnoise版本:0.2
gcc版本:12.2.0
python版本: 3.9.13
RNNoise是一個將傳統數字信號處理與深度學習相結合的開源實時音頻降噪庫,可在消耗極少計算資源的情況下實現毫秒級降噪,今天整理下這方面的筆記,希望對你有幫助。
該庫涉及算法的描述詳見論文(一種混合 DSP/深度學習方法的實時全頻帶語音增強技術):
https://arxiv.org/pdf/1709.08243
如果打不開,可從文末提供的渠道獲取該論文。
之前整理過如何使用 noisereduce 、 fft 和 Audacity 音頻文件降噪,如有需要可參考:
一、編譯及C使用示例
1、編譯及文件説明
./autogen.sh ./configure make
其中,執行 ./autogen.sh 時,會下載models文件(RNNoise 項目預訓練的模型數據文件,如果下載過慢,可從文末提供的渠道獲取):
rnnoise_data主要包含了項目預訓練好的模型權重,使得用户在編譯 RNNoise 後,無需自己從頭訓練模型,就能直接使用其降噪功能。
rnnoise_data文件裏面是c代碼及pth文件:
這裏面有.c文件和.pth文件,其中:
.c 文件由.pth文件生成,存儲預訓練模型權重,將神經網絡權重以C數組形式嵌入,供降噪算法直接調用,降噪時由 rnnoise_process_frame 等函數直接使用。
.pth 文件存儲訓練模型,用於模型研究、微調或重新訓練,並非RNNoise運行時必需。
使用説明:
1)若只需使用RNNoise的降噪功能,關注編譯好的庫及API即可。
2)若需要優化模型或適配特殊場景,才需研究 .pth 文件及項目的訓練腳本。
2、降噪效果驗證
在examples目錄裏面有可直接運行的demo程序,需要準備s16le 48khz格式的音頻文件。
輸出為pcm格式的文件。
導入效果如下:
降噪效果如下:
這裏用的是Audacity軟件查看降噪效果的,關於Audacity軟件的使用,可參考這篇文章:
https://www.cnblogs.com/MikeZhang/p/audacity2022022.html
3、使用靜態庫二次開發
實際使用過程中,會涉及基於rnnoise庫進行二次開發的情況,這裏提供下簡單示例。
基於rnnoise_demo.c修改的示例代碼如下(test1.c):
#include <stdio.h> #include "rnnoise.h" #define FRAME_SIZE 480 int main(int argc, char **argv) { int i; int first = 1; float x[FRAME_SIZE]; FILE *f1, *fout; DenoiseState *st; st = rnnoise_create(NULL); if (argc!=3) { fprintf(stderr, "usage: %s <noisy speech> <output denoised>\n", argv[0]); return 1; } f1 = fopen(argv[1], "rb"); fout = fopen(argv[2], "wb"); while (1) { short tmp[FRAME_SIZE]; fread(tmp, sizeof(short), FRAME_SIZE, f1); if (feof(f1)) break; for (i=0;i<FRAME_SIZE;i++) x[i] = tmp[i]; rnnoise_process_frame(st, x, x); for (i=0;i<FRAME_SIZE;i++) tmp[i] = x[i]; if (!first) fwrite(tmp, sizeof(short), FRAME_SIZE, fout); first = 0; } rnnoise_destroy(st); fclose(f1); fclose(fout); return 0; }
編譯命令如下:
g++ test1.c -o test1 -Iinclude -static libs/librnnoise.a
CC = g++ CFLAGS = -g -O2 -Wall HDRS= -Iinclude LIBS = -static libs/librnnoise.a # g++ test1.c -o test1 -Iinclude -static libs/librnnoise.a all: make test1 test1:test1.o $(CC) -o test1 test1.o $(LIBS) clean: rm -f test1 rm -f *.o .c.o: $(CC) $(CFLAGS) $(HDRS) -c -o $*.o $<
降噪效果如下:
二、在python中使用rnnoise庫
安裝rnnoise庫:
pip install pyrnnoise
安裝後dll路徑:
示例代碼(rnnoiseTest1.py):
from pyrnnoise import RNNoise # Create denoiser instance denoiser = RNNoise(sample_rate=16000) # Process audio file for speech_prob in denoiser.denoise_wav("mix1.wav", "output.wav"): print(f"Processing frame with speech probability: {speech_prob}")
運行效果如下:
降噪效果如下:
配套代碼及文件可從如下渠道獲取:
三、模型訓練
1、數據集獲取
1)rnnoise_contributions.tar.gz 是 RNNoise 項目提供的一個數據集壓縮包,主要用於訓練 RNNoise 模型;
3)misc目錄只有一個wav音頻文件;
4)models文件夾存儲的訓練好的模型,可直接使用;
2、訓練過程
./dump_features -rir_list rir_list.txt speech.pcm background_noise.pcm foreground_noise.pcm features.f32 <count>
2)可使用腳本 script/dump_features_parallel.sh 加速特徵生成。
使用方法如下:
script/dump_features_parallel.sh ./dump_features speech.pcm background_noise.pcm foreground_noise.pcm features.f32 <count> rir_list.txt
訓練命令如下:
python3 train_rnnoise.py features.f32 output_directory
可選擇適當的訓練輪數(通過 --epochs 參數指定,比如 75000 次),當使權重更新次數達到約 75000 次時,會生成 .pth 文件(比如 rnnoise_50.pth )。
4)將模型文件轉換為 C 代碼。
腳本名稱: dump_rnnoise_weights.py
轉換示例:
python3 dump_rnnoise_weights.py --quantize rnnoise_50.pth rnnoise_c
會自動創建 rnnoise_c 文件夾,然後在該文件夾裏面生成 rnnoise_data.c 和 rnnoise_data.h 文件。
5)在C代碼中使用模型。
複製 rnnoise_data.c 和 rnnoise_data.h 文件到 src/ 目錄,然後按照之前描述的方法編譯 RNNoise 工程,會在examples目錄裏面找到可直接運行的demo程序(rnnoise_demo)。
四、資源獲取
本文相關資源及運行環境,可從如下渠道獲取: