### XML 在语音中的应用(三)

在这一部分中主要是 VoiceXML 的介绍。这里没有完全列出所有 VoiceXML 语法。详尽的说明请见 W3C 上的说明。这里只是给您一个对关键环节的了解。我相信并不是每一个网络大侠都详细学习过 HTML 的语法,更多的是在参照已有页面的基础上渐进掌握的。
VoiceXML 基础
VoiceXML 是一种编程语言。但它又不是一般的编程语言,它必须考虑到特殊的语音应用环境。下面是它的部分实现功能:
识别输入语音
识别电话按键输入
输出音频
语音合成
基本电话连接功能
上面列举出来的功能并不是由 VoiceXML 独自完成的。VoiceXML 做到的是提供一种应用其他组件的机制。而具体的操作是由语音浏览器实现的。 值得一提的是 VoiceXML 实现了基本编程语言的所有基本特性,比如是程序流程控制,代码重用等等。
另外 VoiceXML 和 HTML 有非常多的相似之处。在 HTML 中,文件是由首尾呼应的标识来组成的；VoiceXML 中也是由标识来组成的。在 HTML 中代码是用“页”来分别的；在 VoiceXML 中是用“文档”来分别的。在 HTML 中有链接的标识来跳转；在 VoiceXML 中同样可以跳转至其它文档。
每一个 VoiceXML 文档都是完整的 XML 文档。所以,构成 VoiceXML 文档下面的标识是必不可少的:
<?xml version = “1.0” ?>
<vxml version = “1.0” >
…………
</vxml>
正如前面说到的 VoiceXML 是用文档来分别的。一个 VoiceXML 的应用是一系列 VoiceXML 文档的集合。而且每一个应用都包含一个“根文档”。这有点像一个动态网站的 default.asp 或是 index.asp。在 VoiceXML 应用调用的时候,“根文档”始终被调用。
在每一个文档中,都有很多的“对话”(Dialog)。在每一个特定的时刻,人机交互都处在一个特定的对话状态当中。每一个对话都可以明确的指明下一个目的对话。整个文档就是有这些对话状态组成的“有限状态机”。对话的跳转是由 URI 指定的。每一个文档和对话都可以被确切指定。如果没有指定具体的文档,当前文档就是默认文档。如果具体的对话没有被指定,那么目的文档的第一个对话就是默认对话。
对话分为两种,一种是 Form,另一种事 Menu。Form 是专门用来从客户端收集信息并赋值给特定变量的。在 Form 当中,有很多的域(Field)。Field 就相当于我们常用的变量。Form 通过收集用户输入(语音或是按键),把识别出的值赋给变量。Menu 的形式是为用户提供多个选项,根据不同的选择,应用进程将跳转至不同的对话。
关于 Form 和 Menu 的详细内容我们在下面的小节详细的介绍。

VoiceXML 中的 Form
正如 Form 的意义一样,它是一张表格。就好像在申请贷款时候要填具详细信息一样,在语音应用中,需要和用户来交互。用户通过电话输入表格中的每一项。
让我们通过一个具体的例子来看一看:
<?xml version="1.0"? encoding="gb2312" ?>
<vxml version="1.0">
<form id="选片">
<field name="movie">
<prompt>你想欣赏哪一部电影？</prompt>
<grammar>大话西游|国产零零七|鹿鼎记</grammar>
<filled>
<if cond=" movie =='国产零零七'">
<prompt>国产零零七今天只有晚上十点一场放映。</prompt>
</if>
</filled>
</field>
</form>
</vxml>
在上面的例子当中,有一个 Form 标识,其中只有一个变量(域)需要填充。首先,系统会问用户“你想欣赏哪一部电影？”,这时用户可以回答 grammar 标识中限定的《大话西游》、《国产零零七》和《鹿鼎记》。输入之被赋给名字为 movie 的域。Filled 标识用来完成当域被填充之后的操作。在这里,操作是读出“国产零零七今天只有晚上十点一场放映。”这样一句话。
VoiceXML 中的 Prompt
Prompt 标识比较简单,它指示系统为用户读出标识内包含的语句。我们其实在前面的例子中也已经看到了。比较完备的浏览器都是通过通用的语音合成实现发音。
VoiceXML 中的 Grammar
Grammar 标识简单的说就是给用户输入限定的范围。用户只能在 grammar 列举的范围内发音。当用户输入被识别出来不在 grammar 范围之内时,语音浏览器就产生一个出错信息。可以在 VoiceXML 文档中设定出错处理。
Grammar 又可以分为三类:inline、external 和 built-in。
Inline grammar 是通过显式的方式在给定的域内写明 grammar。在前面的例子中就是 inline grammar。 External grammar 是通过外部应用的方法来指定 grammar。这时候就需要用标识 grammar 来说明了:
<grammar src="URI" type="mime-type"/>
这里的 mime-type 可以缺省。因为它可以通过 URI 的协议来获取,还可以通过外部 grammar 文件的后缀来获得。即使上面的方法都不能得到,还可以从系统运行平台来指定。还有人会问,要用什么来书写外部 grammar 呢？比较通用的是 Javaä Speech API Grammar Format (JSGF)。
built-in grammar 是浏览器平台自己设定的 grammar。它是具有个性化的东西。不同的厂家可能会有不同的 built-in grammar。为的是方便在浏览器上的应用开发。