IVR(Interactive Voice Response)交互式语言应答,是呼叫中心的1个经典应用场景,FreeSwitch官方有一个利用lua实现的简单示例,大致原理是利用lua脚本+TTS实现,记录一下:(环境:FreeSwitch 1.10.11 + Windows 10)
步骤1:安装TTS
FreeSwitch自带了1个TTS引擎(发音效果比较生硬,仅支持英文,不过用来学习足够了),找到安装目录下的 freeswitch/conf/modules.conf.xml
<!-- ASR /TTS --> <load module="mod_flite"/> <!-- <load module="mod_pocketsphinx"/> --> <!-- <load module="mod_cepstral"/> --> <!-- <load module="mod_tts_commandline"/> --> <!-- <load module="mod_rss"/> -->
找到ASR /TTS这一节,把mode_flite注释去掉,然后重启FreeSwitch 生效(如果没生效,检查是否有mod_flite.dll这个文件)
步骤2:配置路由
\FreeSWITCH\conf\dialplan\default\welcome.xml,在default目录 下,创建welcome.xml文件,内容如下:
<include> <extension name="welcome_ivr"> <condition field="destination_number" expression="^2910$"> <action application="lua" data="welcome.lua"/> </condition> </extension> </include>
这段的意思是 如果被叫号码是2910,将由welcome.lua脚本来执行后续逻辑。
步骤3:编写交互逻辑lua脚本
\FreeSWITCH\scripts\welcome.lua (创建该文件),内容如下:
-- 先应答,防止电话断掉 session:answer(); while (session:ready() == true) do -- 防止自动挂断 session:setAutoHangup(false); -- 设置TTS引擎参数 session:set_tts_params("flite", "kal"); -- 播放欢迎语音 session:speak("Hello. Welcome to the VoIp World!"); -- 睡100ms session:sleep(100); -- 播放提示语音 session:speak("please select an Action."); session:sleep(100); -- 按1转到1001分机 session:speak("to call 1001, press 1"); session:sleep(100); -- 按2挂断 session:speak("to hangup , press 2"); session:sleep(2000); -- 等待按键(5秒超时) digits = session:getDigits(1, "", 5000); if (digits == "1") then -- 按1,转到1001分机 session:execute("bridge","user/1001"); end if (digits == "2") then -- 按2,播放bye,bye语音,然后挂断 session:speak("bye bye"); session:hangup(); end end
参考文档:
标签:互动式,--,lua,session,sleep,IVR,TTS,speak From: https://www.cnblogs.com/yjmyzz/p/17962404/ivr_sample_using_freeswitch_and_lua_script