FreeSWITCH 简单图形化界面42 - 使用mod_vad模块进行语音检测
FreeSWITCH 简单图形化界面42 - 用mod_vad模块进行语音检测
- 0、一个fs的web配置界面预览
- 1、一个介绍
- 2、安装FreeSWITCH
- 3、安装 mod_vad 模块
- 3.1、克隆仓库
- 3.2、编译模块
- 3.3、加载mod_vad模块
- 4、使用 mod_vad 模块
- 4.1、application中使用
- 4.2、api中使用
- 4.3、使用esl获取检测结果
- 5、vad相关参数
0、一个fs的web配置界面预览
http://myfs.f3322.net:8020/
用户名:admin,密码:admin
FreeSWITCH界面安装参考:https://blog.csdn.net/jia198810/article/details/137820796
1、一个介绍
mod_vad
是一个为 FreeSWITCH 提供语音活动检测(Voice Activity Detection,VAD)功能的模块。FreeSWITCH 是一个开源的电信级通信平台,广泛应用于 VoIP 服务、呼叫中心和多媒体通信等领域。
mod_vad
的主要作用是通过分析音频流,自动检测语音活动和静音段,从而实现以下功能:
- 节省带宽:在静音期间减少不必要的音频传输,降低网络带宽占用。
- 优化通话体验:通过精准检测语音活动,避免因背景噪音或短暂静音导致的通话中断或误判。
- 支持智能通话控制:为基于语音活动的呼叫控制、录音和分析等功能提供基础支持。
2、安装FreeSWITCH
先参考官网的FreeSWITCH的手册,安装一下FreeSWITCH,过一遍系统环境,避免在编译mod_vad时,缺少各种依赖。
FreeSWITCH安装成功后,在进行下面的操作
本次用的是FreeSWITCH-1.10.12
版本,其他版本类似(未测试)。
3、安装 mod_vad 模块
3.1、克隆仓库
#下载到源码目录下 /root/freeswitch-1.10.12/src/mod/applications/
root@localhost ~/f/s/m/applications# cd /root/freeswitch-1.10.12/src/mod/applications/
#下载mod_vad(感谢编写mod_vad模块的这位大佬给我们学习的机会)
root@localhost ~/f/s/m/applications# git clone https://github.com/Tangwego/mod_vad.gitCloning into 'mod_vad'...
remote: Enumerating objects: 17, done.
remote: Counting objects: 100% (17/17), done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 17 (delta 4), reused 4 (delta 0), pack-reused 0 (from 0)
Receiving objects: 100% (17/17), 5.82 KiB | 5.82 MiB/s, done.
Resolving deltas: 100% (4/4), done.#进入到mod_vad目录,确认一下文件是否完整。
root@localhost ~/f/s/m/applications# cd mod_vad/
root@localhost ~/f/s/m/a/mod_vad# ls
Makefile mod_vad.c README.md
3.2、编译模块
#执行make命令编译
root@localhost ~/f/s/m/a/mod_vad# makeCompiling /root/freeswitch-1.10.12/src/mod/applications/mod_vad/mod_vad.c...
libtool: compile: gcc -I/usr/include/uuid -I/root/freeswitch-1.10.12/src/include -I/root/freeswitch-1.10.12/src/include -I/root/freeswitch-1.10.12/libs/libteletone/src -fPIC -ffast-math -Werror -Wno-unused-result -Wno-misleading-indentation -fvisibility=hidden -DSWITCH_API_VISIBILITY=1 -DCJSON_API_VISIBILITY=1 -DHAVE_VISIBILITY=1 -g -ggdb -DHAVE_OPENSSL -g -O2 -Wall -std=c99 -pedantic -Wdeclaration-after-statement -D_GNU_SOURCE -DHAVE_CONFIG_H -c /root/freeswitch-1.10.12/src/mod/applications/mod_vad/mod_vad.c -fPIC -DPIC -o .libs/mod_vad.o
Creating mod_vad.la...
libtool: warning: '/usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/libfvad.la' seems to be moved#没有报错,则编译成功,编译后的模块在.libs目录下面。
root@localhost ~/f/s/m/a/mod_vad# ls .libs/
mod_vad.la mod_vad.lai mod_vad.o mod_vad.so
#拷贝mod_vad.so到/usr/local/freeswitch/mod目录下
root@localhost ~/f/s/m/a/mod_vad# cp .libs/mod_vad.so /usr/local/freeswitch/mod/mod_vad.so
3.3、加载mod_vad模块
- 启动FreeSWITCH
root@localhost ~/f/s/m/a/mod_vad (master)# /usr/local/freeswitch/bin/freeswitch -nonat
- 临时加载mod_vad模块
freeswitch@localhost> load mod_vad
2025-05-10 12:54:07.778898 99.83% [INFO] switch_stun.c:915 External ip address detected using STUN: 210.51.10.231
2025-05-10 12:54:08.018743 99.83% [INFO] switch_stun.c:915 External ip address detected using STUN: 210.51.10.231
2025-05-10 12:54:08.018743 99.83% [INFO] switch_xml.c:1398 No files to include at /usr/local/freeswitch/conf/directory/*.xml
2025-05-10 12:54:08.058813 99.83% [INFO] mod_enum.c:884 ENUM Reloaded
2025-05-10 12:54:08.058813 99.83% [CONSOLE] switch_loadable_module.c:1772 Successfully Loaded [mod_vad]+OK Reloading XML
+OK2025-05-10 12:54:08.058813 99.83% [NOTICE] switch_loadable_module.c:329 Adding Application 'vad'
2025-05-10 12:54:08.058813 99.83% [INFO] switch_time.c:1436 Timezone reloaded 597 definitions
2025-05-10 12:54:08.058813 99.83% [NOTICE] switch_loadable_module.c:389 Adding API Function 'uuid_vad'
freeswitch@localhost>
- 永久加载mod_vad模块
编译/usr/local/freeswitch/conf/autoload_configs/modules.conf.xml文件,添加mod_vad模块。
<configuration name="modules.conf" description="Modules"><modules><!-- 其他模块--><!-- ...... --><!-- 启动时加载mod_vad --><load module="mod_vad"/></modules>
</configuration>
4、使用 mod_vad 模块
4.1、application中使用
下面的用的lua拨号脚本,dialplan一样。
#!/usr/bin/env lua
-- 主叫检测
session:execute("set","vad_debug=1")
session:execute("set","vad_mode=0")
session:execute("set","vad_silence_ms=1000")
session:execute("set","vad_thresh=256")
session:execute("set","vad_voice_ms=500")
session:execute("vad","start")
-- 如果需要被叫检测,则接通后,再执行一下上面这几行。
4.2、api中使用
#执行uuid_vad start + 主被叫通道 开始通道语音检测
#执行uuid_vad stop + 主被叫通道 结束通道语音检测
freeswitch@localhost> show channels
freeswitch@localhost> uuid_vad start e09bb377-4d99-4f4a-a5df-8774bfe12ce8
freeswitch@localhost> uuid_vad stop e09bb377-4d99-4f4a-a5df-8774bfe12ce8
2025-05-10 13:35:11.218419 90.57% [INFO] mod_vad.c:111 Read imp sample:[8000] channels:[1].
2025-05-10 13:35:11.218419 90.57% [INFO] mod_vad.c:252 Starting VAD detection for audio stream
2025-05-10 13:35:12.538414 90.57% [INFO] mod_vad.c:275 START TALKING
2025-05-10 13:35:12.538414 90.57% [INFO] mod_vad.c:190 Fire VAD event start-talking
2025-05-10 13:35:12.618417 90.57% [INFO] mod_vad.c:275 START TALKING
2025-05-10 13:35:12.618417 90.57% [INFO] mod_vad.c:190 Fire VAD event start-talking
2025-05-10 13:35:13.878421 90.80% [INFO] mod_vad.c:278 STOP TALKING
2025-05-10 13:35:13.878421 90.80% [INFO] mod_vad.c:190 Fire VAD event stop-talking
2025-05-10 13:35:13.898413 90.80% [INFO] mod_vad.c:278 STOP TALKING
2025-05-10 13:35:13.898413 90.80% [INFO] mod_vad.c:190 Fire VAD event stop-talking
2025-05-10 13:35:14.838411 90.77% [INFO] mod_vad.c:275 START TALKING
2025-05-10 13:35:14.838411 90.77% [INFO] mod_vad.c:190 Fire VAD event start-talking
2025-05-10 13:35:14.918413 90.77% [INFO] mod_vad.c:275 START TALKING
2025-05-10 13:35:14.918413 90.77% [INFO] mod_vad.c:190 Fire VAD event start-talking
2025-05-10 13:35:16.218422 90.77% [INFO] mod_vad.c:278 STOP TALKING
2025-05-10 13:35:16.218422 90.77% [INFO] mod_vad.c:190 Fire VAD event stop-talking
2025-05-10 13:35:16.278423 90.77% [INFO] mod_vad.c:278 STOP TALKING
2025-05-10 13:35:16.278423 90.77% [INFO] mod_vad.c:190 Fire VAD event stop-talking
4.3、使用esl获取检测结果
通过esl获取检测结果,本次使用的是python,其他语言的esl自行百度。
# ......上面的一些连接esl的一些处理流程。
# mod_vad的事件头为vad::detection。elif subclass == "vad::detection":uuid = e.getHeader("Channel-Call-UUID")caller_number = get_phone_status_caller_number(e)callee_number = get_phone_status_callee_number(e)direction = e.getHeader("Call-Direction")vad_state = e.getHeader("vad_state")# print(e.serialize("json"))if direction == "inbound":print(f"主叫号码:{caller_number},direction:{direction},state:{vad_state}")else:print(f"被叫号码:{callee_number},direction:{direction},state:{vad_state}")
如下图:
5、vad相关参数
vad相关参数用于配置mod_vad
模块的行为,以下是每个参数的详细说明(以下来自AI翻译):
1.vad_debug
• 含义:调试模式开关。
• 作用:当设置为1
时,VAD 模块会输出详细的调试信息,包括音频处理过程中的各种状态和参数。这些信息通常用于开发和故障排除。
• 应用场景:在开发或调试 VAD 模块时启用,以便更好地了解模块的内部工作状态。
2.vad_silence_ms
• 含义:静音检测的持续时间阈值(以毫秒为单位)。
• 作用:定义在检测到静音后,需要持续多长时间才能确认为真正的静音状态。例如,如果设置为1000
,则需要持续 1 秒的静音才能触发静音事件。
• 应用场景:用于控制静音检测的灵敏度。较高的值可以减少误判,但可能会延迟静音事件的触发。
3.vad_thresh
• 含义:静音检测的阈值。
• 作用:定义音频信号的强度低于该阈值时被认为是静音。阈值越高,静音检测越严格。
• 应用场景:根据环境噪音水平调整阈值。在嘈杂环境中,可以提高阈值以避免将背景噪音误判为语音。
4.vad_voice_ms
• 含义:语音检测的持续时间阈值(以毫秒为单位)。
• 作用:定义在检测到语音后,需要持续多长时间才能确认为真正的语音状态。例如,如果设置为500
,则需要持续 0.5 秒的语音才能触发语音事件。
• 应用场景:用于控制语音检测的灵敏度。较高的值可以减少误判,但可能会延迟语音事件的触发。
生活不易,祝君好运