在FreeSwitch开源语音系统中,Say命令是一个非常有用的命令,使用此命令可以实现系统发声,构建功能复杂的交互式场景,Say接口将预先录好的声音对特定的内容放音,支持多语言。它主要使用预先录制好的语音结合 phrase(短语)框架,实现简单的语音。如果要使用复杂的语音还需要专门的TTS结合Speak来实现,本章主要介绍Say模块。
默认模块安装是英文版本,Freeswitch实现中语音,
在实际中使用到很多参考,Dialplan拨号计划和配置参数
基本命令:say(language sayType sayMethod text),其中Language 为语言,sayType 为播放的数据类型,sayMethod 为播放时的读法,text为播放的内容。
简介如下:
1,language:语言
en英语,zh中文,这个需要根据实际配置
2,sayType:数据类型
- ACCOUNT_NUMBER:账号。
- CURRENCY:货币。
- CURRENT_DATE:当前日期。
- CURRENT_DATE_TIME:当前日期时间。
- CURRENT_TIME:当前时间。
- EMAIL_ADDRESS:Email地址。
- IP_ADDRESS:IP地址。
- ITEMS:项目。
- MESSAGES:消息。
- NAME_PHONETIC:姓名拼写。
- NAME_SPELLED:姓名。
- NUMBER:数字。
- PERSONS:人名。
- POSTAL_ADDRESS:邮寄地址。
- SHORT_DATE_TIME:短日期时间。
- TELEPHONE_EXTENSION:分机号。
- TELEPHONE_NUMBER:手机号码。
- TIME_MEASUREMENT:时间。
- URL:网址。
3,sayMethod:读法(并不是所有语言都实现了全部读法)
- COUNTED:以序数词方式读出。
- ITERATED:逐个数字读出。
- PRONOUNCED:以基数词方式读出。
4,举个简单的例子:
<extension name="socket_767_example">
<condition field="destination_number" expression="^767\d+$">
<action application="answer"/>
<action application="say" data="en name_spelled intered 3456789abck"></action>
<action application="say" data="zh NUMBER ITERATED 13781655437"></action>
<action application="playback" data="voicemail/vm-goodbye.wav"></action>
</condition>
</extension>
说明:
- application="say",代表使用say应用。
- data="en name_spelled iterated 3456789abck"
- en=语言(英文),name_spelled= 数据类型(姓名类型),iterated =读法(逐个数字读出)
使用命令行呼叫,测试say
1,拨号盘计划
<extension name="socket_767_example">
<condition field="destination_number" expression="^767\d+$">
<action application="answer"/>
<action application="say" data="en name_spelled intered 3456789abck"></action>
<action application="say" data="zh NUMBER ITERATED 13781655437"></action>
<action application="playback" data="voicemail/vm-goodbye.wav"></action>
</condition>
</extension>
originate {ignore_early_media=true}user/1004 7678 xml default
拨号1004用户,路由到7678 拨号计划,该计划在default的xml中
2,调整拨号计划:使用${nice_code}信道变量,动态播报
<!--say测试-->
<extension name="socket_767_example">
<condition field="destination_number" expression="^767\d+$">
<action application="answer"/>
<action application="say" data="en name_spelled intered ${nice_code}"></action>
<action application="say" data="zh NUMBER ITERATED 13781655437"></action>
<action application="playback" data="voicemail/vm-goodbye.wav"></action>
</condition>
</extension>
originate {ignore_early_media=true,nice_code=abcdefg}user/1004 7678 xml default
命令行使用nice_code设置了变量,手机能正常播报动态验证码,可以设置多个信道变量。这也可以通过ESl批量外呼实现语音播报。
3,通过lua脚本实现
-- 先应答,防止电话断掉
session:answer();
--使用if语句
if (session:ready() == true) then
-- 防止自动挂断
session:setAutoHangup(false);
-- 通过信道变量获得外部传参
local order_number = session:getVariable("nice_code");
local order_t = session:getVariable("order_t");
session:execute("say","en name_spelled ITERATED " .. order_t);
session:execute("say","zh NUMBER ITERATED " .. order_number);
end
originate {ignore_early_media=true,nice_code=186876657,order_t=018791231}user/1002 &lua(Verification.lua)
补充:
session:say("1100","cn","name_spelled","ITERATED");
不起作用,读的依旧是中文,
但是 session:execute("say","en name_spelled ITERATED 1100");又是英文,很是奇怪。