XML - 管理数据交换/VoiceXML
上一章 | 下一章 |
← SVG | DocBook → |
学习目标
|
根据 W3C 的说法,“VoiceXML 旨在创建具有合成语音、数字化音频、语音和 DTMF 键输入识别、语音输入录制、电话功能以及混合主动对话功能的音频对话。其主要目标是将基于 Web 的开发和内容交付的优势引入交互式语音应答应用。”
以下列出了两个简短的 VoiceXML 示例。第一个始终是令人愉快的示例,“Hello World”
Hello world
<?xml version="1.0" encoding="UTF-8"?>
<vxml xmlns="http://www.w3.org/2001/vxml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/vxml" version="2.0">
<form>
<block>Hello World!</block>
</form>
</vxml>
顶级元素是 <vxml>,它主要是一个用于对话的容器。两种主要的对话类型是表单和菜单。表单提供信息并收集输入。菜单提供下一步操作的选择。此示例包含一个表单,其中包含一个将“Hello World!”合成并呈现给用户的块。由于该表单未指定“Hello World”之后的对话,因此对话结束。
我们的第二个示例询问用户要喝什么饮料,然后将其提交给服务器脚本
表单示例
<?xml version="1.0" encoding="UTF-8"?>
<vxml xmlns="http://www.w3.org/2001/vxml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2001/vxml
http://www.w3.org/TR/voicexml20/vxml.xsd"
version="2.0">
<form>
<field name="drink">
<prompt>Would you like coffee, tea, milk, or nothing?</prompt>
<grammar type="application/x-gsl" mode="voice">
<![CDATA[
[
[coffee] {<drink "Coffee">}
[tea] {<drink "Tea">}
[milk] {<drink "Milk">}
[nothing] {<drink "Nothing">}
]
]]>
</field>
<block>
<submit next="http://www.drink.example.com/drink2.asp"/>
</block>
</form>
</vxml>
字段是一个输入字段。在引用或执行表单中的下一个元素之前,用户必须为该字段提供一个值。以下是一个简单交互的示例
- C(计算机):您想喝咖啡、茶、牛奶还是什么都不喝?
- H(人类):橙汁。
- C:我不明白你说什么。(平台特定的默认消息。)
- C:您想喝咖啡、茶、牛奶还是什么都不喝?
- H:茶
- C: (继续在 drink2.asp 文档中)
菜单示例
<?xml version="1.0" encoding="UTF-8"?>
<vxml xmlns="http://www.w3.org/2001/vxml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2001/vxml
http://www.w3.org/TR/voicexml20/vxml.xsd"
version="2.0">
<menu>
<property name="inputmodes" value="dtmf"/>
<prompt>
For sports press 1, For weather press 2, For Stargazer astrophysics press 3.
</prompt>
<choice dtmf="1" next="http://www.sports.example.com/vxml/start.vxml"/>
<choice dtmf="2" next="http://www.weather.example.com/intro.vxml"/>
<choice dtmf="3" next="http://www.stargazer.example.com/astronews.vxml"/>
</form>
</vxml>
计算机或接收器识别该数字并发送消息以触发下一个对话,具体取决于选择的数字。以下是典型对话的样子
- C:要选择体育,请按 1;要选择天气,请按 2;要选择 Stargazer 天体物理学,请按 3。
- H:4
- C:我不明白您输入了什么值。(平台特定的默认消息。)
- C:要选择体育,请按 1;要选择天气,请按 2;要选择 Stargazer 天体物理学,请按 3。
- H:1“体育”。
- C: (继续到 http://www.sports.example.com/vxml/start.vxml)
VoiceXML 起源于 1995 年,是一种基于 XML 的对话设计语言。它主要用于简化 AT&T 项目中称为电话标记语言 (PML) 的语音识别应用。在创建这种语言之后,一些其他公司也开发了自己的类似 PML 的语言,例如朗讯、摩托罗拉 (VoxML)、IBM (SpeechML)、惠普 (TalkML) 和 PipeBeach (VoiceHTML)。自 1998 年以来,VoiceXML 论坛由 AT&T、IBM、朗讯和摩托罗拉联合开发,旨在定义一种标准的对话设计语言,开发者可以使用该语言来构建对话式应用。他们选择 XML 作为这项工作的基础,因为他们清楚地认识到这是技术的发展方向。到 2000 年,VoiceXML 论坛向公众发布了 VoiceXML 1.0,并将其提交给 W3C,以将该语言设为国际标准。此实现允许发布基于 W3C 成员公司、W3C 工作组以及各种开发者的输入的 VoiceXML 2.0。
VoiceXML 用于生成音频对话,允许使用合成语音、数字化音频、语音和 DTMF(双音多频按键音或按键拨号。)通俗地说,VoiceXML 允许使用计算机语音、录制音频、人类语音和电话作为输入和输出设备。按下电话键盘上的按钮会发出一种声音,该声音是由两个音调组成的,一个音调为高频,另一个音调为低频)键输入、语音输入录制、电话功能以及混合主动对话。
本文档假设的架构模型具有以下组件
文档服务器(例如 Web 服务器)通过 VoiceXML 解释器上下文处理来自客户端应用程序 VoiceXML 解释器的请求。服务器在回复中生成 VoiceXML 文档,这些文档由 VoiceXML 解释器处理。VoiceXML 解释器上下文可以与 VoiceXML 解释器并行监控用户输入。例如,一个 VoiceXML 解释器上下文可以始终监听将用户带到高级个人助手的特殊转义短语,而另一个上下文可以监听改变用户偏好的转义短语,例如音量或文本到语音的特性。
实现平台由 VoiceXML 解释器上下文和 VoiceXML 解释器控制。例如,在交互式语音应答应用中,VoiceXML 解释器上下文可能负责检测来电、获取初始 VoiceXML 文档并接听电话,而 VoiceXML 解释器在接听电话后进行对话。实现平台生成事件以响应用户操作(例如,接收到的语音或字符输入、断开连接)和系统事件(例如,计时器到期)。其中一些事件由 VoiceXML 解释器本身处理,如 VoiceXML 文档中所指定的那样,而另一些事件则由 VoiceXML 解释器上下文处理。
VoiceXML 的主要目标是将 Web 开发和内容交付的全部功能引入语音应答应用,并使此类应用的作者免受低级编程和资源管理的困扰。VoiceXML 建立了一个语音服务和数据服务之间的集成环境,利用了客户端-服务器模式。语音服务可以定义为用户和实现平台之间的一系列交互式对话。这些对话存储在文档服务器中,允许与实现平台独立的结构。这些服务器维护总体服务逻辑,执行数据库和遗留系统操作,并生成对话。VoiceXML 文档使用 VoiceXML 解释器与服务器中的对话进行交互。来自用户的输入会生成对文档服务器的请求,最后,文档服务器会回复另一个 VoiceXML 文档,以继续用户与其他对话的会话。
VoiceXML 是一种标记语言,它
- 最大限度地减少了客户端/服务器交互,为每个文档生成各种交互。
- 保护应用作者免受低级和平台特定的细节的影响。
- 将用户交互代码(在 VoiceXML 中)与服务逻辑(例如 CGI 脚本)分开。
- 允许跨平台开发,成为内容提供商、工具提供商和平台提供商的通用语言。
- 为简单交互提供易用性,同时提供语言特性来支持复杂的对话。
虽然 VoiceXML 努力满足大多数语音应答服务的必要条件,但具有严格要求的服务最好由使用更精细控制级别的专用应用来提供服务。
VoiceXML 是一种 XML 应用 [XML]。以下列出了 VoiceXML 所具备的一些功能或能力
- 该语言通过平台资源抽象来促进服务的可移植性。
- 该语言适应支持的音频文件格式、语音语法格式和 URI 方案方面的平台多样性。
- 该语言使创建常见类型的交互变得容易。
- 该语言具有明确定义的措辞和语法标准,使作者更轻松地表达与用户交互行为相关的意图。
- 该语言识别来自所有类型语法的语义解释,并将此信息提供给应用程序。
- 该语言具有控制流机制。
- 该语言使服务逻辑与交互行为分离。
- 它不适用于密集计算、数据库操作或遗留系统操作。假定这些操作由文档解释器之外的资源处理,例如文档服务器。
- 假定一般服务逻辑、状态管理、对话生成和对话排序驻留在文档解释器之外。
- 该语言提供了一种使用 URI 链接文档并将数据提交到服务器脚本的方法。
- VoiceXML 提供了一种识别要提交到服务器的精确数据以及提交中使用的 HTTP 方法(GET 或 POST)的方法。
- 该语言不要求文档作者显式分配和释放对话资源。
本节概述支持 VoiceXML 解释器的硬件/软件需求。
文档获取:解释器上下文应从 VoiceXML 解释器获取文档,这需要支持“http”URI 协议。在某些情况下,文档请求由 VoiceXML 文档的解释生成,但它也可以由语言范围之外的事件(如传入电话呼叫)响应生成。通过 http 发出文档请求时,解释器上下文使用“User-Agent”标头变量标识自己,其值为“<name>/<version>”,例如“acme-browser/1.2”。
音频输出:实现平台必须支持使用音频文件和文本到语音 (TTS) 的音频输出。该平台必须能够自由地对 TTS 和音频输出进行排序。如果音频输出资源不可用,则必须抛出 error.noresource 事件。这些文件由特定 URI 引用。
音频输入:实现平台需要找到检测和报告字符和/或语音输入的方法。它还需要使用计时器控制输入检测间隔持续时间,计时器的长度由 VoiceXML 文档指定。
- 平台必须支持 W3C 语音识别语法规范 SRGS 中描述的 DTMF 语法的 XML 形式。
- 它必须能够动态接收语音识别语法数据。
- 它可以支持其他格式,例如 JSpeech 语法格式或专有格式。
- 它必须能够记录从用户接收的音频。
- 该平台应该能够支持通过通信网络(如电话)进行第三方连接。
传输:该平台应该能够支持通过通信网络(如电话)进行第三方连接。
VoiceXML 文档是一个对话有限状态机,其中用户始终处于一个对话状态或对话中。每个对话都决定要过渡到的下一个对话。过渡可以使用 URI 定义,URI 定义要使用的下一个文档和对话。如果没有更多对话,或者存在明确退出对话的元素,则执行将终止。VoiceXML 文档主要由称为对话的顶级元素组成。
对话有两种类型:表单和菜单。文档也可以包含
- <meta> 元素。
- <metadata> 元素。
- 变量元素。
- <script> 元素。
- <property> 元素。
- <catch> 元素。
- <link> 元素。
表单定义一个交互,该交互从一组字段项变量中收集值。每个字段都可以指定一个语法,该语法定义该字段允许的输入。
菜单向用户显示包含选项选择的信息,然后根据所选选项过渡到另一个对话。每个对话都涉及一系列语音和/或 DTMF 语法,这些语法仅在用户处于该对话时处于活动状态。
子对话类似于函数调用,因为它提供了一种创建和调用新交互并返回原始对话的方法。变量实例、语法和状态信息将被保存,并在返回调用文档时可用。子对话可用于创建可能需要数据库查询的确认序列,创建可在单个应用程序中的文档之间共享的一组组件,或者可能创建可在许多应用程序之间共享的可重用对话库。
会话在用户开始与 VoiceXML 解释器上下文交互时开始,在加载和处理文档时继续,并在用户、文档或解释器上下文请求时结束。
应用程序是一组共享相同应用程序根文档的文档。每当用户与应用程序中的文档交互时,它的应用程序根文档也会加载。应用程序根文档在用户在同一应用程序中的其他文档之间过渡时保持加载状态,并在用户过渡到不在应用程序中的文档时卸载。
语法:每个对话都与其关联一个或多个语音和/或 DTMF 语法。在机器导向的应用程序中,每个对话的语法仅在用户处于该对话时处于活动状态。在混合主动应用程序中,用户和机器交替决定下一步做什么,其中一些对话被标记为使它们的语法处于活动状态(即,监听),即使用户处于同一文档中的另一个对话中,或处于同一应用程序中的另一个已加载文档中。在这种情况下,如果用户说出与另一个对话的活动语法匹配的内容,执行将过渡到该另一个对话,用户的语句将被视为在该对话中说出。混合主动性为语音应用程序增加了灵活性和功能。
事件:VoiceXML 允许用户以用户输入的传统方式填写表单,并定义了处理表单机制未涵盖的事件的机制。当用户没有响应、没有正确响应或请求帮助时,可以抛出事件。类似地,如果 VoiceXML 解释器在 VoiceXML 文档中发现语义错误,它也可以抛出事件,使用 catch 元素允许解释器触发此类事件。
链接指定每当用户与它交互时处于活动状态的语法。如果用户输入与链接的语法匹配,则控制权将转移到链接的目标 URI。链接可用于抛出事件或转到目标 URI。
For more information about the elements go to W3C page.
http://www.w3.org/TR/2004/REC-voicexml20-20040316/
元素 | 目的 |
<assign> | 为变量分配值 |
<audio> | 在提示中播放音频剪辑 |
<block> | (非交互式)可执行代码的容器 |
<catch> | 捕获事件 |
<choice> | 定义菜单项 |
<clear> | 清除一个或多个表单项变量 |
<disconnect> | 断开会话 |
<else> | 用于 <if> 元素 |
<elseif> | 用于 <if> 元素 |
<enumerate> | 枚举菜单中选择的简写 |
<error> | 捕获错误事件 |
<exit> | 退出会话 |
<field> | 在表单中声明输入字段 |
<filled> | 字段填充时执行的操作 |
<form> | 用于显示信息和收集数据的对话 |
<goto> | 转到同一文档或不同文档中的另一个对话 |
<grammar> | 指定语音识别或 DTMF 语法 |
<help> | 捕获帮助事件 |
<if> | 简单的条件逻辑 |
<initial> | 声明进入(混合主动)表单时的初始逻辑 |
<link> | 指定链接范围内的所有对话共有的过渡 |
<log> | 生成调试消息 |
<menu> | 用于在替代目的地之间进行选择的对话 |
<meta> | 将元数据项定义为名称/值对 |
<metadata> | 使用元数据模式定义元数据信息 |
<noinput> | 捕获 noinput 事件 |
<nomatch> | 捕获 nomatch 事件 |
<object> | 与自定义扩展交互 |
<option> | 在 <field> 中指定选项 |
<param> | <object> 或 <subdialog> 中的参数 |
<prompt> | 将语音合成和音频输出排队到用户 |
<property> | 控制实现平台设置。 |
<record> | 录制音频样本 |
<reprompt> | 在事件后重新访问字段时播放字段提示 |
<return> | 从子对话返回。 |
<script> | 指定 ECMAScript 客户端脚本逻辑块 |
<subdialog> | 将另一个对话作为当前对话的子对话调用 |
<submit> | 将值提交到文档服务器 |
<throw> |
抛出事件。 |
<transfer> |
将呼叫者转移到另一个目的地 |
<value> | 在提示中插入表达式的值 |
<variable> | 声明变量 |
<vxml> | 每个 VoiceXML 文档中的顶级元素 |
文档执行默认从第一个对话框开始。每个对话框执行后,将确定下一个对话框。当一个对话框不引用另一个对话框时,文档执行停止。
以下是“Hello World!”示例的扩展,用于说明 VoiceXML 的执行。它现在有一个名为“hi”的文档级变量,用于保存问候语。它的值在第一个表单中用作提示。第一个表单播放问候语后,它将转到名为“say_goodbye”的表单,该表单提示用户“再见!”。因为第二个表单没有到另一个对话框的转换,所以文档执行停止。
<?xml version="1.0" encoding="UTF-8"?>
<vxml xmlns="http://www.w3.org/2001/vxml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2001/vxml
http://www.w3.org/TR/voicexml20/vxml.xsd"
version="2.0">
<meta name="author" content="John Doe"/>
<meta name="maintainer" content="[email protected]"/>
<var name="hi" expr="'Hello World!'"/>
<form>
<block>
<value expr="hi"/>
<goto next="#say_goodbye"/>
</block>
</form>
<form id="say_goodbye">
<block>
Goodbye!
</block>
</form>
</vxml>
VoiceXML 变量在所有方面都等效于 ECMAScript 变量:它们是同一个变量空间的一部分。VoiceXML 变量可以在 <script> 中使用,就像在 <script> 中定义的变量可以在 VoiceXML 中使用一样。使用 var 声明变量等效于在 <script> 元素中使用 var 语句。<script> 也可以出现在 var 可以出现的任何地方。VoiceXML 变量也由表单项声明。
变量命名约定与 ECMAScript 中一样,但以下划线字符(“_”)开头的名称和以美元符号(“$”)结尾的名称保留用于内部使用。VoiceXML 变量(包括表单项变量)不能包含 ECMAScript 保留字。它们还必须遵循 ECMAScript 的引用正确性规则。例如,变量名必须唯一,并且它们的声明不能包含点 - “var x.y”是 ECMAScript 中的非法声明。违反命名约定或 ECMAScript 规则的变量名会导致抛出“error.semantic”事件。
使用 var 元素表示变量
<var name="room_number"/>
<var name="avg_mult" expr="2.2"/>
<var name="state" expr="'Georgia'"/>
<?xml version="1.0" encoding="UTF-8"?> <vxml xmlns="http://www.w3.org/2001/vxml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/vxml http://www.w3.org/TR/voicexml20/vxml.xsd"
|
<vxml> 的属性包括
version | 此文档的 VoiceXML 版本(必需)。当前版本号为 2.0。 |
base | 定义一个基本 URI,用于在文档中解析相对 URI。 |
xmlns | VoiceXML 的指定命名空间(必需)。VoiceXML 的命名空间定义为 http://www.w3.org/2001/vxml。 |
xml:base | 此文档的基本 URI,如 xml-base 中定义。它是一个 URI,文档中的所有相对引用都以此为基础。 |
xml:lang | 此文档的语言标识符。如果省略,则该值为特定于平台的默认值。 |
Xmlns:xsi | 与 xsi:schemalocation 一起使用,以指示 VoiceXML 命名空间的模式位置。 |
xsi:schemalocation | 与 xmlns:xsi 一起使用,以指示 VoiceXML 命名空间的模式位置。 |
application | 此文档的应用程序根文档的 URI(如果有)。 |
字段指定要从用户收集的输入项。此元素的一些属性是
name | 对话框范围内将保存结果的表单项变量。该名称在表单中的表单项中必须唯一。 |
expr | 表单项变量的初始值;默认为 ECMAScript 未定义。 |
cond | 一个表达式,在转换为布尔值后必须计算为真,以便访问表单项。如果未指定属性,也可以访问表单项。 |
Type | 字段的类型,即内置语法类型的名称 |
<grammar> 元素用于提供语音语法,该语法
- 指定用户可能用来执行操作或提供信息的表达式
- 返回相应的语义解释,例如简单值(字符串)、属性-值对(日期、月份和年份)或嵌套对象。
<grammar> 元素的一些属性是
version | version |
xml:lang | 语法的版本标识符。 |
lang | 该特定语法的语言标识符(“fr-CA” 代表加拿大法语)。 |
mode | 定义语法的模式,遵循 W3C 语音识别语法规范 SRGS 的模式。 |
root | 定义语法的根规则。 |
xml:base | tag-format |
定义语法中所有标签的标签内容格式。
base声明解析语法中相对 URI 的基本 URI。此基本声明优先于 <vxml> 基本 URI 声明。
<block>
Welcome to Flamingo, your source for lawn ornaments.
</block>
<block> 元素
name | [编辑 | 编辑源代码] |
expr | 表单项变量的初始值;默认为 ECMAScript 未定义。 |
cond | 此元素是一个表单项。如果块的表单项变量未定义且块的 cond 属性(如果有)计算为真,则它包含要执行的可执行内容。 |
表单项变量在进入块之前会自动设置为真。因此,通常在调用表单时执行块。有时您可能需要对块进行更多控制。要做到这一点,您可以命名表单项变量,并设置或清除它以控制 <block> 的执行。此变量在表单的对话框范围内声明。<block> 的属性包括
name用于跟踪此块是否符合执行条件的表单项变量的名称;默认为不可访问的内部变量。
<prompt>Please say your name.</prompt>
cond
- 一个表达式,在转换为布尔值后必须计算为真,以便访问表单项。
- <prompt> 元素
Please say your name. <audio src="sayname.wav"/> |
此元素控制合成语音和预录音频的输出。提示排队等待播放,解释将在用户提供输入后开始。以下是一个提示的示例
<prompt>Please <emphasis>say</emphasis> your city.</prompt>
如果您不需要指定提示属性(如 bargein),则可以省略 <prompt> ... </prompt>,并且
提示完全由 PCDATA 组成(不包含语音标记),或者仅由 <audio> 或 <value> 元素组成。 | 例如,以下也是提示 |
但是,当添加嵌入式语音标记(例如)时,您有时必须使用 <prompt> 标签 | <prompt> 元素具有以下属性 Cond |
xml:lang | 表达式,在转换为布尔值后必须计算为真,以便播放提示。默认值为 true。 |
xml:base | Count |
练习
数字,允许您在用户重复执行操作时发出不同的提示。如果省略,则默认为“1”。Timeout
将用于以下用户输入的超时。默认的 noinput 超时特定于平台。