FreeSWITCH-IVR

IVR

HBSpy: 这里我们综合了IVR, mod_dptools: IVR Menu

About

互动式语音应答(IVR)是一种自动化的电话系统,可以与来话交互以收集信息或按策略路由。

Language

FreeSWITCH IVRs可以用FreeSWITCH支持的任何语言编写,包括JavaScript, Python, Perl, Lua和XML macro格式

Sample IVRs

demo-ivr.xml

源码中自带了一个用XML实现的示例IVR。IVR菜单加载自conf/autoload_configs/ivr.conf.xml

Dialplan调用IVR菜单的入口如下

1
2
3
4
5
<extension name="ivr_demo">
    <condition field="destination_number" expression="5000">
      <action application="ivr" data="demo_ivr"/>
    </condition>
  </extension>

IVR Macro文件位于conf/lang/en/demo/demo-ivr.xml

mod_dptools: IVR Menu

IVR Menu功能可以使你简单的用XML描述IVR菜单o

菜单定义在配置文件autoload_configs/ivr.conf.xml中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<configuration name="ivr.conf" description="IVR menus">
<menus>
<!-- demo IVR setup -->
<!-- demo IVR, Main Menu -->
<menu name="demo_ivr"
greet-long="phrase:demo_ivr_main_menu"
greet-short="phrase:demo_ivr_main_menu_short"
invalid-sound="ivr/ivr-that_was_an_invalid_entry.wav"
exit-sound="voicemail/vm-goodbye.wav"
timeout ="10000"
inter-digit-timeout="2000"
max-failures="3"
digit-len="4">
<entry action="menu-exec-app" digits="1" param="bridge sofia/$${domain}/888@conference.freeswitch.org"/>
<entry action="menu-exec-app" digits="2" param="transfer 9996 XML default"/> <!-- FS echo -->
<entry action="menu-exec-app" digits="3" param="transfer 9999 XML default"/> <!-- MOH -->
<entry action="menu-sub" digits="4" param="demo_ivr_submenu"/> <!-- demo sub menu -->
<entry action="menu-exec-app" digits="5" param="transfer 1234*256 enum"/> <!-- Screaming monkeys -->
<entry action="menu-exec-app" digits="/^(10[01][0-9])$/" param="transfer $1 XML default"/> <!-- dial ext & x-fer -->
<entry action="menu-top" digits="9"/> <!-- Repeat this menu -->
</menu>
<!-- Demo IVR, Sub Menu -->
<menu name="demo_ivr_submenu"
greet-long="phrase:demo_ivr_sub_menu"
greet-short="phrase:demo_ivr_sub_menu_short"
invalid-sound="ivr/ivr-that_was_an_invalid_entry.wav"
exit-sound="voicemail/vm-goodbye.wav"
timeout="15000"
max-failures="3">
<entry action="menu-top" digits="*"/>
</menu>
</menus>
</configuration>

IVR Menu支持使用phrase macro。在phrase后写phrase macro的macro名字即可。务必保证tts-engine, tts-voice和phrase-lang被正确设置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<menu name="main"
greet-long="phrase:mainmenu_phrase_macro"
greet-short="phrase:short_mainmenu_phrase_macro"
invalid-sound="phrase:invalid_entry_macro"
exit-sound="phrase:goodbye_macro"
timeout ="10000"
max-failures="3"
tts-engine="cepstral"
tts-voice="david"
phrase_lang="en">
<entry action="menu-exit" digits="*"/>
<entry action="menu-sub" digits="2" param="menu2"/>
<entry action="menu-say-phrase" digits="4" param="enteraccount"/>
<entry action="menu-back" digits="5"/>
<entry action="menu-exec-app" digits="7" param="transfer 888 XML default"/>
<entry action="menu-sub" digits="8" param="menu8"/>
</menu>

有时需要在来话进入IVR应用之前添加如下内容,以保证之不在early media阶段被接听

1
<action application="answer"/>

Options

菜单选项

  • name - IVR菜单名称
  • greet-long - 当菜单首次播放时的内容,可以是个文件或者"say:文本"或者"phrase:phrase_marco名"
  • greet-short - 当菜单循环时播放的短一些的内容,可以是文件,say,phrase
  • invalid-sound - 无菜单入口或入口非法时播放的内容,
  • exit-sound - 菜单退出时播放的内容,可以是文件,say,phrase
  • inter-digit-timeout - 等待用户进行选择的毫秒数
  • timeout - 在confirm-macro播放后等待用户按确认键的毫秒数
  • confirm-macro -
  • confirm-key - 按个键告诉IVR digit-entry输完了。默认为#
  • confirm-attempts -
  • max-failures - 在IVR结束之前的最大digit-entry失败次数
  • max-timeouts - 在IVR结束之前的最大超时次数
  • exec-on-max-failures - max-failures时执行的FreeSWITCH dialplan应用
  • exec-on-max-timeouts - max-timeouts时执行的FreeSWITCH dialplan应用
  • tts-engine - TTS引擎名
  • tts-voice - TTS播音员名
  • digit-len - 在匹配菜单入口前等待的最长位数

每个菜单支持通过按键绑定一系列动作

  • menu-exit - 退出IVR菜单
  • menu-sub - 进入IVR子菜单
  • menu-exec-app - 执行一个FreeSWITCH dialplan应用
  • menu-play-sound - 播放声音文件或speak
1
2
<entry action="menu-play-sound" digits="3" param="say: You pressed 3"/>
<entry action="menu-play-sound" digits="6" param="voicemail/vm-goodbye.wav"/>
  • menu-back - 回到上一级菜单
  • menu-top - 回到顶级菜单
  • menu-exec-api目前一直没实现