FreeSWITCH使用RNNoise进行实时通话降噪

操作系统:Debian 12.5_x64
FreeSWITCH版本: 1.10.11
rnnoise版本:0.2
从事FreeSWITCH相关工作,大概率会遇到静音检测和降噪的事情,之前整理过vad相关的内容:
https://mp.weixin.qq.com/s/sxbhD20ojzQI_LJlkla0vA
今天整理下FreeSWITCH使用RNNoise实现实时音频降噪的笔记,并提供示例代码(如需商业使用请参考文章自行实现)。
我将从以下几个方面展开:

  • 模块整体结构介绍
  • 模块使用说明及示例
  • 模块编译及加载
  • 具体实现
  • 配套资源下载
    关于如何使用RNNoise库进行音频降噪,可参考我之前的笔记:
    https://www.cnblogs.com/MikeZhang/p/19181243/rnnoise20251031
    本文对应的源码及资源,可从文末提供的渠道获取。

一、模块说明

模块名称: mod_rnnoise
整体结构如下:

说明:
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的事件,关于如何实现自定义事件,可参考如下文章:
https://www.cnblogs.com/MikeZhang/p/gen_freeswitch_event_20160927.html
有两个事件:
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

运行效果如下:

3、使用示例

为了演示方便,这里使用echo呼叫进行测试,使用uuid_record命令进行双声道录音,使用Audacity 软件查看音频波形。
关于uuid_record录音可参考如下文章:
https://mp.weixin.qq.com/s/9wNFyWk-sprHOCBK9O7aGA
关于Audacity 软件的使用可参考如下文章:
https://www.cnblogs.com/MikeZhang/p/audacity2022022.html
1)模拟呼叫
命令如下:

复制代码
 originate user/1010 &echo

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

运行效果如下:

从上图可以看出,使用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文件

添加如下代码:

复制代码
applications/mod_rnnoise

2)添加模块自动生成Makefile

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

添加如下代码:

复制代码
src/mod/applications/mod_rnnoise/Makefile

4、重新编译FreeSWITCH

源码目录执行如下命令:

复制代码
autoreconf -fiv
make clean
./devel-bootstrap.sh && ./configure && make && make install

说明:
1)会生成Makefile文件;
2)会静态编译mod_rnnoise模块;

5、加载mod_rnnoise模块

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

复制代码
<load module="mod_rnnoise"/>

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

复制代码
reload mod_rnnoise

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

四、具体实现

说明:

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

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

1、采样率转换

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

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

示例代码如下:


完整源码可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20251114 获取。

2、降噪功能

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


完整源码可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20251114 获取。

五、资源下载

本文相关资源及示例代码,可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20251114 获取。

【文件说明】
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 : 带降噪效果的录音文件

相关推荐
爱学习的大牛1238 天前
Ubuntu 24.04 安装 FreeSWITCH 完整教程
linux·freeswitch
Mike_Zhang14 天前
使用RNNoise进行音频降噪
音频技术
若尘拂风20 天前
FreeSWITCH配置文件解析(11) 模块配置文件(modules.conf)
服务器·tcp/ip·udp·freeswitch
若尘拂风24 天前
centos 7.9 编译安装 freeswitch 1.10.12
服务器·udp·freeswitch·sip
十年一梦惊觉醒1 个月前
freeswitch集成离线语音识别funasr
人工智能·语音识别·freeswitch
声光界2 个月前
《LE Audio & Auracast开创你我新生活》
音视频·声学·音频技术·蓝牙音频
Mike_Zhang3 个月前
一种FreeSWITCH流量镜像WebSocket音频推流方案
voip·freeswitch
声光界3 个月前
《Auracast广播音频技术解析及未来路线图》 —蓝牙技术联盟 市场拓展经理 吴志豪 技术与市场经理 鲁公羽
声学·音频技术·蓝牙音频
c_zyer3 个月前
FreeSWITCH与Java交互实战:从EslEvent解析到Spring Boot生态整合的全指南
spring boot·netty·freeswitch·eslevent