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

在这一部分中让我们来看一看语音方面现有的 XML 标准化进程。

W3C 在语音浏览上所作的工作

作为一个权威的标准化组织,W3C 和早就看上了语音浏览(Voice Browser)。W3C 于 1998 年的 10 月份成立了一个名为“语音浏览器”的工作站。大家在这里可以联想一下,XML 是最早于 1996 年底被提上议案的。工作站的目标非常明确,制定语音浏览方面的标准,迎接即将来临的语音浏览热潮。工作站的工作主要基于以下一些方面,我们还要在后面对其中的部分工作放大研究。

语音标识语言对于对话的需求说明

简单的说,为了语音浏览器能够方便的结合不同的输入输出形式,和谐的同用户交互“对话”,需要对用来表示对话数据的标识语言进行限制。可以想象,用于表现平面网页的 HTML 就不能胜任语音浏览器。不但是因为它繁杂混乱,而且它的二维性质也使得它不能表示交互式的对话。

标识语言当中对可重复使用对话的要求说明

好比高级程序语言编程一样,有一些小的模块会是被经常重复使用的。这些小的模块被设计成为函数或是过程,每当要用的时候就调用一次。在语音浏览器使用的标识语言当中需要有这样的类似机制,用来表示那些经常会被重复使用的部分。这一点可以在后面的文章中具体的体会到。经常会被重复使用的部分包括简单的确认、收集电话号码、日期、金额、信用卡信息和地址的信息等。

标识语言当中语音识别语法层表示的需求说明

前面我们已经提到过语音浏览器的实现和语音技术的应用密不可分。为了实现语音数据的识别输入,语音浏览器会用到现成的语音识别平台。不同的语音识别方法有着不同的平台要求。如果只是独立人的小词汇量识别,我们还可能不需花费太多的时间在识别之上。但只要要求一旦稍微放松一点,语音识别的难度一下子就会变得很高。对于非独立人的小词汇量、带语法结构的语音识别,就需要在语音识别平台的接口上对带识别的语音输入语法结构做出具体的描述。而这种情况是现在一般的语音浏览器所遇到的最普遍情况。W3C 在这里定义了一套这样的语法标识表示。

标识语言中对自然语言处理的需求说明

这其实就是前面我们已经提到的语音理解方面的问题。这同上面的一点一样,和语音技术密切相关。定义了对于自然语言理解在语音浏览器实现当中的标识表示需求说明。

标识语言中对语音合成的需求说明

为了实现语音的输出,人们必须要用到语音合成。简单的把事先录制好的声音拼凑起来回放也可以视为语音合成中的一种。而实际当中用的更多的还是 TTS(Text To Speech)。怎样表示要合成的语句呢？不同的语音平台有着不同的方法。W3C 正是在抽象出这些特征的共性。比如说一句话中的某一个词要重读,某一句话是男声发音。通过标识语言,我们就可以统一的描述一段待合成的文字。

下面我们将对一些 W3C 的部分工作放大研究。

语音合成

前面我们已经谈到了一些语音合成的问题。当语音浏览器需要将输出的结果由字符变成自然语音时,我们必须时间把语音读本的一些语言特征事先标示出来提供给语音合成器。语音浏览器中这是用XML语言来实现的。

图1

如上图1所示文字数据从语音浏览器的前段处理得到后,被一种转换机制变成标识语言。这里的转换机制其实就是代码的开销。符合语音合成器的标识语言被送入特定的语音合成器当中,最终用户就可以听到自然语音了。

图2

