CCXML/VXML : 智能 IVR 世界
欢迎来到 CCXML/VXML 的精彩世界
引言
交互式语音应答 (IVR) 对我们大多数人来说一直充满魅力。听到一个友好的真人语音要求您按 1 进行此操作,按 2 进行另一操作,这总是让我们好奇这是如何实现的。幸运的是,作为一家大型银行,电话银行是我们客户必须使用的渠道。这引领我进入了 IVR 的精彩世界。本文仅提供对此媒体可实现内容的概览。
背景
本文的背景是我们 IT 部门收到的一系列简单需求。我们需要致电约 20,000 名客户并播放一段录制的消息。仅此而已。最初的解决方案是使用呼叫中心,雇佣两到三名客服代表,他们有一个客户列表,然后一个接一个地打电话,告知消息。但随后我们提出了使用 IVR 完成同一任务的想法。这个想法被接受、实现并成功执行。
由于互联网上没有太多集中的示例应用程序能简要解释这个想法,因此我写了这篇文章。
技术
Avaya Voice Portal 是这项电信魔术的核心技术。根据厂商自己的说法,“Avaya Voice Portal 是一个基于 Web 服务的自助服务平台,它将 Web 服务和 IP 电话的功能结合起来,创造更强大、更有利可图、更令人满意的语音和按键音解决方案。”我们在这里不讨论 Avaya 核心技术,因为它会使本文更加复杂,但我们将解释如何在 AVP 中配置我们的应用程序以实现所需的结果。
CCXML/VXML 是电信开发人员的秘诀。就像我们使用 C# 等编程语言构建各种应用程序一样,CCXML/VXML 是我们用于构建电信应用程序的电信语言。
CCXML 是“Call Control extensible Markup Language”(呼叫控制可扩展标记语言)的缩写。CCXML 是一种用于呼叫控制的高级行业标准,可以运行在任何电信平台上。它是一种基于 XML 的语言,用于控制呼叫的发起、设置、呼叫监控以及可以控制呼叫行为的事件。CCXML 允许技术行业利用 Web 和技术的优势,在电话网络上和电话网络外智能地控制呼叫。而 VXML 是“Voice eXtensible Markup Language”(语音可扩展标记语言)的缩写。VoiceXML 专为创建具有语音、音频、语音识别、DTMF 按键输入和呼叫录音的音频对话而设计。其主要目标是将基于 Web 的开发和内容交付的优势应用于交互式语音应答应用程序。
简单来说,如果我们想主动呼叫客户,我们将使用 CCXML;如果我们想与客户进行对话,比如播放一条消息,那么我们将使用 VXML。如果您对 CCXML/VXML 感兴趣,可以深入研究以下网址。
http://en.wikipedia.org/wiki/Call_Control_eXtensible_Markup_Language http://en.wikipedia.org/wiki/VoiceXML
示例呼叫应用程序
为了让您真正体验 IVR 应用程序是什么样的,我们为您构建了一个示例呼叫应用程序。
这就像任何普通的 Web 应用程序一样。它之所以是 Web 应用程序,是因为 AVP 要求我们将应用程序配置为基于 HTTP 的 Web 应用程序。示例应用程序有两个界面。前端提供一个界面供用户输入我们要呼叫的人的手机号码。第二个界面是为 Avaya 设计的,它会开始执行我们的页面(已在 AVP 中配置)。执行流程如下:
AVP 接口上的配置
Avaya 端上的应用程序配置非常简单。请参阅下图了解如何添加应用程序 URL。
关于 Avaya 配置,应遵循以下指南:
- 类型必须设置为 CCXML,因为示例应用程序会生成 CCXML 来控制呼叫流程。
- URL 选项应设置为 Single。
- CCXML URL:这是生成 CCXML 的应用程序 URL。
- 对于示例应用程序,我们不需要任何类型的身份验证。
- 不需要语音服务器。
- 由于应用程序将主动呼叫客户,因此选择了 Outbound(出站)选项。
有关这些选项的详细信息,请查阅供应商文档。
示例应用程序结构
示例应用程序分为两个界面。一个是用户输入手机号码的前端界面,第二个是 Avaya 的界面,它会回拨我们的应用程序以处理呼叫发起请求。
如上所示,解决方案资源管理器显示了示例应用程序中使用的完整项目文件。它包含以下部分:
AvayaService: Avaya 提供一个 Web 服务来调用其呼叫接口。您应该联系您的供应商,询问相同的 Web 服务。此 Web 服务至关重要,因为它会告知 AVP 回拨我们配置的 URL。
正常的 Web 服务调用看起来像这样:http://<IP>/axis/services/AppIntfWS
AVPWebServiceClient: AVPWebSericeClient 是一个包装类,它封装了 AvayaService 的调用机制,它包含调用 Avaya 服务所需的凭据详细信息,并向 Avaya 提供额外的参数,如手机号码和会话详细信息。
CcxmlHttpRequest: CcxmlHttpRequest 从 web.config 读取配置并启动 AVPWebServiceClient。
SampleCall.aspx: SampleCall.aspx 是前端界面,用户将在其中提供要呼叫的手机号码。
IVR: IVR 包含音频文件 welcome.wav,当呼叫连接到手机时,Avaya 会向手机用户播放该文件。它还包含 CallControl.aspx(此文件及其路径已在 AVP 门户中配置,如上图所示),这是最关键的文件。CallControl.aspx 负责发出 AVP 执行的 CCXML,并按照 CallControl.aspx 中的指示操作。
Web.Config: Web.config 包含访问 Avaya Web 服务的凭据详细信息和 IP。
AvayaToken |
这是我们在 Avaya Voice Portal 界面中创建的应用程序的名称。 |
UserID |
调用 Avaya Web 服务所需的用户名。 |
密码 |
调用 Avaya Web 服务所需的密码。 |
domain |
调用 Avaya Web 服务的域。 |
AvayaService.AppIntfWS |
Avaya Web 服务的 URL。 |
CallControl.aspx 内部
CallControl.aspx 的独特之处在于,当由 ASPX 引擎执行时,它不会返回 HTML,而是返回 CCXML。CCXML 的结构很简单,因为顾名思义,它就像任何普通的 XML。CCXML 以 CCXML 头开始,因为它是 AVP CCXML 解析引擎的入口点。
<ccxml version="1.0" xmlns=”http://www.w3.org/2002/09/ccxml”/>
CallControl.aspx 声明并初始化了用于处理的多个变量。由于 CCXML 是事件驱动的,我们使用事件来发起呼叫到手机用户。这是使用 createCall ccxml 命令完成的。
呼叫连接后,AVP 会启动与手机的对话。对话会播放 welcome.wav,该文件只是简单地说“你好”。这是通过 dialogstart ccxml 命令完成的。Dialogstart 需要 VXML 来处理对话指令,因此我们已将 welcome.aspx 作为参数提供给 DialogStart 命令。Wellcome.aspx 返回 VXML,就像 callcontrol.aspx 返回 CCXML 一样。
播放 welcome.wav 后,AVP 会触发 dialog.exit 事件。利用此事件,我们使用 disconnect 命令结束呼叫,并最终优雅地结束会话。
CCXML/VXML 的基本理解
就像任何其他编程语言一样,CCXML 也支持许多功能。请参阅下方了解简要描述。有关 CCXML/VXML 的详细概述,请参阅供应商文档。
命令 |
用法 |
描述 |
Var |
<var name="state" expr="'init'" />
|
用于变量声明和初始化。 |
Assign |
<assign name="TelNo" expr="03001111111" /> |
用于为变量分配值。 |
Log |
<log expr="'-- In init ccxml loaded event'"/> |
CCXML 支持丰富的日志记录。<log> 标签 |
eventprocessor |
<eventprocessor statevariable="state"/> |
EventProcess 命令告诉 AVP 初始化事件处理器并使其准备好进行进一步处理。每个 CCXML 都必须有一个 event process 标签。 |
transition |
<transition state="init" event="ccxml.loaded"></transition> |
AVP 会触发事件并将其委托给应用程序。由应用程序决定捕获哪些事件并相应地进行编程。 |
if |
<if cond="TelNo != '#'"></if> |
就像任何其他编程语言一样,CCXML 也提供条件语句。使用条件标签,开发人员可以根据其应用程序逻辑控制应用程序流程。 |
send |
<send target="session.id" targettype="'ccxml'" name="'user.SmsCall'"/> |
AVP 还促进使用 send 命令触发自定义用户事件。 |
Createcall |
<createcall dest="'tel:+' + PreDialedNumber + TelNo" connectionid="Connection_ID" timeout="60000" hints="hints"/> |
使用 createcall 命令拨打手机。AVP 会触发一系列系统事件,如 connection.ringing、connection.connected 事件,以传播连接状态到应用程序,并让应用程序决定控制逻辑。 |
dialogstart |
<dialogstart connectionid="Connection_ID" dialogid="holddialogid" src="'Welcome.aspx'" type="'application/voicexml+xml'"/> |
应用程序通常需要播放声音、DTMF 来控制应用程序流程。AVP 自然支持基于对话的通信。Dialogstart 命令用于发起对话。 |
disconnect |
<disconnect connectionid="Connection_ID" /> |
Disconnect 命令指示 AVP 优雅地断开与手机用户的当前呼叫会话。 |