news 2026/3/1 3:48:24

使用RNNoise进行音频降噪

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用RNNoise进行音频降噪

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/26 10:07:47

Spotube:重新定义免费音乐流媒体的开源播放器

Spotube&#xff1a;重新定义免费音乐流媒体的开源播放器 【免费下载链接】spotube spotube - 一个开源、跨平台的 Spotify 客户端&#xff0c;使用 Spotify 的数据 API 和 YouTube 作为音频源&#xff0c;适合希望在不同平台上使用 Spotify 服务的开发者。 项目地址: https:…

作者头像 李华
网站建设 2026/2/26 7:55:34

25年想转行网络安全?一篇带你了解真实的网安职场!

25年想转行网络安全&#xff1f;一篇带你了解真实的网安职场&#xff01; 最近是不是经常刷到网络安全相关的内容&#xff1f;看着别人做渗透测试、参加CTF比赛&#xff0c;觉得这行挺酷&#xff0c;薪资也不错&#xff0c;心里痒痒的想转行&#xff1f;别急&#xff0c;今天咱…

作者头像 李华
网站建设 2026/2/18 15:24:42

软件测试工程师的职业导航罗盘——如何建立你的个人顾问委员会

在快速迭代的软件行业中&#xff0c;软件测试工程师常面临技术更迭迅速、职业路径多元化的挑战。建立"个人职业顾问委员会"&#xff08;Personal Board of Directors&#xff09;正是一种战略性的职业发展方法&#xff0c;它借鉴企业董事会的协同决策模式&#xff0c…

作者头像 李华
网站建设 2026/2/26 14:37:20

基于GA遗传优化的电动汽车光储充电站容量配置算法matlab仿真

1.程序功能描述基于GA遗传优化的电动汽车光储充电站容量配置算法matlab仿真。通过运行基于 GA 的光储充电站容量配置算法&#xff0c;得到了最优的容量配置方案。与传统的容量配置方法相比&#xff0c;该方案在降低投资成本和运行成本方面具有明显的优势。同时&#xff0c;通过…

作者头像 李华
网站建设 2026/2/27 9:29:59

为什么说这本书是C++进阶的必读宝典?深度解析Effective C++第3版

为什么说这本书是C进阶的必读宝典&#xff1f;深度解析Effective C第3版 【免费下载链接】EffectiveC中文版第3版.pdf资源介绍 《Effective C 中文版第3版》是一本深入浅出的C进阶教程&#xff0c;由侯老精心翻译&#xff0c;被誉为C学习者的“第二本书”。本书涵盖了C编程的高…

作者头像 李华