xiph/rnnoise
GitHub: xiph/rnnoise
RNNoise 是一个基于循环神经网络与混合 DSP/深度学习方法的开源实时音频降噪库,旨在高效去除语音信号中的背景与前景噪声。
Stars: 5731 | Forks: 1065
RNNoise 是一个基于循环神经网络的噪声抑制库。
该算法的详细描述在以下论文中提供:
J.-M. Valin, A Hybrid DSP/Deep Learning Approach to Real-Time Full-Band Speech
Enhancement, Proceedings of IEEE Multimedia Signal Processing (MMSP) Workshop,
arXiv:1709.08243, 2018.
https://arxiv.org/pdf/1709.08243.pdf
版本 0.1 的交互式演示可在此处获取:https://jmvalin.ca/demo/rnnoise/
要编译,只需输入:
% ./autogen.sh
% ./configure
% make
可选步骤:
% make install
建议在 CFLAGS 中将 -march= 设置为支持 AVX2 的架构,
或者在 configure 脚本中添加 --enable-x86-rtcd,
以便至少能够选择使用 AVX2(或 SSE4.1)。
请注意,autogen.sh 脚本会自动从 Xiph.Org 服务器下载模型文件,
因为这些文件太大,无法放入 Git 中。
虽然它被设计为作为一个库使用,但也提供了一个简单的命令行工具作为示例。
它处理采样率为 48 kHz 的 RAW 16 位(机器字节序)单声道 PCM 文件。
用法如下:
% ./examples/rnnoise_demo
输出同样是 16 位原始 PCM 文件。
再次提醒,输入和输出均为 RAW 格式,而不是 WAV 格式。
最新版本的源码可从 https://gitlab.xiph.org/xiph/rnnoise 获取。
GitHub 仓库仅为便利副本。
== 训练 ==
RNNoise 发布的模型现在仅使用下方列出的公开数据集,
并遵循此处描述的训练流程进行训练。确切的结果仍将取决于
所用数据的精确组合、训练时长以及涉及的各种随机种子。
要训练 RNNoise 模型,您需要纯净语音数据和噪声数据。
两者均需以 48 kHz 采样率、16 位 PCM 格式(机器字节序)提供。
纯净语音数据可以从 datasets.txt 文件中列出的数据集获取,
或者直接下载这些文件合并后的版本:
https://media.xiph.org/rnnoise/data/tts_speech_48k.sw
对于噪声数据,我们建议使用 https://media.xiph.org/rnnoise/data/ 中的
background_noise.sw 和 foreground_noise.sw(或更高版本)噪声文件。
foreground_noise.sw 文件包含旨在叠加到背景噪声中的噪声信号
(如键盘敲击声)。此外,前景噪声文件甚至可以使用传统的降噪器
(如 libspeexdsp)进行处理,以仅保留瞬态成分。对于背景噪声,
原始 RNNoise 噪声集的数据现已进行充分过滤,无论是单独使用
还是与 background_noise.sw 文件结合使用,均能提供良好的效果。
该数据集(2025年1月30日更新)可从以下地址下载:
https://media.xiph.org/rnnoise/rnnoise_contributions.tar.gz
第一步是获取语音和噪声,并以多种方式将它们混合,以模拟现实条件
(包括停顿、滤波等)。假设文件名为 speech.pcm 和 noise.pcm,
首先通过以下命令生成训练特征数据:
% ./dump_features speech.pcm background_noise.pcm foreground_noise.pcm features.f32
其中 是要处理的序列数。序列数量至少应为 10000,但越多越好
(建议为 200000 或更多)。
作为可选项,训练还可以模拟混响,在这种情况下还需要房间脉冲响应
(RIR)数据。有限的 RIR 数据可在以下地址获取:
https://media.xiph.org/rnnoise/data/measured_rirs-v2.tar.gz
这些文件的格式为原始 32 位浮点数(文件为小端序)。
假设所有 RIR 文件的列表包含在 rir_list.txt 文件中,
则可以通过以下命令生成训练特征数据:
% ./dump_features -rir_list rir_list.txt speech.pcm background_noise.pcm foreground_noise.pcm features.f32
为了加快特征生成的速度,您可以使用 script/dump_features_parallel.sh
提供的脚本(如果您想添加 RIR 数据增强,则需要修改该脚本)。
使用方法:
% script/dump_features_parallel.sh ./dump_features speech.pcm background_noise.pcm foreground_noise.pcm features.f32 rir_list.txt
该命令将运行 nb_processes 个进程,每个进程处理 count 个序列,
并将输出连接到一个单独的文件中。
特征文件计算完成后,您可以通过以下命令开始训练:
% python3 train_rnnoise.py features.f32 output_directory
请选择合适的 epochs 数量(使用 --epochs),以进行大约 75000 次权重
更新。训练过程将生成 .pth 文件,例如 rnnoise_50.pth。
下一步是使用以下命令将模型转换为 C 代码文件:
% python3 dump_rnnoise_weights.py --quantize rnnoise_50.pth rnnoise_c
这将在 rnnoise_c 目录下生成 rnnoise_data.c 和 rnnoise_data.h 文件。
将这些文件复制到 src/ 目录,然后按照上述说明构建 RNNoise。
为了获得更好的效果,在重新开始降噪流程之前,
可以使用已训练的模型去除“纯净”训练语音中的任何噪声
(此操作无需进行多次)。
== 可加载模型 ==
自 v0.1.1 起,模型格式已更改。模型现在使用二进制的“机器字节序”格式。
要输出该格式的模型,请使用该模型构建 RNNoise,并使用 dump_weights_blob
可执行文件输出 weights_blob.bin 二进制文件。随后,该文件可以配合
rnnoise_model_from_file() API 调用使用。请注意,在 RNNoise 状态处于
活动状态时,绝对不能删除模型对象,并且绝对不能关闭文件。
为避免在构建中包含默认模型(例如为了减小下载体积)并完全依赖模型加载,
请在 CFLAGS 中添加 -DUSE_WEIGHTS_FILE。
为了能够加载不同的模型,模型大小(及头文件)需要与构建期间使用的
大小相匹配。否则模型将无法加载。
我们还提供了一个规模减半的“精简版”模型作为替代。要使用较小的模型,
请将 rnnoise_data_little.c 重命名为 rnnoise_data.c。您可以同时构建
常规和精简版的二进制权重,并在运行时加载其中任意一个,因为精简版
模型与常规模型具有相同的大小(除了稀疏度有所增加)。
标签:客户端加密, 循环神经网络, 深度学习, 语音增强, 逆向工具, 降噪, 音频处理