晖顶蝇 发表于 2025-11-14 22:45:04

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

操作系统:Debian 12.5_x64FreeSWITCH版本: 1.10.11rnnoise版本: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 uuidstart|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 uuidnr_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: write2)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.wav4)关闭降噪
命令如下:
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/ -r3、添加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 文件,添加如下内容:

 重启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 : 带降噪效果的录音文件 
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

倡遍竽 发表于 昨天 08:27

不错,里面软件多更新就更好了
页: [1]
查看完整版本: FreeSWITCH使用RNNoise进行实时通话降噪