找回密码
 立即注册
首页 业界区 业界 FreeSWITCH使用RNNoise进行实时通话降噪

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

晖顶蝇 2025-11-14 22:45:04
操作系统: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.png

 说明:
1)mod_rnnoise模块获取channel的原始音频;2)mod_rnnoise模块将获取到的原始音频转换成RNNoise库适配的48khz的音频,然后使用RNNoise进行降噪;3)mod_rnnoise模块接收降噪后的音频,执行采样率转换(如有需要),回传给channel进行覆盖;二、模块使用

1、API命令说明

【降噪命令】uuid_rnnoise 【命令格式】
  1. 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 事件 事件示例如下:
  1. Event-Subclass: mod_rnnoise::start
  2. Event-Name: CUSTOM
  3. Core-UUID: 1ffa45ca-23e6-4a2c-b7aa-684160c2cd47
  4. FreeSWITCH-Hostname: host72
  5. FreeSWITCH-Switchname: fs72
  6. FreeSWITCH-IPv4: 192.168.137.72
  7. FreeSWITCH-IPv6: ::1
  8. Event-Date-Local: 2025-11-14 01:12:17
  9. Event-Date-GMT: Fri, 14 Nov 2025 06:12:17 GMT
  10. Event-Date-Timestamp: 1763100737378843
  11. Event-Calling-File: mod_rnnoise.c
  12. Event-Calling-Function: do_start
  13. Event-Calling-Line-Number: 270
  14. Event-Sequence: 37486
  15. channel_uuid: f764246a-dacb-4fe1-ad47-fafdb9c0b4c1
  16. nr_direction: write
复制代码
2)mod_rnnoise::stop事件 事件示例如下:
  1. Event-Subclass: mod_rnnoise::stop
  2. Event-Name: CUSTOM
  3. Core-UUID: 1ffa45ca-23e6-4a2c-b7aa-684160c2cd47
  4. FreeSWITCH-Hostname: host72
  5. FreeSWITCH-Switchname: fs72
  6. FreeSWITCH-IPv4: 192.168.137.72
  7. FreeSWITCH-IPv6: ::1
  8. Event-Date-Local: 2025-11-14 01:12:28
  9. Event-Date-GMT: Fri, 14 Nov 2025 06:12:28 GMT
  10. Event-Date-Timestamp: 1763100748839073
  11. Event-Calling-File: mod_rnnoise.c
  12. Event-Calling-Function: do_stop
  13. Event-Calling-Line-Number: 307
  14. Event-Sequence: 37491
  15. channel_uuid: f764246a-dacb-4fe1-ad47-fafdb9c0b4c1
  16. nr_direction: write
复制代码
运行效果如下:
2.png

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)模拟呼叫命令如下:
  1. originate user/1010 &echo
复制代码
3.png

2)执行降噪
这里为了方便对比,使用write方向降噪。
命令如下:
  1. uuid_rnnoise 81d3b389-1161-41e9-9287-ee0ec0bacceb start write
复制代码
降噪效果可通过耳机等音频播放设备实时体验。
3)执行录音
命令如下:
  1. uuid_record 81d3b389-1161-41e9-9287-ee0ec0bacceb start /tmp/t123.wav
复制代码
4)关闭降噪
命令如下:
  1. uuid_rnnoise 81d3b389-1161-41e9-9287-ee0ec0bacceb stop write
复制代码
此时录音仍在继续。
5)停止录音
命令如下:
  1. uuid_record 81d3b389-1161-41e9-9287-ee0ec0bacceb stop /tmp/t123.wav
复制代码
运行效果如下:
4.png

从上图可以看出,使用rnnoise进行实时降噪,背景噪音降噪明显。
配套的录音文件可从文末提供的渠道获取。
三、模块编译

1、依赖库说明

这里使用rnnoise库,可参考我之前的文章:
https://www.cnblogs.com/MikeZhang/p/19181243/rnnoise20251031

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

复制源码到freeswitch目录:
  1. cp mod_rnnoise /root/src/freeswitch-1.10.11.-release/src/mod/applications/ -r
复制代码
3、添加FreeSWITCH编译配置项

1)添加模块编译项
文件:源码根目录的modules.conf文件
添加如下代码:
  1. applications/mod_rnnoise
复制代码
5.png

 
2)添加模块自动生成Makefile
文件:  源码根目录的configure.ac文件
添加如下代码:
  1. src/mod/applications/mod_rnnoise/Makefile
复制代码
6.png

4、重新编译FreeSWITCH

源码目录执行如下命令:
  1. autoreconf -fiv
  2. make clean
  3. ./devel-bootstrap.sh && ./configure && make && make install
复制代码
说明:1)会生成Makefile文件;2)会静态编译mod_rnnoise模块;
7.png

5、加载mod_rnnoise模块

编辑 conf/autoload_configs/modules.conf.xml 文件,添加如下内容:
  1. [/code][align=center] 8.png [/align]
  2.  重启FreeSWITCH或执行重新load操作:
  3. [code]reload mod_rnnoise
复制代码
9.png

如果加载不报错,则添加mod_rnnoise模块成功。
四、具体实现

说明:
本文主要讨论技术,配套资源为示例代码,如需商业使用,请参考文章自行实现。
这里描述下实现的部分技术关键点,更多内容可从文末提供的渠道获取。
1、采样率转换

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

这里使用简单的线性插值方式进行采样率转换。
示例代码如下:
11.png

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

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

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

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

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

相关推荐

您需要登录后才可以回帖 登录 | 立即注册