请注意,这里图1示的语音合成方式并不是唯一的。还有简单的方法是把文字数据非拆成一些经常会被重复使用的短语段,然后通过匹配的方法读取事先录制好的语音段,拼合成为一段自然语音。见图2。但这种方法的缺点解释非常明显的。首先是对文字数据的范围限制很大,一定实效词汇量的,并且有着固定的句式。其次人工录制的开销较大,并且随着文字数据范围的扩大,开销成倍的扩大。最后,这种方法合成的自然语音并不自然。
由于不同的公司有着不同的语音应用平台,所以在从前语音合成的标识语言并不统一。但好在的是由于语音合成技术本身存在的一致性,这些不同的标识语言所标示的语音特征大同小异。差别只是在一些标识的表示方法不同之上。
下面让我们来看一下几种主要的语音合成标识语言。
1 JSML(Java Speech Markup Language)
JSML顾名思义是用来将文字输入Java语音API合成器之用的标识语言。JSML包含了被合成文字的自然语音属性。而且它使用的是Unicode字符集,所以它适用于几乎所有的语言。
例子:
<?XML version="1.0" encoding="gb2312 "?>
<JSML>
<PARA> 你一共欠了我
<EMP>
<SAYAS CLASS="number">10000元</SAYAS>
</EMP>
</PARA>
<PARA>
<EMP>
<SAYAS CLASS="literal">太夸张了</SAYAS>
</EMP>
</PARA>
</JSML>
我们不会在这里详细的介绍JSML的标识的含义,因为我们将比较详细的介绍W3C的标准。我们可以从例子当中看到这是一段对话。<PARA>表示的是这是一段话。<EMP>表示重读。<EMP>的属性LEVEL还可以设定重读的分量,上面的例子当中并没有体现。<SAYAS>用来标记文字读出的方式。具体的方式是由它的特定属性设定的。比如上面的CLASS="number"表示按照数字大方式读。CLASS="literal"表示按照分离的方式读,也就是“太夸张了”。

2 SABLE
同上面一样我们也通过一个例子来了解它。
例子:
<DIV TYPE="paragraph">这就是去年
<EMPH>你</EMPH>
为我
<PITCH BASE="high" RANGE="large">
<RATE SPEED="-20%">点的歌</RATE>
</PITCH>
</DIV>
<AUDIO SRC="easycome_easygo.wav"/>
从大体上说SABLE和JSML非常相似。我只挑出比较特别的几个标识来解释一下。<PITCH>是对音调的要求。<RATE>是对语速的要求。<AUDIO>表明的是一段以录制好的语音段。
支持SABLE典型的有Festival语音合成系统。Festival是由英国Edinburgh大学语音技术研究中心(Center for Speech Technology Research)开发的多语种语音合成系统。对于从事语音研究的人来说,CSTR值得好好钻研。因为它不但有像Festival这样的成熟语音合成系统,还有一套开放源代码的语音识别平台软件包。
下面那就让我们来看一看W3C在语音合成标识语言上的标准。
和前面所提到的两种语言一样,W3C把它所规定的标识和属性分为了三类。一类是表示语言组织结构的表识,一类是表示语音特征上的表识,还有一类是对上面两类的补充,一般是为可能的扩充留有余地。
我们将以表格的形式来介绍这些标识和属性。
下面是第一层的标识:

文件结构 文本处理 发音音素 | speak | 根节点
xml:lang | 根节点中表示语种的属性
paragraph和sentence | 表示段落和局字的结构节点
sayas | 定义文本的预处理格式,属性为:type
phoneme | 定义文本的发音方法,属性为:ph
发音韵律 | voice | 表示不同发音方法的节点
emphasis | 重音发音节点
break | 表示暂顿的空节点
prosody | 控制语音语素语调的节点
其他 | audio | 表示加入预先录好语音段的节点
mark | 表示异步合成当中的一个标记

针对一些结构选项复杂的节点,我们再来仔细的看一看:

"sayas" 节点type属性可选项值:

发音 | acronym | 首字母缩写的合成词。按单个字母分别读出。
sub("sayas" 节点的属性) | 值为节点值的替换。在后面列出的DTD当中并没有声明。
数字 | number | 值为节点值的数字形式。可选的值有ordinal、digits等:
时间、量度 | date | 日期控制格式
time | 时刻控制格式
duration | 时间间隔长度设定
currency | 金额控制格式
measure | 表示文本为量度
地址、标识 | name | 人或是公司的名称
net | 网络地址。可以是电子邮件或是网址
address | 邮政地址

"voice" 节点属性值:

gender | 发声者性别
age: | 发声者年龄范围
variant | 发声者不同的发声。(可选,针对于平台的变量)
name | 针对于平台的发声标识。(可以看作是发声者的名字)

"break" 节点属性值:

size | 对中断边沿大小的设定
time | 对中断时间长度量化设定

"prosody" 属性属性值:

