動態

詳情 返回 返回

使用RNNoise進行音頻降噪 - 動態 詳情

操作系統: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 音頻文件降噪,如有需要可參考:

https://www.cnblogs.com/MikeZhang/p/18313792/pynr20240720

一、編譯及C使用示例

GitHub地址:
https://github.com/xiph/rnnoise

image 

1、編譯及文件説明

編譯步驟如下:
./autogen.sh
./configure
make

其中,執行 ./autogen.sh 時,會下載models文件(RNNoise 項目預訓練的模型數據文件,如果下載過慢,可從文末提供的渠道獲取):

image

rnnoise_data主要包含了項目預訓練好的模型權重,使得用户在編譯 RNNoise 後,無需自己從頭訓練模型,就能直接使用其降噪功能。

rnnoise_data文件裏面是c代碼及pth文件:

image

這裏面有.c文件和.pth文件,其中:

.c 文件由.pth文件生成,存儲預訓練模型權重,將神經網絡權重以C數組形式嵌入,供降噪算法直接調用,降噪時由 rnnoise_process_frame 等函數直接使用。

.pth 文件存儲訓練模型,用於模型研究、微調或重新訓練,並非RNNoise運行時必需。

使用説明:

1)若只需使用RNNoise的降噪功能,關注編譯好的庫及API即可。

2)若需要優化模型或適配特殊場景,才需研究 .pth 文件及項目的訓練腳本。

2、降噪效果驗證

在examples目錄裏面有可直接運行的demo程序,需要準備s16le 48khz格式的音頻文件。

輸出為pcm格式的文件。

導入效果如下:

image

 降噪效果如下:

image

 這裏用的是Audacity軟件查看降噪效果的,關於Audacity軟件的使用,可參考這篇文章:

https://www.cnblogs.com/MikeZhang/p/audacity2022022.html

關於pcm音頻的播放可參考這篇文章:
https://www.cnblogs.com/MikeZhang/p/pcm20232330.html
配套的音頻文件可從如下渠道獲取:
關注微信公眾號(聊聊博文,文末可掃碼)後回覆 20251031 獲取。

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
也可寫使用Makefile文件:
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 $<
編譯及運行效果如下:

image

降噪效果如下:

image

配套代碼及文件可從如下渠道獲取:
關注微信公眾號(聊聊博文,文末可掃碼)後回覆 20251031 獲取。 

二、在python中使用rnnoise庫

 rnnoise的python庫內置的有降噪模型,不用額外下載模型。
 
pypi地址:
https://pypi.org/project/pyrnnoise/

image

 安裝rnnoise庫:

pip install pyrnnoise
主流平台都支持的:

image

 

安裝時會下載很多依賴庫:

image

 安裝後dll路徑:

image

 示例代碼(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}")

運行效果如下:

image

 降噪效果如下:

image

配套代碼及文件可從如下渠道獲取:

關注微信公眾號(聊聊博文,文末可掃碼)後回覆 20251031 獲取。 

三、模型訓練

這裏做下簡單説明,具體可參考GitHub上的README文檔:
https://github.com/xiph/rnnoise

image

1、數據集獲取

 數據及模型下載地址:
https://media.xiph.org/rnnoise/

image

1)rnnoise_contributions.tar.gz 是 RNNoise 項目提供的一個數據集壓縮包,主要用於訓練 RNNoise 模型;

2)data目錄裏面包含語音數據、噪音數據及其它輔助數據,展開如下;

image

 3)misc目錄只有一個wav音頻文件;

image

 4)models文件夾存儲的訓練好的模型,可直接使用;

image

2、訓練過程

大致過程如下:
1)使用dump_features提取特徵文件。
示例如下:
./dump_features -rir_list rir_list.txt speech.pcm background_noise.pcm foreground_noise.pcm features.f32 <count>
其中  為處理的序列數量,建議至少 10000 次(越多越好,推薦 200000 次以上)。
dump_features在rnnoise的根目錄(編譯後):

image

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
該腳本會啓動多個進程,每個進程處理一定數量的序列,並將結果合併為一個文件。
 
3)執行訓練,生成模型文件。
訓練腳本目錄:torch/rnnoise

image

 訓練命令如下:

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)。

四、資源獲取

本文相關資源及運行環境,可從如下渠道獲取:

關注微信公眾號(聊聊博文,文末可掃碼)後回覆 20251031 獲取。

image

 

user avatar EricsT 頭像 ligaai 頭像 shumile_5f6954c414184 頭像 daqianduan 頭像 eolink 頭像 yian 頭像 aipaobudeshoutao 頭像 wnhyang 頭像 java_study 頭像 jianghushinian 頭像 immerse 頭像 shouke 頭像
點贊 61 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.