首页 > 其他分享 >freeswitch+lua实现IVR(互动式语音应答)

freeswitch+lua实现IVR(互动式语音应答)

时间:2024-01-13 15:46:09浏览次数:47  
标签:互动式 -- lua session sleep IVR TTS speak

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

 

参考文档:

https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Client-and-Developer-Interfaces/Lua-API-Reference/Lua-examples/Lua-Welcome-IVR-example_3965157/#about

标签:互动式,--,lua,session,sleep,IVR,TTS,speak
From: https://www.cnblogs.com/yjmyzz/p/17962404/ivr_sample_using_freeswitch_and_lua_script

相关文章

  • Unity3D 如何把全部游戏逻辑都放到lua层实现详解
    Unity3D是一款非常流行的游戏开发引擎,它支持C#、JavaScript和Boo等脚本语言。然而,有时候我们可能希望将全部游戏逻辑都放到Lua层实现,这样可以更方便地进行游戏逻辑的修改和调试。本文将详细介绍如何使用Unity3D将全部游戏逻辑都放到Lua层实现。对啦!这里有个游戏开发交流小组里面......
  • Lua网络爬虫实战:使用http服务器获取虾皮商品信息的全过程
    这段Lua代码是一个简单的爬虫示例,使用了Lua中的http模块进行网络请求,并设置了代理信息。以下是对代码的一些解释和注意事项:安装http模块:luarocksinstallhttp这个命令用于安装Lua的http模块,以便在程序中使用HTTP请求功能。代理设置:localproxy_host="www.duoip.cn......
  • 大模型工具_QUIVR
    https://github.com/StanGirard/quivr/24.5KStar1功能整体功能,想解决什么问题实现了前后端结合的RAG方案。构建能直接使用的应用。提出了“第二大脑”,具体实现也是RAG,但针对不同用户不同场景支持多个“大脑”并存,每个“大脑里”存储一个或多个文件,用户可使用指定的大脑提......
  • windows下编写lua脚本生成exe
    之前我有个想法,想在window下,远程执行服务器Linux下的某个脚本,我第一时间想到的是用jekenis,但感觉如果能对输入参数更灵活操作,会更好些,然后发现一个比较有意思的工具srlua ,它可以将lua编写的代码打包输出成exe文件。srlua目录内容如下:操作说明:glue.exesrlua.exetest.lu......
  • Redis进阶 使用Lua编写Redis脚本
    前面学习了Lua的基本语法,接下来是使用Lua编写脚本1.可以使用redis.call来调用redis命令使用redis.call会将redis命令返回的类型转换成对应的Lua数据类型。关系如下 与redis.call想类似的就是redis.pcall。【redis.call与redis.pcall的区别】当命令出错的时候,redis.pcall......
  • 【C语言数据结构】对Lua Table源码的一次劣质学习
    /*new_key*/KLcBoolKLcmCreateMapKeyValue(KLCMAP_PTRpTag,KLCTVALUE_PTRpKv){ KLcBoolkbRet =KL_FALSE; KLcBoolkbIsKvLegal =KL_FALSE; DWORDdwInsertPos =0; DWORDdwFreePos =0; DWORDdwCollisionPos =0; KLCTVALUE_PTRptMainNo......
  • lua读写文件
    读写文件的模式r-读取模式w-写入模式(覆盖现有内容)a-附加模式(附加在现有内容之后)b-二进制模式r+-读取更新模式(现有数据保留)w+-写入更新模式(现有数据擦除)a+-附加更新模式(现有数据保留,只在文件末尾附加)do --readdatafromfile functionre......
  • Unity3D 项目中怎样正确的使用 Lua详解
    在Unity3D游戏开发中,Lua作为一种轻量级的脚本语言,被广泛应用于游戏逻辑的编写和扩展。本文将详细介绍如何正确地在Unity3D项目中使用Lua,并给出相应的技术详解和代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬......
  • Redis进阶 Lua函数
    1.可以直接声明一个局部变量来接收函数,也可以直接简写localsquare=function(i)returni*iend简写:localfunctionsquare(i)returni*iend 2.当调用函数时,参数是一一对应的,如果多了参数,则会忽略,少则会将对应位置的参数赋值为nil 3.如果想要实现可变参数个数,也......
  • lua修复泛型函数
    泛型函数只能针对指定类型进行修复publicclassTest{publicvoidAdd(Tn1,Tn2){Debug.Log(“Add”);}}xlua.hotfix(CS.Test(CS.System.Int32),“Add”,function(self,a,b)print(a+b)end) Lua中调用CS的范型函数xlua.get_generic_method(className,methodName,index)获......