pitch | 基音调设定
contour | 基音调轮廓设定
range | 基音变化范围设定
rate | 语速
duration | 发音时间长度设定
volume | 发音银两大小设定

下面是 W3C 设定的语音合成标识语言的 DTD:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Speech Synthesis Markup Language v0.5 20000504 -->
<!ENTITY % allowed-within-sentence " #PCDATA | sayas | phoneme |voice | emphasis | break | prosody | audio | value | mark " >
<!ENTITY % structure "paragraph | p | sentence | s">
<!ENTITY % duration "CDATA">
<!ENTITY % integer "CDATA" >
<!ENTITY % uri "CDATA" >
<!ENTITY % phoneme-string "CDATA" >
<!ENTITY % phoneme-alphabet "CDATA" >
<!-- Definitions of the structural elements. -->
<!-- Currently, these elements support only the xml:lang attribute -->
<!ELEMENT speak (%allowed-within-sentence; | %structure;)*>
<!ELEMENT paragraph (%allowed-within-sentence; | sentence | s)*>
<!ELEMENT sentence (%allowed-within-sentence;)*>
<!-- The flexible container elements can occur within paragraph -->
<!-- and sentence but may also contain these structural elements. -->
<!ENTITY % voice-name "CDATA">
<!ELEMENT voice (%allowed-within-sentence; | %structure;)*>
<!ATTLIST voice gender (male|female|neutral) #IMPLIED
age (%integer;|child|teenager|adult|elder) #IMPLIED
variant (%integer;|different) #IMPLIED
name (%voice-name;|default) #IMPLIED >
<!ELEMENT prosody (%allowed-within-sentence; | %structure;)*>
<!ATTLIST prosody
pitch CDATA #IMPLIED
contour CDATA #IMPLIED
range CDATA #IMPLIED
rate CDATA #IMPLIED
duration CDATA #IMPLIED
volume CDATA #IMPLIED >
<!ELEMENT audio (%allowed-within-sentence; | %structure;)*>
<!ATTLIST audio
src %uri; #IMPLIED >
<!-- These basic container elements can contain any of the -->
<!-- within-sentence elements, but neither sentence or paragraph. -->
<!ELEMENT emphasis (%allowed-within-sentence;)*>
<!ATTLIST emphasis level (strong|moderate|none|reduced) 'moderate' >
<!-- These basic container elements can contain only data -->
<!ENTITY % sayas-types "(acronym|number|ordinal|digits|telephone|date|time| duration|currency|measure|name|net|address)">
<!ELEMENT sayas (#PCDATA)>
<!ATTLIST sayas
type %sayas-types; #REQUIRED >
<!ELEMENT phoneme (#PCDATA)>
<!ATTLIST phoneme ph %phoneme-string; #REQUIRED
alphabet %phoneme-alphabet; #IMPLIED >
<!-- Definitions of the basic empty elements -->
<!ELEMENT break EMPTY>
<!ATTLIST break size (large|medium|small|none) 'medium'
time %duration; #IMPLIED >
<!ELEMENT mark EMPTY>
<!ATTLIST mark name CDATA #REQUIRED >
语音对话
所谓语音对话就是语音浏览器的对话控制部分。它是整个语音浏览器的主要“食物”。VoiceXML 其实就是典型的语音浏览对话控制语言。编写 VoiceXML 非常类似在编写一段程序,而不像 HTML 那样纯粹是信息的堆砌。
因为要考虑到语音浏览器的特殊浏览方式,对于语音对话控制部分的标识语言的设计就显得特别的困难。W3C 也只是对它的需求进行了说明,然后又认证由工业界提交的现成版本。因为我们将在后面详细介绍 VoiceXML 的结构,所以我们只在这一小节中对 W3C 的需求说明进行简单的介绍。
总的来看,需求说明阐明了四个大方面的需求:
形态需求:这主要是对浏览器输入输出以及中间过程上的数据形态的规定。
功能需求:这主要是对可支持的对话发式的定义。针对语音浏览会最常用到的对话方式,规定了一些语音对话标识语言必须实现的对话功能。
格式需求:在标识语言的书写格式上也有一些要求。比方是对可重复使用的常用单元的支持等。
其他方面就非常空泛了。包括触发事件句柄、语音浏览的用户制和语音用户的认证。