mod_com_amd
自动识别答录机(AMD)是任何电话系统中的一个重要功能。它用于筛选呼出电话,以确定是由人还是机器(如IVR或语音邮件系统)接听呼叫。如果接听的是人,呼叫可以转接给人工坐席。如果检测到是机器,则系统可能要结束呼叫或留下语音邮件。
关于
mod_com_amd是FreeSWITCH™商业模块,用于分析呼叫进展并确定是由人还是机器接听。
单击此处展开目录
使用SignalWire进行AMD
您可以使用兼容性API访问AMD功能,该API旨在使从其他提供商迁移变得容易,同时让您访问我们的下一代API和终端节点。通过使用创建呼叫终端节点,您可以使用Machine Detection参数启用AMD,或者通过使用DetectMessageEnd
值,甚至可以监听机器消息的结束。
介绍
FreeSWITCH™提供了一款经许可的商业自动答录机检测模块。对于自动拨号器来说,能够检测到人工接听和答录机的能力是至关重要的。由于在电话被答录机或语音信箱接听时没有任何指示/硬件信号,自动拨号器系统必须分析传入的音频以进行预测。目前,还没有一种算法能够达到100%的准确率。
获得许可证
所有FreeSWITCH™的购买都必须通过我们的计费系统进行。请访问https://endor.freeswitch.com/cart.php?gid=15,点击右上角的"Account"菜单,然后选择"Register"。
注册完成后,前往登录页面https://endor.freeswitch.com/cart.php?gid=15,并提供您的凭据。登录系统后,您将在页面顶部看到一个名为"Products"的菜单,点击并选择"Order New Products"。直达链接:https://endor.freeswitch.com/cart.php?a=confproduct&i=0。
在购物车页面上,向下滚动屏幕,您将看到AMD产品描述。点击"Order Now"按钮。直达链接:https://endor.freeswitch.com/cart.php?a=confproduct&i=1。
在下一个界面上,您需要输入所需的许可证数量。每创建一个需要激活检测的通道都需要一个许可证。如果您有5个同时通话,并且希望检测谁在接听,您将需要5个端口/通道。在选择许可证数量后,点击"Add to Cart"。
如果您需要为不同的服务器激活许可证,您需要分别购买它们。例如,如果您需要5个许可证给服务器A,以及额外的10个许可证给服务器B,先将5个许可证添加到购物车,然后再次添加10个许可证,您将收到两个激活码,一个用于每个服务器。
现在您可以继续付款,在页面底部有一个"完成订单"按钮。付款方式是PayPal,如果您没有PayPal账户,请前往PayPal的注册页面并按照提示进行操作。
付款后,PayPal将通知FreeSWITCH™计费系统有关新付款的信息,许可证将通过电子邮件发送给您。此过程需要几分钟的时间,如果您在几分钟内未收到电子邮件,请通过consulting@freewitch.org或在irc.freenode.net的#freeswitch联系我们。有关如何与我们联系的更多信息,请访问IRC页面。
安装
FreeSWITCH 1.8的更新指令
安装软件包
apt-get install freeswitch-mod-com-amd
取消注释或在autoload_configs/modules.conf.xml中创建以下内容
<load module="mod_com_amd"/>
验证许可证
freeswitch-license-validator
FreeSWITCH产品许可工具
您将需要一个或多个销售代码来激活许可证
输入销售代码,或留空结束: 0abd19753bf28fbb88a5d74
输入销售代码,或留空结束:
要激活的销售代码:
0abd19753bf28fbb88a5d74
确认(Y/N)? y
成功。licences.zip文件包含有效的许可证。
将其解压到/etc/freeswitch/
解压密钥
unzip licences.zip
归档:licences.zip
解压缩中:0abd19753bf28fbb88a5d74.conf
将密钥复制到 /etc/freeswitch(不要将zip文件放在那里)
```xml
cp 0abd19753bf28fbb88a5d74.conf /etc/freeswitch
关闭freeswitch
systemctl stop freeswitch
启动许可证服务器
freeswitch-license-server
扫描/etc/freeswitch/0abd19753bf28fbb88a5d7.conf以获取许可证
购买代码0abd19753bf28fbb88a5d74
10个AMD通道
再次启动freeswitch
systemctl start freeswitch
检查amd是否与许可证服务器通信
fs_cli -x amd_info
检查AMD/0成功
可用的AMD许可证=>10
已分配的AMD许可证=>0
在拨号计划中进行一些测试。下载测试wav文件Answering_Machine.wav。
<extension name="amd_test" continue="false">
<condition field="destination_number" expression="^(amd|263)$"/>
<condition field="${amd_available()}" expression="true">
<!-- 检查通道可用性的替代方法 -->
<!--<condition field="${regex ${amd_info}|available => 0}" expression="false">-->
<!-- <action application="set" data="media_bug_answer_req=true"/> -->
<action application="set" data="amd_execute_on_machine=transfer machine_found XML default"/>
<action application="set" data="amd_execute_on_person=transfer person_found XML default"/>
<action application="set" data="amd_execute_on_unsure=transfer amd_unsure XML default"/>
<!-- <action application="set" data="api_on_answer=uuid_displace ${uuid} start ${sounds_dir}/Answering_Machine.wav 0 mr"/> -->
<action application="answer"/>
<action application="voice_start"/>
<action application="playback" data="silence_stream://100,1000"/>
<action application="playback" data="tone_stream://(2000,4000,440,480)"/>
<action application="sleep" data="20000"/>
<action application="hangup"/>
<anti-action application="playback" data="${sounds_dir}/All_Circuits_Busy.mp3"/>
<anti-action application="hangup"/>
</condition>
</extension>
<extension name="Found Machine">
<condition field="destination_number" expression="^(machine_found)$">
<action application="playback" data="ivr/ivr-welcome_to_freeswitch.wav"/>
<action application="log" data="CRIT AMD result is => ${amd_status} and AMD Status is => ${amd_result}"/>
<action application="voice_stop"/>
<action application="hangup"/>
</condition>
</extension>
<extension name="Found Person">
<condition field="destination_number" expression="^(person_found)$">
<action application="playback" data="misc/if_you_are_this_person.wav"/>
<action application="log" data="CRIT AMD result is => ${amd_status} and AMD Status is => ${amd_result}"/>
<action application="voice_stop"/>
<action application="hangup"/>
</condition>
</extension>
<extension name="AMD Unsure">
<condition field="destination_number" expression="^(amd_unsure)$">
<action application="playback" data="misc/error.wav"/>
<action application="log" data="CRIT AMD result is => ${amd_status} and AMD Status is => ${amd_result}"/>
<action application="voice_stop"/>
<action application="hangup"/>
</condition>
</extension>
<action application="sleep" data="200 s"/>
<action application="hangup"/>
<anti-action application="playback" data="${sounds_dir}/All_Circuits_Busy.mp3"/>
<anti-action application="hangup"/>
</condition>
</extension>
<extension name="找到机器">
<condition field="destination_number" expression="^(machine_found)$">
<action application="playback" data="ivr/ivr-welcome_to_freeswitch.wav"/>
<action application="log" data="CRIT AMD 结果为 => ${amd_status} 和 AMD 状态为 => ${amd_result}"/>
<action application="voice_stop"/>
<action application="hangup"/>
</condition>
</extension>
<extension name="找到人">
<condition field="destination_number" expression="^(person_found)$">
<action application="playback" data="misc/if_you_are_this_person.wav"/>
<action application="log" data="CRIT AMD 结果为 => ${amd_status} 和 AMD 状态为 => ${amd_result}"/>
<action application="voice_stop"/>
<action application="hangup"/>
</condition>
</extension>
<extension name="AMD 不确定">
<condition field="destination_number" expression="^(amd_unsure)$">
<action application="playback" data="misc/error.wav"/>
<action application="log" data="CRIT AMD 结果为 => ${amd_status} 和 AMD 状态为 => ${amd_result}"/>
<action application="voice_stop"/>
<action application="hangup"/>
</condition>
</extension>
检查可用许可证
这是检查频道可用性的首选方法
<condition field="${amd_available()}" expression="true">
或者您可以通过使用amd_info api根据正则表达式来检查许可证是否可用
<condition field="${regex ${amd_info}|available => 0}" expression="false">
如果正则表达式为false,那么继续使用amd,如果为true,则执行通知客户的反操作,并播放自定义音频文件
<anti-action application="playback" data="${sounds_dir}/All_Circuits_Busy.mp3"/>
<anti-action application="hangup"/>
关于圆括号"()":的注释
通道可供使用时的"false"示例:
正确的拨号计划用法:不带括号,产生通过:
<condition field="${regex ${amd_info}|available => 0}" expression="false">
日志:
拨号计划:sofia/internal/1003@192.168.150.3:65062 Regex (PASS) [amd_test] ${expand regex ${amd_info}|available => 0}(false) =~ /false/ break=on-false
不正确的使用方法:带括号的拨号计划,产生-ERR:
<condition field="${regex ${amd_info()}|available => 0}" expression="false">
日志:
拨号计划:sofia/internal/1003@192.168.150.3:65062 Regex (FAIL) [amd_test] ${regex ${amd_info()}|available => 0}(-ERR) =~ /false/ break=on-false
所有通道当前正在使用时的"true"示例
正确的ESL用法:带括号
freeswitcha> expand regex ${amd_info()}|available => 0
true
不正确的ESL用法:不带括号
freeswitcha> expand regex ${amd_info}|available => 0
false
旧版Freeswitch 1.6的说明
我们已将我们的商业模块打包成一个单独的安装程序,目前提供的所有产品(mod_com_amd, mod_com_g729, mod_com_g719, mod_com_g728)都已安装,并且占用非常少的空间。
下载和运行安装程序
cd /tmp
wget http://files.freeswitch.org/amd/fs-latest-installer
chmod +x fs-latest-installer
./fs-latest-installer
这将引导你完成一些安装步骤。我们尝试检测你的FreeSWITCH™安装可能的常见位置。如果我们无法检测到它,那么我们将要求提供有关FreeSWITCH™安装位置的信息。你还可以选择将数据作为参数提供给fs-latest-installer二进制文件:
安装程序参数
./fs-latest-installer <bin_path> <mods_path> <config_path>
一旦你接受了最终用户许可协议(EULA),你将看到类似于以下内容的输出:
安装中
谢谢!
运行安装程序
停止许可证服务器
安装新的许可证服务器
安装新的FreeSWITCH模块
安装激活工具
创建许可证目录
运行ldconfig...
清理中...
现在,你可以通过运行/usr/local/freeswitch/bin/validator来激活你的产品许可证。
谢谢
完成。
完成后,你需要使用安装完成/感谢消息中提到的验证程序激活你的许可证。对于我们在线商店提供的任何商业产品,都可以使用相同的验证程序应用程序。
启动验证程序后,你将看到类似于以下内容的输出:
许可工具 - 安装新的许可证。
FreeSwitch产品许可工具
您将需要一个或多个销售代码来激活许可证。 输入一个销售代码,或者留空以结束:8c87ca579c46258a5e2ee9f98ca3f93ca4752d26 输入一个销售代码,或者留空以结束:
将要激活的销售代码: 8c87ca579c46258a5e2ee9f98ca3f93ca4752d26
确定(Y/N)?Y 成功。文件licences.zip包含有效的许可证。 将其解压缩到/etc/freeswitch/中。
生成的licences.zip将位于当前工作目录中,解压并将.conf文件复制到/etc/freeswitch中:
**解压许可证**
```xml
unzip licences.zip
归档:licences.zip
解压:8c87ca579c46258a5e2ee9f98ca3f93ca4752d26.conf
cp 8c87ca579c46258a5e2ee9f98ca3f93ca4752d26.conf /etc/freeswitch
在此处硬编码路径
/etc/freeswitch 是 硬编码路径,freeswitch_license_server 将自动扫描并重新启动... 无论您在哪里安装了FreeSWITCH,都必须将<HEX>.conf文件放在 /etc/freeswitch 中。
要让许可证处理程序知道您的新许可证,请运行:
重新加载许可证服务器
pkill -HUP freeswitch_licence_server
这将使许可证服务器重新扫描目录,将任何其他许可证添加到您可进行许可的资源列表中。我们刚刚激活了一个mod_com_amd许可证,当加载该模块时,它将显示如下:
加载mod_com_amd
2014-05-28 09:51:52.344344 [INFO] mod_enum.c:880 ENUM重新加载
2014-05-28 09:51:52.344344 [INFO] switch_time.c:1369 时区重新加载,共有530个定义
2014-05-28 09:51:52.344344 [INFO] mod_com_amd.c:749 AMD许可数量 => 20
2014-05-28 09:51:52.344344 [CONSOLE] switch_loadable_module.c:1466 模块[mod_com_amd]加载成功
2014-05-28 09:51:52.344344 [NOTICE] switch_loadable_module.c:269 添加应用 'waitforresult'
2014-05-28 09:51:52.344344 [NOTICE] switch_loadable_module.c:269 添加应用 'voice_start'
2014-05-28 09:51:52.344344 [NOTICE] switch_loadable_module.c:269 添加应用 'voice_stop'
2014-05-28 09:51:52.344344 [NOTICE] switch_loadable_module.c:315 添加API函数 'amd_count'
2014-05-28 09:51:52.344344 [NOTICE] switch_loadable_module.c:315 添加API函数 'amd_available'
2014-05-28 09:51:52.344344 [NOTICE] switch_loadable_module.c:315 添加API函数 'amd_info'
freeswitch@internal> amd_info
可用的AMD许可 => 20
已分配的AMD许可 => 0
freeswitch@internal> amd_available
true
freeswitch@internal> amd_count
20
正如您所看到的,它能够看到刚刚安装的许可证,您可以使用注册的各种API调用来管理您的许可证。
默认配置
默认的mod_com_amd配置在大多数情况下都是适用的,但如果您需要调整配置,请转到 /usr/local/freeswitch/conf/autoload_configs 并打开 amd.conf.xml 文件:
amd.conf.xml
<configuration name="amd.conf" description="AMD Configuration">
<!-- AMD -->
<settings>
<!-- silent_threshold(静音阈值): 参考mod_conference使用的音量级别,决定是否开启AMD检测 -->
<param name="silent_threshold" value="256"/>
<!-- silent_initial(初始静音时间): 以毫秒为单位,在接听电话后一段时间内保持静音,以便将状态设置为“初始静音” -->
<param name="silent_initial" value="4500"/>
<!-- silent_after_intro(开场后静音时间): 以毫秒为单位,在最初的非静音问候语之后的一段时间内保持静音,以便将状态设置为“开场后静音” -->
<param name="silent_after_intro" value="1000"/>
<!-- silent_max_session(最大静音时间): 以毫秒为单位,在允许检测完成之前的总静音时间 -->
<param name="silent_max_session" value="200"/>
<!-- noise_max_intro(开场最大噪音时间): 以毫秒为单位,在初始问候语中超过该时间的长度,将其状态设置为“最大开场噪音” -->
<param name="noise_max_intro" value="1250"/>
<!-- noise_min_length(最小噪音时间): 以毫秒为单位,作为判断一个单词的最小长度 -->
<param name="noise_min_length" value="120"/>
<!-- noise_inter_silence(噪音间隔时间): 以毫秒为单位,作为判断一个单词的间隔时间 -->
<param name="noise_inter_silence" value="30"/>
<!-- noise_max_count(最大噪音数量): 如果噪音(单词)的数量超过该值,结果将被设置为“最大噪音数量”,并将状态设置为“机器声音” -->
<param name="noise_max_count" value="6"/>
<!-- total_analysis_time(总分析时间): 以毫秒为单位,是我们尝试分析通话的总时间 -->
<param name="total_analysis_time" value="5000"/>
<!-- debug(调试标志): 设置为1以获得更多调试信息 -->
<param name="debug" value="1"/>
</settings>
</configuration>
通过呼叫计划覆盖配置参数值
<action application="voice_start" data="silent_threshold=96,
silent_initial=3500,
silent_after_intro=1500,
silent_max_session=200,
noise_max_intro=2250,
noise_min_length=175,
noise_inter_silence=50,
noise_max_count=10,
total_analysis_time=5000,
debug=1"/>
实例
让我们来看看如何使用 mod_com_amd。
XML 拨号计划示例
您可以通过 XML 拨号计划使用 mod_com_amd 的第一种方式。在加载该模块时,将创建三个应用程序:
- voice_start
- voice_stop
- waitforresult
让我们构建一个拨号计划,当呼叫由机器接听时,会发送一条消息到语音信箱:
AMD 拨号计划 XML 示例
<extension name="amd_example" continue="false">
<condition field="destination_number" expression="^5551212$">
<action application="set" data="media_bug_answer_req=true"/>
<action application="set" data="amd_execute_on_machine=transfer machine_detected XML default"/>
<action application="voice_start"/>
<action application="playback" data="/usr/local/freeswitch/sounds/en/us/callie/ivr/8000/ivr-welcome_to_freeswitch.wav"/>
<action application="playback" data="/usr/local/freeswitch/sounds/en/us/callie/ivr/8000/ivr-welcome_to_freeswitch.wav"/>
<action application="playback" data="/usr/local/freeswitch/sounds/en/us/callie/ivr/8000/ivr-welcome_to_freeswitch.wav"/>
<action application="playback" data="/usr/local/freeswitch/sounds/en/us/callie/ivr/8000/ivr-welcome_to_freeswitch.wav"/>
<action application="info"/>
<action application="hangup"/>
</condition>
</extension>
<extension name="Found machine">
<condition field="destination_number" expression="^(machine_detected)$">
<action application="wait_for_silence" data="300 30 5 25000"/>
<action application="sleep" data="8000"/>
<action application="playback" data="/usr/local/freeswitch/sounds/en/us/callie/ivr/8000/ivr-welcome_to_freeswitch.wav"/>
<action application="info"/>
<action application="hangup"/>
</condition>
</extension>
注意amd_execute_on_machine和voice_start变量。
当电话接通时,FreeSWITCH™将将其路由到分机“amd_example”。该分机将设置变量amd_execute_on_machine,如果电话被机器接通,则将将通话转接到目标“machine_detected”,上下文为“default”,否则将执行播放动作(拨号计划行6、7、8和9)。
如果机器接听了这个电话,它将被转接到我们的下一个分机machine_detected,这在您想要在客户的语音信箱中留言时非常有用,您可以使用wait_for_silence应用程序等待语音信箱的初始问候结束,然后留下您的留言。
mod_com_amd设置了一个名为“amd_status”的变量,其值可以是“human”或“machine”。您可以使用“info”应用程序查看该值(拨号计划行20)。
在这个第一个示例中,您可以使用以下方式发起一个到5551212的电话:
发起呼叫
bgapi originate {ignore_early_media=true}sofia/profile/number 5551212
这将呼叫到sofia/profile/number,当被接通时,FreeSWITCH™将在拨号计划中查找与5551212匹配的分机。
Lua示例
如果您正在使用Lua构建路由逻辑,您可以使用先前在xml拨号计划中使用的相同的应用程序和变量。示例:
dialer.lua
local dst_number = argv[1]
-- 连接到freeswitch API。
api = freeswitch.API()
use_amd = api:executeString("amd_available")
subscriber_session = freeswitch.Session("{ignore_early_media=true}sofia/gateway/mygw/" .. dst_number)
while (subscriber_session:ready() and not subscriber_session:answered()) do
-- 等待回答。
freeswitch.msleep(500)
end
if subscriber_session:ready() and subscriber_session:answered() then
freeswitch.consoleLog("INFO", string.format("已接听的号码 %s.", dst_number))
freeswitch.consoleLog("INFO", string.format("%s 已启用AMD.", dst_number))
if use_amd == "true" then
subscriber_session:execute("voice_start")
-- 给AMD一些时间处理通话
subscriber_session:sleep(3000)
subscriber_session:execute("voice_stop")
amd_detect = subscriber_session:getVariable("amd_status")
if amd_detect == "machine" then
freeswitch.consoleLog("INFO", "amd_status: 机器")
subscriber_session:execute("wait_for_silence", "300 30 5 25000")
subscriber_session:execute("playback", "/usr/local/freeswitch/sounds/en/us/callie/ivr/8000/ivr-welcome_to_freeswitch.wav")
subscriber_session:hangup()
return
end
-- 有人接听时执行的操作。例如将通话转接至操作员/用户100。
subscriber_session:execute("bridge", "user/100")
end
else
freeswitch.consoleLog("INFO", string.format("无法呼叫 %s", dst_number))
return
end
使用以下 XML 调用此 Lua 脚本进行测试:
luarun dialer.lua 55552222
测试拨号计划
用于自我测试配置设置的 XML... 确保下载 Answering_Machine.wav 文件并放置在您的 sound 目录中。通过此设置,您应该能够调整设置并了解其值,超出默认值。
<extension name="amd_test" continue="false">
<condition field="destination_number" expression="^(amd_test|263)$">
<action application="set" data="media_bug_answer_req=true"/>
<action application="set" data="amd_execute_on_machine=transfer machine_found XML default"/>
<action application="set" data="amd_execute_on_person=transfer person_found XML default"/>
<action application="set" data="amd_execute_on_unsure=transfer amd_unsure XML default"/>
<action application="voice_start"/>
<action application="set" data="api_on_answer=uuid_displace ${uuid} start ${sounds_dir}/Answering_Machine.wav 0 mr"/>
<action application="answer"/>
<action application="waitforresult" data="ivr/ivr-one_moment_please.wav"/>
<action application="sleep" data="200"/>
<action application="playback" data="tone_stream://%(200,100,500,400,300,50,25);loops=2"/>
<action application="sleep" data="200"/>
<action application="log" data="CRIT AMD Result is => ${amd_status} => ${amd_result}"/>
<action application="hangup"/>
</condition>
</extension>
<extension name="Found Machine">
<condition field="destination_number" expression="^(machine_found)$">
<action application="playback" data="ivr/ivr-welcome_to_freeswitch.wav"/>
<action application="log" data="CRIT AMD result Machine Found is => ${amd_status} => ${amd_result}"/>
<action application="voice_stop"/>
<action application="hangup"/>
</condition>
</extension>
<extension name="找到人员">
<condition field="destination_number" expression="^(person_found)$">
<action application="playback" data="misc/if_you_are_this_person.wav"/>
<action application="log" data="CRIT AMD result Machine Found is => ${amd_status} => ${amd_result}"/>
<action application="voice_stop"/>
<action application="hangup"/>
</condition>
</extension>
<extension name="AMD 不确定">
<condition field="destination_number" expression="^(amd_unsure)$">
<action application="playback" data="misc/error.wav"/>
<action application="log" data="CRIT AMD result Machine Found is => ${amd_status} => ${amd_result}"/>
<action application="voice_stop"/>
<action application="hangup"/>
</condition>
</extension>
uuid_displace 有 [m]ux 和 [r]ead 选项,这样您可以听到找到的分机的音频,并将答录机文件发送到读取通道上,以便 amd 可以对其进行操作。
有关 mod_com_amd 的更多技术信息
点击此处展开...
mod_amd - 适用于FreeSWITCH的答录机检测模块 mod_amd提供了三种不同的拨号计划应用程序和多个通道变量。 检测过程中还会触发事件,请参考以下列表。 应用程序: voice_start - 在通道上启动答录机检测 voice_stop - 停止通道上的答录机检测 waitforresult [\<播放等待期间要播放的文件>] - 等待AMD返回结果,并可选择播放文件 通道变量,结果: amd_status - 包含检测到的内容: 'person'(人), 'machine'(机器), 'unsure'(不确定) 基本上,除了'machine'(机器)以外的任何内容都可以认为是人 amd_result - 包含有关检测到的更多信息: 'too-long'(检测过程超过total_analysis_time(amd.conf.xml)所设定的时间), 'max-count'(检测到最大噪音帧数,很可能是机器说话), 'max-intro'(在介绍期间检测到最大噪音帧数,很可能是机器说话), 'silent-initial'(线路上没有听到声音,认为是人), 'silent-after-intro'(短时间的噪音帧后跟着寂静,很可能是人) 通道变量,控制: execute_on_machine_app - 如果检测到机器,则执行的应用程序 execute_on_machine_arg - 如果检测到机器,则执行的应用程序参数 事件: CUSTOM::AMD::EVENT - 动作:开始交谈 CUSTOM::AMD::EVENT - 动作:停止交谈 SWITCH_MEDIA_BUG_ADD - 在检测过程开始时触发 SWITCH_MEDIA_BUG_REMOVE - 在检测过程停止时触发 查找variable_amd_status标头 用法 mod_amd有三种使用方式: 通过事件套接字,其中一个基于事件的脚本监听AMD事件并相应地进行操作 通过提供的JavaScript文件 通过拨号计划设置"execute_on_machine_app"和"execute_on_machine_arg" 有关简单示例,请参阅default.xml
附件:
PortalHome-_FreeSWITCH.png (image/png)
Register_-_FreeSWITCH.png (image/png)
ClientArea-_FreeSWITCH.png (image/png)
ClientArea-_FreeSWITCH_and_italorossi_freeswitch_234_nt_Welcome_to_FreeSWITCH_H%E2%80%A6.png (image/png)
ShoppingCart-_FreeSWITCH_and_italorossi_freeswitch_234_nt_Welcome_to_FreeSWITCH_H%E2%80%A6.png (image/png)
ShoppingCart-FreeSWITCH-_Ports.png (image/png)
ShoppingCart-_FreeSWITCH_Review_Checkout.png (image/png)
Answering_Machine.wav (audio/x-wav)
Answering_Machine.wav (audio/x-wav)
使用AMD创建通话
Compatibility API可以通过设置呼叫的某些参数来创建带有AMD的外呼通话,详情请参考创建通话端点。有六个相关的AMD参数需要注意。
MachineDetection
:可选值为Enable
,DetectMessageEnd
和none
。默认值为none
,表示禁用机器检测。当检测到机器时,选择Enable
将开启检测,并立即返回结果。如果计划在检测到机器时挂断通话,可以使用此设置。选择DetectMessageEnd
将等待机器消息结束后再播放语音信箱的消息。MachineDetectionSilenceTimeout
:这是AMD在返回unknown
之前等待初始语音的时间。默认值为5000毫秒。请注意,此值使用的单位与MachineDetectionTimeout
不同。增加此值可能增加获取详细AMD结果的机会,但也可能增加确定时间。MachineDetectionSpeechThreshold
:设定SignalWire在确定语音为机器之前检测语音的持续时间。默认值为2400毫秒。人类通常会有短暂的招呼词,如“你好”或“你好,Dr. Who的办公室。我是Rose。”而机器的招呼通常更长。因此,低于此设置的任何持续时间将返回人类决定,高于此设置的任何持续时间将返回machine
表示机器。增加此值可能降低将实际为人类说话的情况错误判断为机器的概率。减小此值可能降低在短机器招呼的情况下将实际为机器说话的情况错误判断为人类的概率,但更好的解决方案是使用下面的参数来处理此情况。MachineDetectionSpeechEndThreshold
:在静 silence 等待的毫秒数之后,接收到的语音被认为是完整的。这是一个与MachineDetectionSpeechThreshold
一起使用的重要参数。下面以一个示例来说明为什么。如果机器人问候语以 "嗨,你打到了 Who医生的办公室" 开始,然后在说 "我们目前在旅行中,请留言" 之前暂停了 1500 毫秒,你希望你的MachineDetectionSpeechEndThreshold
的值大于 1500 ,以便将问候语的整个时间用于MachineDetectionSpeechThreshold
的测量。默认值为 1200 毫秒。增加此值会延迟检测所需的时间,并可能导致在人工接听电话、暂停一下后再说话时出现误判为机器。MachineDetectionTimeout
:这是 SignalWire 在机器检测结束之前等待的时间。默认值为 30 秒,但在使用DetectMessageEnd
时,您可能需要增加该值以应对更长的语音信箱问候语。在使用Enable
时,您可能需要减少该值以限制检测的时间。MachineWordsThreshold
:在返回机器结果之前,计算有多少个单词, 默认值为 6 个单词。如果计数的单词多于此值,就会被解释为机器。一般来说,人类问候语使用的单词比机器问候语少。此设置的工作方式与MachineDetectionSpeechThreshold
非常相似。增加该值可以减少误判为机器的情况,尤其是在较长的人类问候语(如在商务场合)的情况下。减少该值可以减少误判为人类的情况,因为即使是短的机器消息通常也比人类使用的单词多。
呼叫可能类似于以下内容:
cURL
Node
const { RestClient } = require("@signalwire/compatibility-api");
const client = RestClient("YourProjectID", "YourAuthToken", {
signalwireSpaceUrl: "example.signalwire.com",
});
client.calls
.create({
url: "http://your-application.com/docs/voice.xml",
to: "+13105678901",
from: "+13103384645",
machineDetection: "DetectMessageEnd",
machineDetectionTimeout: 45,
MachineDetectionSilenceTimeout: 3000,
MachineDetectionSpeechThreshold: 3000,
MachineDetectionSpeechEndThreshold: 2000,
MachineWordsThreshold: 9,
})
.then((call) => console.log(call.sid))
.done();
AMD 的结果将返回到您在呼叫请求中提供的 URL 上。结果类似于以下内容:
AccountSid=28XXXXXX-XXXX-XXXX-XXXX-XXXXXXXX53b1
From=+12223334444
To=+17778889999
Called=+17778889999
CallStatus=initiated
ApiVersion=2010-04-01
Direction=outbound-api
AnsweredBy=human
请注意,AMD检测结果存储在AnsweredBy
参数中。因此,您可以使用req.body.AnsweredBy
访问该值。AnsweredBy
参数的可能值取决于您的拨出呼叫请求中的AMD设置。
- 如果使用了
Enable
,可能的结果是machine_start
、human
、fax
或unknown
。 - 如果使用了
DetectMessageEnd
,可能的结果是machine_end_beep
、machine_end_silence
、machine_end_other
、human
、fax
或unknown
。
异步AMD
AMD也可以以异步方式使用。呼叫可以立即连接,以便在后台执行AMD时您可以开始其他逻辑。要启用异步AMD,您需要包含AsyncAmd
参数并将其设置为true
,提供一个AsyncAmdStatusCallback
URL来接收检测结果,并将AsyncAmdStatusCallbackMethod
设置为GET或POST方法。只有在拥有所有这些部分的情况下,您的应用程序才能在后台执行AMD并将结果发送到状态回调URL。在应用程序执行其他逻辑的同时,还可以监听状态回调以做出相应的反应。
cURL
curl https://example.signalwire.com/api/laml/2010-04-01/Accounts/{AccountSid}/Calls.json \
-X POST \
--data-urlencode "Url=http://your-application.com/docs/voice.xml" \
--data-urlencode "To=+12223334444" \
--data-urlencode "From=+17778889999" \
--data-urlencode "MachineDetection=DetectMessageEnd" \
--data-urlencode "MachineDetectionTimeout=45" \
--data-urlencode "AsyncAmd=true" \
--data-urlencode "AsyncAmdStatusCallback=https://your-api-endpoint.com/path" \
--data-urlencode "AsyncAmdStatusCallbackMethod=POST" \
-u "YourProjectID:YourAuthToken"
Node
const { RestClient } = require("@signalwire/compatibility-api");
const client = RestClient("YourProjectID", "YourAuthToken", {
signalwireSpaceUrl: "example.signalwire.com",
});
client.calls
.create({
url: "http://your-application.com/docs/voice.xml",
to: "+13105678901",
from: "+13103384645",
machineDetection: "DetectMessageEnd",
machineDetectionTimeout: 45,
asyncAmd: true,
asyncAmdStatusCallback: "https://your-api-endpoint.com/path",
asyncAmdStatusCallbackMethod: "POST",
})
.then((call) => console.log(call.sid))
.done();
总结(Wrap Up)
自动答录机检测是任何电话系统的一种非常有用的工具,尤其是对于高流量的系统来说。通过只在有人接听的时候连接电话,您可以节省客服人员的时间。您可以在我们的使用 Node.js 进行自动答录机检测指南中找到一个完整的工作示例。