当前位置: 首页 > news >正文

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模块

  1. 启动FreeSWITCH

root@localhost ~/f/s/m/a/mod_vad (master)# /usr/local/freeswitch/bin/freeswitch -nonat
  1. 临时加载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>
  1. 永久加载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 秒的语音才能触发语音事件。
• 应用场景:用于控制语音检测的灵敏度。较高的值可以减少误判,但可能会延迟语音事件的触发。

生活不易,祝君好运

相关文章:

  • 可以抛弃postman啦, API测试工具Bruno实用教程(二):进阶篇
  • 高斯过程回归(GPR)原理的通俗解释
  • 从 SpringBoot 到微服务架构:Java 后端开发的高效转型之路
  • 5.2 参数管理
  • vue3的响应式设计原理
  • Tengine:高性能Web服务器的原理与应用实践优雅草卓伊凡
  • 通俗的桥接模式
  • 如何安装不同版本的ESP-IDF,并配置Vscode插件,以及在Vscode中切换版本
  • Linux:进程间通信---消息队列信号量
  • Linux 信号终篇(总结)
  • HTTP/3展望、我应该迁移到HTTP/2吗
  • LeetCode 270:在二叉搜索树中寻找最接近的值(Swift 实战解析)
  • 从父类到子类:C++ 继承的奇妙旅程(2)
  • LinkedList源码解析
  • 嵌入式硬件篇---麦克纳姆轮(简单运动实现)
  • 【金仓数据库征文】国产数据库KingbaseES安装与使用详解
  • 深度解析 MySQL 与 Spring Boot 长耗时进程:从故障现象到根治方案(含 Tomcat 重启必要性分析)
  • Java与Go语言对比教程
  • LeetCode --- 448 周赛
  • MCP项目实例 - client sever交互
  • 北京2025年住房发展计划:供应商品住房用地240-300公顷,建设筹集保租房5万套
  • 上海国际电影节推出三大官方推荐单元,精选十部优秀影片
  • 海南省三亚市委原常委、秘书长黄兴武被“双开”
  • 泽连斯基称与特朗普通话讨论停火事宜
  • 东莞“超级”音乐节五一出圈背后:文旅热力何以澎湃经济脉动
  • 体坛联播|双杀阿森纳,巴黎晋级欧冠决赛对阵国际米兰