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。您可以同时构建 常规和精简版的二进制权重,并在运行时加载其中任意一个,因为精简版 模型与常规模型具有相同的大小(除了稀疏度有所增加)。
标签:客户端加密, 循环神经网络, 深度学习, 语音增强, 逆向工具, 降噪, 音频处理