使用RNNoise进行音频降噪

使用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.aall:make test1test1:test1.o$(CC) -o test1 test1.o $(LIBS)clean:rm -f test1rm -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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/952216.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员修炼之道:从小工到专家读后感(2025_10_31)

在正确与容易之间:每个程序员都面临的永恒选择 《程序员修炼之道》的第七章像一面镜子,照出了每个程序员日常工作中最真实的挣扎。当“在正确与容易之间做选择”这个命题出现在面前时,我感到心头一震——这不正是我…

Python测试(下) _ 高效率把bug揪出来

Python测试(下) _ 高效率把bug揪出来#导入测试内置模块import unittest#导入要测试的api,Student为类名from _oop import Studentfrom _oop import SmallStudent#需要继承unittest.TestCase,def函数必须用test_开头…

如何精准驱动菜品识别模型--基于米尔瑞芯微RK3576边缘计算盒

在人工智能与边缘计算深度融合的今天,将AI模型高效部署于终端设备已成为产业智能化的关键。本文将分享基于米尔MYD-LR3576边缘计算盒子部署菜品识别安卓Demo的实战经验。该设备凭借其内置的强劲瑞芯微RK3576芯片,为视…

MPK(Mirage Persistent Kernel)源码笔记(4)--- 转译系统

MPK(Mirage Persistent Kernel)源码笔记(4)--- 转译系统 目录MPK(Mirage Persistent Kernel)源码笔记(4)--- 转译系统0x00 概要0x01 Task和Event1.1 可执行任务1.1.1 任务定义1.1.2 任务类型1.2 事件1.2.1 事件…

征程 6 | 多任务 不同帧率 部署方案

1.方案描述 推理多任务模型时,可能会有不同任务分支 部署不同帧率的需求,例如 BEV 动态任务 20 帧,静态任务 10 帧这种情况。最简单的方式是编译两个模型,分开推理:模型 1:backbone+neck+ 动态 head 模型 2:bac…

10月31号

今天进行了外语学习。

10月29号

今天进行了离散数学和马克思主义的学习

️ 深度解析我的 Overleaf 私有化部署:一份稳定、高兼容性的 `docker-compose.yaml`

通过私有化部署 Overleaf(ShareLaTeX CE),我们能彻底掌控一个功能完整的 LaTeX 协作环境,为您的论文编写和数据安全提供强大保障,告别官方服务的付费限制与硬件兼容性烦恼。大家好,我是 XuHe。在上一篇博客告别 …

支配点对小记

支配点对小记 此类问题的形式一般为:多次询问某范围内最优点对(的贡献)。 考虑一些特别的情况,若某点对被严格偏序,显然无需考虑该点对。于是考虑只保留可能成为最优解的点对,称之为支配点对。 对于两个点对 \(a…

2025赣南脐橙最新推荐品牌榜,源头赣南脐橙果园品牌综合评测!

2025赣南脐橙最新推荐品牌榜,源头赣南脐橙果园品牌综合评测!摘要 本文基于行业数据与用户调研及《GB/T 20355-2006 地理标志产品 赣南脐橙》中的质量指标(包括感官指标、理化指标、卫生指标、净含量),对市面上主流…

Kosaraju 笔记

在做 ARC069F Flags 时看到有一个用 kosaraju 的 nb 做法,于是研究了一下 kosaraju。 Kosaraju 算法 kosaraju 算法是一种找出强连通分量的算法,用途和 tarjan 类似,但是代码更好写,并且在某些题上比 tarjan 算法有…

Manacher 代码贴贴

#include<bits/stdc++.h> using namespace std; const int N=1.1e7+5; char rS[N]; char S[N<<1]; int P[N<<1],n; void init(){n=strlen(rS);int k=0;S[k++]=$;S[k++]=#;for(int i=0;i<n;i++){S…

Python测试(上)_ 不存在不写bug的程序员

Python测试(上)_ 不存在不写bug的程序员#导入测试内置模块import unittest#导入要测试的apifrom _try_except import condition#需要继承unittest.TestCase,def函数必须用test_开头class MyTestCase(unittest.TestC…

P9119 [春季测试 2023] 圣诞树

首先需要发现一些性质,不然就真成不可做问题了,考虑凸多边形的一些性质。 考虑四边形定理,两条相交边长度一定大于两条不交边长度,这启示我们路径连线本质不交,然后我们继续思考路径形态。 路径形态是这样子的,你…

Java性能调优的艺术:从字节码到云端的全链路优化

在Java开发的世界里,我们常常享受其“一次编写,到处运行”的便利和垃圾回收带来的自动化管理。然而,当应用变得复杂、负载升高时,性能问题便会悄然而至:响应缓慢、吞吐量下降、频繁GC,甚至内存溢出导致服务崩溃。…

2025.10.31总结 - A

今天没课,在宿舍休息了,加油,依旧按时完成博客园,加油

用隐式马尔科夫模型检测XSS攻击Payload

其实XSS说白了,就是通过向网页中注入恶意的脚本代码,一般来说都是 JavaScript,让代码在其他用户的浏览器中执行,从而达到窃取信息、冒充身份、传播木马等目的。换句话说,网站本来应该只展示安全的内容的,但是攻击…

revit api创建文字注释

revit api创建文字注释public void MyFirstMacroAppCS() {Autodesk.Revit.DB.XYZ baseVec = Application.Create.NewXYZ(1.0, 0.0, 0.0);Autodesk.Revit.DB.XYZ upVec = Application.Create.NewXYZ(0.0, 0.0, 1.0);Aut…

mysql 查询今天、昨天、本周、上周、本月、上月、本季度、上季度、本年、上一年、的数据

1、今天select * from 表名 where to_days(时间字段名) = to_days(now())2、昨天select * from 表名 where to_days( now( ) ) - to_days( 时间字段名) <= 13、近7天select * from 表名 where date_sub(curdate(), …

P10674 [MX-S1-T3] 电动力学 题解

P10674 [MX-S1-T3] 电动力学 题解 提供一种比现有题解简单的 DP 方式和用到结论的证明。首先,建立原图的圆方树,注意到如果两个圆点 \(x,y\in T\),那么在圆方树上 \(x\to y\) 路径上的所有方点对应的点双连通分量中…