晖顶蝇
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)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: 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文件
添加如下代码:
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 文件,添加如下内容:- [/code][align=center]
[/align] - 重启FreeSWITCH或执行重新load操作:
- [code]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 : 带降噪效果的录音文件
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
|
|
|
|
|
相关推荐
|
|
|