news 2026/6/23 19:48:45

使用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/6/23 19:48:27

风储模型中的功率分配模型

风储模型中&#xff0c;功率分配模型风电场的功率波动像个情绪不稳定的摇滚主唱——前一秒还激情四射&#xff0c;下一秒就突然断电。储能系统这时候就像个靠谱的调音师&#xff0c;得在后台疯狂调参数。今天咱们用Python撸个功率分配模型&#xff0c;看看怎么让这俩搭档别在电…

作者头像 李华
网站建设 2026/6/23 19:48:29

眼见非实(Bugku杂项入门)

解压文件后发现是个docx文档。 尝试打开发现无法正常打开&#xff0c;可见这个文件并非docx文件&#xff0c;需要改后缀进行解决&#xff0c;这里把它放进winhex进行分析。 通过第一行&#xff0c;我们可以发现它的前缀是504B0304&#xff0c;这是压缩包文件的固定格式。 ##不…

作者头像 李华
网站建设 2026/6/22 6:16:29

毕方Talon:鸿蒙开发的编译时安全守护神

毕方Talon&#xff1a;鸿蒙开发的编译时安全守护神 【免费下载链接】毕方Talon工具 本工具是一个端到端的工具&#xff0c;用于项目的生成IR并自动进行缺陷检测。 项目地址: https://gitcode.com/OpenHarmonyToolkitsPlaza/talon 你是否曾在鸿蒙应用开发中遇到这样的困扰…

作者头像 李华
网站建设 2026/6/23 9:24:30

Java线程池与Executor框架完全指南:一看就会,一看就懂!

一、为什么需要线程池&#xff1f;&#x1f914;1.1 传统线程管理的痛点问题场景&#xff1a;// 传统方式&#xff1a;为每个任务创建新线程for (int i 0; i < 1000; i) {new Thread(() -> {// 执行任务processTask();}).start();}// 结果&#xff1a;系统资源被榨干&am…

作者头像 李华
网站建设 2026/6/22 17:51:35

随机图床 _

图床转发 (Image-Forward)一个基于Python Flask的图片合集管理和随机转发服务。功能特点管理界面&#xff0c;支持创建、查看、编辑和删除图片合集支持上传本地图片和添加外部图片链接通过特定URL随机返回合集中的图片&#xff08;本地图片直接返回&#xff0c;外链HTTP重定向&…

作者头像 李华