惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
B
Blog
Stack Overflow Blog
Stack Overflow Blog
量子位
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
Tailwind CSS Blog
MongoDB | Blog
MongoDB | Blog
小众软件
小众软件
博客园 - 三生石上(FineUI控件)
Recent Announcements
Recent Announcements
U
Unit 42
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
腾讯CDC
D
DataBreaches.Net
Microsoft Azure Blog
Microsoft Azure Blog
G
Google Developers Blog
M
MIT News - Artificial intelligence
P
Proofpoint News Feed
罗磊的独立博客
L
LangChain Blog
V
Visual Studio Blog
雷峰网
雷峰网
aimingoo的专栏
aimingoo的专栏
宝玉的分享
宝玉的分享

博客园 - Mike_Zhang

使用python统计FreeSWITCH呼叫并发 从pcap文件提取sip信令文本 FreeSWITCH开启silk编码及转码 FreeSWITCH使用mod_fail2ban模块来提升安全 使用RNNoise进行音频降噪 python3.14版本的free-threading功能体验 一种FreeSWITCH流量镜像WebSocket音频推流方案 C++使用WinHTTP访问http/https服务 cJSON静态库编译及vs2022使用示例 openssl静态库编译及vs2022使用示例 FreeSWITCH日志功能分析及apr模拟 使用pjsip封装自定义软电话sdk pjsip编译、说明及vs2022使用示例 使用kamailio进行分机注册及互拨 apr库编译及队列使用笔记 debian10环境安装rtpengine FreeSWITCH对接http协议的tts服务 python3解析wav文件获取dtmf值 音频文件降噪及python示例 FreeSWITCH使用soundtouch进行变声
FreeSWITCH使用RNNoise进行实时通话降噪
Mike_Zhang · 2025-11-14 · via 博客园 - Mike_Zhang

操作系统:Debian 12.5_x64

FreeSWITCH版本: 1.10.11

rnnoise版本:0.2

从事FreeSWITCH相关工作,大概率会遇到静音检测和降噪的事情,之前整理过vad相关的内容:

今天整理下FreeSWITCH使用RNNoise实现实时音频降噪的笔记,并提供示例代码(如需商业使用请参考文章自行实现)。

我将从以下几个方面展开:

  • 模块整体结构介绍
  • 模块使用说明及示例
  • 模块编译及加载
  • 具体实现
  • 配套资源下载

关于如何使用RNNoise库进行音频降噪,可参考我之前的笔记:

本文对应的源码及资源,可从文末提供的渠道获取。

一、模块说明

模块名称: mod_rnnoise

整体结构如下:

fb068aeeadc261fc7a3056e10920aaa9

 说明:

1)mod_rnnoise模块获取channel的原始音频;

2)mod_rnnoise模块将获取到的原始音频转换成RNNoise库适配的48khz的音频,然后使用RNNoise进行降噪;

3)mod_rnnoise模块接收降噪后的音频,执行采样率转换(如有需要),回传给channel进行覆盖;

二、模块使用

1、API命令说明

【降噪命令】

uuid_rnnoise

【命令格式】

uuid_rnnoise <uuid> start|stop read|write

【字段说明】

uuid : 需要进行降噪的channel uuid

start|stop : 开始降噪或结束降噪

read|write : 降噪方向(相对于channel),读取(收音)或者写入(放音)

2、事件说明

基于自定义事件实现mod_rnnoise的事件,关于如何实现自定义事件,可参考如下文章:

有两个事件:

mod_rnnoise::start 降噪开始事件

mod_rnnoise::stop 降噪结束事件

有两个自定义字段:

channel_uuid 执行降噪的channel uuid

nr_direction 降噪的方向(read | write)

1)mod_rnnoise::start 事件

事件示例如下:

Event-Subclass: mod_rnnoise::start
Event-Name: CUSTOM
Core-UUID: 1ffa45ca-23e6-4a2c-b7aa-684160c2cd47
FreeSWITCH-Hostname: host72
FreeSWITCH-Switchname: fs72
FreeSWITCH-IPv4: 192.168.137.72
FreeSWITCH-IPv6: ::1
Event-Date-Local: 2025-11-14 01:12:17
Event-Date-GMT: Fri, 14 Nov 2025 06:12:17 GMT
Event-Date-Timestamp: 1763100737378843
Event-Calling-File: mod_rnnoise.c
Event-Calling-Function: do_start
Event-Calling-Line-Number: 270
Event-Sequence: 37486
channel_uuid: f764246a-dacb-4fe1-ad47-fafdb9c0b4c1
nr_direction: write

2)mod_rnnoise::stop事件

事件示例如下:

Event-Subclass: mod_rnnoise::stop
Event-Name: CUSTOM
Core-UUID: 1ffa45ca-23e6-4a2c-b7aa-684160c2cd47
FreeSWITCH-Hostname: host72
FreeSWITCH-Switchname: fs72
FreeSWITCH-IPv4: 192.168.137.72
FreeSWITCH-IPv6: ::1
Event-Date-Local: 2025-11-14 01:12:28
Event-Date-GMT: Fri, 14 Nov 2025 06:12:28 GMT
Event-Date-Timestamp: 1763100748839073
Event-Calling-File: mod_rnnoise.c
Event-Calling-Function: do_stop
Event-Calling-Line-Number: 307
Event-Sequence: 37491
channel_uuid: f764246a-dacb-4fe1-ad47-fafdb9c0b4c1
nr_direction: write

运行效果如下:

579b467ad94f310a1c091e1c63477d66

3、使用示例

为了演示方便,这里使用echo呼叫进行测试,使用uuid_record命令进行双声道录音,使用Audacity 软件查看音频波形。

关于uuid_record录音可参考如下文章:

关于Audacity 软件的使用可参考如下文章:

1)模拟呼叫

命令如下:

 originate user/1010 &echo

a39d25a681ad4c0d1f1c0425a91c2ea0

2)执行降噪

这里为了方便对比,使用write方向降噪。

命令如下:

uuid_rnnoise 81d3b389-1161-41e9-9287-ee0ec0bacceb start write

降噪效果可通过耳机等音频播放设备实时体验。

3)执行录音

命令如下:

uuid_record 81d3b389-1161-41e9-9287-ee0ec0bacceb start /tmp/t123.wav

4)关闭降噪

命令如下:

uuid_rnnoise 81d3b389-1161-41e9-9287-ee0ec0bacceb stop write

此时录音仍在继续。

5)停止录音

命令如下:

uuid_record 81d3b389-1161-41e9-9287-ee0ec0bacceb stop /tmp/t123.wav

运行效果如下:

b2d2ece8a43b8e8b869490bd4a408a4c

从上图可以看出,使用rnnoise进行实时降噪,背景噪音降噪明显。

配套的录音文件可从文末提供的渠道获取。

三、模块编译

1、依赖库说明

这里使用rnnoise库,可参考我之前的文章:

https://www.cnblogs.com/MikeZhang/p/19181243/rnnoise20251031

2、复制模块代码到freeswitch目录

复制源码到freeswitch目录:

cp mod_rnnoise /root/src/freeswitch-1.10.11.-release/src/mod/applications/ -r

3、添加FreeSWITCH编译配置项

1)添加模块编译项

文件:源码根目录的modules.conf文件

添加如下代码:

817b68b7e0cb32d9f81cee8e9607bcc7

2)添加模块自动生成Makefile

文件:  源码根目录的configure.ac文件

添加如下代码:

src/mod/applications/mod_rnnoise/Makefile

5d8bfee769562ad800c7fcfda7208831

4、重新编译FreeSWITCH

源码目录执行如下命令:

autoreconf -fiv
make clean
./devel-bootstrap.sh && ./configure && make && make install

说明:

1)会生成Makefile文件;

2)会静态编译mod_rnnoise模块;

c9addd8d6d61bd09de4aca90c0b9b1b2

5、加载mod_rnnoise模块

编辑 conf/autoload_configs/modules.conf.xml 文件,添加如下内容:

<load module="mod_rnnoise"/>

f348328210be4587568668ee5213af85

 重启FreeSWITCH或执行重新load操作:

f4558891b350e5cd47ba0f376d5eba03

如果加载不报错,则添加mod_rnnoise模块成功。

四、具体实现

说明:

本文主要讨论技术,配套资源为示例代码,如需商业使用,请参考文章自行实现。

这里描述下实现的部分技术关键点,更多内容可从文末提供的渠道获取。

1、采样率转换

当前使用的rnnoise库所使用的音频采样率是48khz,而在FreeSWITCH中,采样率可能是8khz(比如PCMA、PCMU编码),这就涉及采样率转换的情况。

9ee10ee7acd30f25c71122ac51174c98

这里使用简单的线性插值方式进行采样率转换。

示例代码如下:

b04a4b792038ac147373aafb0853fbd3

完整源码可从如下渠道获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20251114 获取。 

2、降噪功能

降噪功能使用RNNoise库的rnnoise_process_frame函数实现,具体如下(以8khz为例):

d5a81aea8667987a1bdbe64e9ac70d6b

完整源码可从如下渠道获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20251114 获取。 

五、资源下载

本文相关资源及示例代码,可从如下渠道获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20251114 获取。

90dd27fc47fde287997e5f2e810e4ab6

【文件说明】

mod_rnnoise_src.tar.gz : mod_rnnoise源代码

mod_rnnoise_srcbin.tar.gz : mod_rnnoise源代码(带预编译的so文件,路径为mod_rnnoise.libs\)

mod_rnnoise_bin_debian12.tar.gz : debian12_x64环境下预编译二进制(so文件)

t123.wav : 带降噪效果的录音文件