FreeSWITCH 的 mod_vmd
模块
mod_vmd
是 FreeSWITCH 的一个模块,用于语音邮件检测(Voicemail Detection)。它能够实时检测通话中的语音邮件提示音,并根据检测结果执行相应操作,如挂断或转接。
主要功能
-
语音邮件检测:
- 实时分析通话音频,识别语音邮件系统的提示音。
- 支持多种语音邮件系统的提示音。
-
自动处理:
- 检测到语音邮件后,可自动挂断或转接到其他号码。
- 支持自定义处理逻辑。
-
配置灵活:
- 通过配置文件或 API 调整检测参数和处理方式。
配置示例
-
加载模块:
在modules.conf.xml
中启用mod_vmd
:<load module="mod_vmd"/>
-
配置参数:
在autoload_configs/vmd.conf.xml
中设置参数:<configuration name="vmd.conf" description="Voicemail Detection"> <settings> <!-- 启用语音邮件检测 --> <param name="enabled" value="true"/> <!-- 检测到语音邮件后的动作,如挂断 --> <param name="action" value="hangup"/> <!-- 自定义提示音文件路径 --> <param name="prompt-file" value="/path/to/prompt.wav"/> </settings> </configuration>
-
拨号计划中使用:
在dialplan
中调用mod_vmd
:<extension name="vmd_detection"> <condition field="destination_number" expression="^1234$"> <action application="answer"/> <action application="vmd_start"/> <action application="bridge" data="user/1000"/> </condition> </extension>
API 命令
-
启动检测:
uuid_vmd_start <uuid>
-
停止检测:
uuid_vmd_stop <uuid>
-
获取检测状态:
uuid_vmd_status <uuid>
使用场景
- 呼叫中心:自动识别并处理语音邮件,提升效率。
- 个人用户:自动过滤语音邮件,减少手动操作。
注意事项
- 性能影响:实时音频分析可能增加系统负载,需合理配置。
- 兼容性:不同语音邮件系统的提示音可能不同,需针对性调整。
总结
mod_vmd
是 FreeSWITCH 中用于语音邮件检测的模块,能够自动识别并处理语音邮件,提升通话管理效率。通过灵活配置和 API 调用,用户可以根据需求定制检测逻辑。
在路由处给出一个标记is_vmd,当等于true时进行检测 否则不进行检测
可以通过全局配置 mod_vmd
并结合 FreeSWITCH 的路由逻辑实现按需检测。具体来说,可以在全局启用 mod_vmd
,然后在拨号计划(Dialplan)中根据路由信息(如通道变量)决定是否启动语音邮件检测。
以下是实现步骤:
1. 全局配置 mod_vmd
在 autoload_configs/vmd.conf.xml
中启用 mod_vmd
,但不设置强制检测:
<configuration name="vmd.conf" description="Voicemail Detection">
<settings>
<!-- 启用模块 -->
<param name="enabled" value="true"/>
<!-- 默认不自动启动检测,由拨号计划控制 -->
<param name="auto-start" value="false"/>
</settings>
</configuration>
2. 在拨号计划中根据标记启动检测
在拨号计划中,通过通道变量(如 is_vmd
)决定是否启动语音邮件检测。例如:
<extension name="conditional_vmd_detection">
<condition field="destination_number" expression="^(\d+)$">
<!-- 检查 is_vmd 变量是否为 true -->
<action application="set" data="is_vmd=true" inline="true"/>
<action application="answer"/>
<!-- 如果 is_vmd 为 true,启动语音邮件检测 -->
<action application="lua" data="vmd_control.lua"/>
<!-- 正常桥接通话 -->
<action application="bridge" data="user/1000"/>
</condition>
</extension>
3. 使用 Lua 脚本控制检测
创建一个 Lua 脚本(如 vmd_control.lua
),根据 is_vmd
变量决定是否启动检测:
-- vmd_control.lua
session = freeswitch.Session()
-- 获取 is_vmd 变量
local is_vmd = session:getVariable("is_vmd")
-- 如果 is_vmd 为 true,启动语音邮件检测
if is_vmd == "true" then
freeswitch.consoleLog("INFO", "Starting VMD detection for call " .. session:get_uuid() .. "\n")
session:execute("vmd_start")
else
freeswitch.consoleLog("INFO", "Skipping VMD detection for call " .. session:get_uuid() .. "\n")
end
4. 设置 is_vmd
变量
is_vmd
变量可以通过以下方式设置:
- 拨号计划中直接设置:
<action application="set" data="is_vmd=true"/>
- 通过 API 设置:
在呼叫发起时,通过originate
API 设置变量:originate user/1000 &bridge(user/1001{is_vmd=true})
- 通过外部系统设置:
如果呼叫由外部系统控制,可以在呼叫发起时通过uuid_setvar
设置变量。
5. 处理检测结果
mod_vmd
检测到语音邮件后,会触发事件 VMD_DETECTED
。可以在事件套接字(Event Socket)或 Lua 脚本中监听该事件并执行相应操作。例如:
-- 监听 VMD_DETECTED 事件
freeswitch.EventConsumer("VMD_DETECTED")
local event = freeswitch.EventConsumer():pop()
if event:getHeader("Event-Name") == "VMD_DETECTED" then
local uuid = event:getHeader("Unique-ID")
freeswitch.consoleLog("INFO", "Voicemail detected for call " .. uuid .. "\n")
-- 执行挂断或转接操作
session:execute("hangup")
end
6. 完整流程示例
- 呼叫进入 FreeSWITCH。
- 拨号计划检查
is_vmd
变量。 - 如果
is_vmd
为true
,启动mod_vmd
检测。 - 如果检测到语音邮件,触发
VMD_DETECTED
事件并执行相应操作(如挂断)。 - 如果未检测到语音邮件,继续正常通话。
总结
通过全局配置 mod_vmd
并结合拨号计划中的通道变量(如 is_vmd
),可以实现按需启动语音邮件检测。这种方式灵活且易于扩展,适用于需要动态控制检测的场景。