IVR (互动式语音应答)在企业通信应用中是非常有用的特性,例如,自动话务员业务就是非常典型的IVR业务。在V6.1以前的版本中,我们采用Python脚本来实现强大的IVR业务,但是缺点在于Python脚本对于普通小企业客户而言是比较复杂的。所以在V6.1版本中,我们引入了IVR-XML来支持IVR业务。这也就意味着我们可以编写XML文件来实现简单的IVR业务流程,而大部分客户是非常熟悉XML文件及其语法。
miniSIPServer IVR-XML不是VoiceXML, CCXML,也不是CallXML。我们认为所有这些关于IVR的XML规范对于小企业客户而言还是过于复杂,并且部分概念也不太容易让人理解。IVR-XML则简单得多并且非常容易使用。在本文中,我们将结合一个简单的IVR流程来说明IVR-XML的各部分细节。
下图描述了我们的示例IVR过程,这是个自动话务员业务流程:
这个IVR流程非常简单,包含两级语音菜单。所有的操作最后都是将呼叫路由给某个分机。
请点击这里下载或者显示上述IVR流程的IVR-XML文件。我们将基于这个文件来说明IVR-XML。
IVR-XML文件必须采用utf-8编码,并且所有元素的关键词,例如属性名称等,都必须是小写字符串。
每个IVR-XML文件必须包含一个而且只能有一个<mssxml>元素。
<mssxml>包含多个动作(<action>子元素)。整个IVR流程将根据<action>的指示一步一步进行。
<mssxml> <action> ... ... </action> ... ... <action> ... ... </action> </mssxml>
<mssxml>是IVR流程的根元素,它有以下属性:
version | M | 指示当前IVR-XML文件的版本号。目前阶段,该属性值总是'1'。 |
在本文中,'M'是指必须具备的,而'O'指可选的。
每个<action>元素都指示 miniSIPServer 该做什么,<action>的顺序就描绘了IVR的工作流程。该元素有以下属性:
name | M | 当前操作(action)的名称。在整个IVR-XML文件中,每个操作的名称都必须是唯一的、不能重复。 |
method | M | 要求 miniSIPServer 进行的具体操作, miniSIPServer 将根据不同的操作方法对工作流进行不同的处理。 |
'method'属性有以下取值:
callto | miniSIPServer 向目的号码发起呼叫。 |
geturl | miniSIPServer 发起HTTP请求。该动作可用于IVR与web服务器以及应用服务器进行交互。 |
geturlresult | 'geturl'动作的结果处理。 miniSIPServer 从web服务器中得到响应,并根据响应信息进行不同的处理。 |
input | miniSIPServer 需要处理用户输入的数字。 |
playandwaitinput | miniSIPServer 应当给主叫播放语音并且等待用户输入数字。 |
playannouncement | miniSIPServer 向主叫用户播放语音,例如,播放音乐。 |
releasecall | miniSIPServer 释放当前呼叫。 |
<action>元素根据不同的'method'属性有不同的子元素。实际上,我们根据'method'属性区分不同的动作。例如,当我们提到‘playandwaitinput’动作,意思就是指method属性为‘playandwaitinput’的动作(action).
miniSIPServer 完成callto操作,向目的号码发起呼叫。如果没有监视指定的呼叫事件,整个IVR-XML过程就结束了。
每个'callto'动作只能包含一个<destination>。
destination | M | 可以是电话号码、用户输入的数字或者从HTTP应用程序中返回的结果。 miniSIPServer 将向该目的号码发起呼叫。 |
monitor-events | O | 如果设置了该子元素,IVR流程在本动作产生的呼叫中,将监视指定的呼叫事件,并以此改变IVR的流程。 |
示例:
该动作可用于向用户的应用程序提供信息或者数据。
url | M |
HTTP URL地址,例如"http://www.myvoipapp.com/cgi-bin/demo.php"。 miniSIPServer 将使用该地址发起HTTP请求。 每个'geturl'动作只能包含一个'url'地址。 |
parameter | O | 定义在HTTP请求中的参数。我们可以使用该元素携带动态参数。每个'geturl'中最多只能包含5个参数。 |
示例:
在上述示例中,最终的HTTP请求将是'http://www.myvoipapp.com/cgi-bin/demo.php?card=xxx&password=xxx',其中'xxx'取决于具体的输入值。
每个'geturlresult'动作最多只能包含3个'result'子元素。
result | O | 如果HTTP服务器返回该'result', miniSIPServer 将跳转到指定的动作继续执行。如果没有定义任何'result', miniSIPServer 将保存用户的输入并直接继续下一个动作。 |
示例:
'input'动作是'playandwaitinput'动作的反馈结果,用于处理用户输入的数字或者号码。该动作可以包含不超过10个<digit>子元素。
digit | O | 如果用户输入该数字或者号码, miniSIPServer 将跳转到指定的动作执行IVR过程。 如果没有任何'digit'元素,当前动作将保存用户输入结果并直接继续下一个动作。 |
error-first-digit-timeout | O | 如果用户没有输入任何数字,则我们可以通过该子元素处理这种异常情况。 |
error-improper-caller-response | O | 用户输入了一些数字,但是没有达到IVR要求的最小号码长度,则我们可以通过该子元素处理这种异常情况。 |
示例 1: 没有'digit'元素
示例 2:携带'digit'元素指定下一个动作
示例 3: 异常情况处理
该动作用于向用户放音,并等待用户的输入。当用户输入号码时,播放的语音将被打断。
该动作包含以下元素:
playaudio | M | 这是个子元素,用于向主叫用户播放语音提示。 请点击 这里了解该元素的更多细节信息。 |
minnumofdigits | O | ‘最少号码(Mininum number of digits)‘指示 miniSIPServer 至少应当等待用户输入多少位号码。 如果没有该元素,则缺省值为1,要求 miniSIPServer 至少等待用户输入一位号码。 |
maxnumofdigits | O | '最多号码(maximum number of digits)'指示 miniSIPServer 最多应当等待用户输入多少位号码。 如果没有该元素,则缺省值为32,即 miniSIPServer 最多只需要等待用户输入三十二位号码。 |
firstdigittimeout | O | ‘首位超时(first digit time-out)’是定时器值, miniSIPServer 等待用户输入第一个号码的时间。如果首位定时器超时, miniSIPServer 将认为这是用户没有输入任何信息的错误。 如果没有该元素,则缺省值为30秒。 |
intervaldigittimeout | O | ‘位间超时(interval digit time-out)’也是定时器值, miniSIPServer 等待用户输入后续号码的时间。如果该定时器超时, miniSIPServer 将认为用户结束输入号码。 如果没有该元素,则缺省值为15秒。 |
enddigit | O | '结束数字(End digit)'用于指示用户结束了输入,即只要用户输入该数字(字符),即可判定为用户结束输入。 如果没有该元素,则缺省值为'#'。 |
canceldigit | O | '取消数字(Cancel digit)'用于指示用户取消了当前输入, miniSIPServer 需要重新播放语音并再次等待用户输入。 如果没有该元素,则缺省值为'*'。 |
示例:
该动作用于向主叫用户播放音乐。这个动作非常类似前面的'playandwaitinput'动作,区别在于当前操作不要求用户输入信息,并且语音不能被打断。
playaudio | M | 向主叫用户播放语音提示。 |
cause | O | 该元素指示释放当前呼叫时需要采用的原因值,采用ITU Q.850定义的标准原因值。 miniSIPServer 将在SIP消息中携带该原因值。如果没有定义该元素,则缺省值总是"normal clear",在Q.850中定义为0x10。 |
示例:
<destination>可以有两种类型的值:
示例 1:
示例 2:
如果值是号码, miniSIPServer 将直接使用该号码。如果值是<input>,那就意味着 miniSIPServer 将采用用户的输入值或者HTTP请求的返回值。
<digit>具有以下属性:
value | O | 用户输入的数字。如果没有该属性,miniSIPServer 将不关心用户的输入值,直接跳转到'nextaction'继续 IVR 过程。 |
nextaction | M | 下一个动作的名称。 |
示例:
<error-first-digit-timeout>用于指示首位超时的异常情况,包含以下属性:
nextaction | M | 下一个动作的名称。如果 IVR 要求用户输入数字,而用户没有输入任何数字, 则 IVR 过程跳转到该动作。 |
示例 :
<error-improper-caller-response>指示用户不正确的响应,包含以下属性:
nextaction | M | 下一个动作的名称。如果 IVR 要求用户输入数字,并有最小号长的要求,而用户虽然输入了部分数字,但是没有达到 IVR 的最小号长要求,则 IVR 跳转到该动作进行处理。 例如,IVR 要求最小号长是三位数字,而用户只输入了两位数字,则系统会上报该异常给IVR继续后续处理。 |
示例 :
<input>元素通常用于传递用户的输入信息或者HTTP请求的响应信息,它包含以下属性:
from | O | 该属性指明'input'动作或者'geturlresult'动作的名称。 miniSIPServer 将根据该名称,从这些动作中获取结果作为当前动作的输入信息。 如果没有这个属性, miniSIPServer 将总是采用最新的用户输入信息作为返回结果。 |
示例:
<monitor-events> 在'callto'动作产生的呼叫中,监视指定的呼叫事件,并在事件触发时,执行IVR的下一个动作,更改整个IVR的流程。
monitor-event | M | 特定的呼叫事件。本元素必须包含一个或者多个'monitor-event'子元素。 |
<monitor-event> 用于指定呼叫过程中需要监视的特定事件。
detection | M | 当前呼叫过程中需要检测的事件,目前可以设置为以下参数值:
|
nextaction | M | 事件发生后,IVR 流程需要执行的下一个动作的名称。 |
示例:
<playaudio>指示 miniSIPServer 如何播放语音,它包含以下子元素:
id | M | 语音文件ID。 在 miniSIPServer 中,每个语音文件都有一个ID。实际上,语音ID也是语音文件的文件名,我们可以非常容易地定制自己的语音。请点击这里了解更多 miniSIPServer 语音文件的细节。 在我们的演示流程中,我们定制了两个语音文件'0a080002'和'0a080003'。 |
duration | O | 指示该语音文件应当播放多长时间。 如果没有该元素,则缺省值为0,即循环播放。 |
repeat | O | 语音文件的播放次数。 如果没有该元素,则缺省值为1,即只播放一次语音文件。 |
示例1:
name | M | 当前参数的名称。 |
value | M | 当前参数的值。 |
示例:
<result>有以下属性:
value | O | 从HTTP响应消息中返回的字符串。如果没有该属性,意味着无论HTTP响应的值是什么, miniSIPServer 将直接跳转到'nextaction'指定的动作继续IVR过程。 该结果的字符串应少于60个字符。 |
nextaction | M | 根据result值, miniSIPServer 下一步应当处理的动作的名称。 |
<value>有以下几种取值: