如图2所示,待处理的文本经过语言处理模块和韵律处理模块的处理,转变成语言和韵律信息,这些系统相关的语言和韵律信息经过XML文档生成器的处理,转变成XML文档。系统无关的XML文档在通讯链路上,如互联网等上传递,最终到达分布式语音合成客户机。
分布式语音合成系统数据交换方法,即我们对语言和韵律信息进行结构化描述的方法,通常必须具备以下功能:
支持多种格式文档的输入,即能指明当前文档格式;具有可读性,即易于被人类和机器理解;易于直接由人手工书写,并且同时也易于机器自动生成;与现有各标记体系保持一致,尽量兼容或易于被自动转化。具体来讲应当满足以下基本要求:1、对单模态输出和多模态输出都能加以控制;2、能对合成文本的结构加以描述;3、支持不同语言和方言的定义;4、支持特殊发音指定(宏发音),包括强制改变发音以及引用外部声音元素;5支持对诸如速度、音高、音强等参数的控制;6、支持对音色的指定,如发音人姓名、性别、年龄等;7、对特定格式文字发音的支持,如地址、电话、网址等;8、支持重读/强调控制;9、支持某段文字语调控制;10、支持其他模态控制数据嵌入;11、支持音场环境/声源位置定义。
本发明所述的数据交换方法的具体内容说明如下:
XML(可扩展标记语言:eXtensible Markup Language)是互联网上进行结构化数据交换十分有效的手段。它具有语言无关、平台无关、人类可读性强、易于机器理解、可以直接使用在互联网上、支持大量应用等优良特性。XML描述了一类称为“XML”文件的数据对象,同时也部分地描述了处理这些数据对象的计算机程序的动作。XML文件具有良好的自描述特性,可以独立于各类平台进行数据存储与交换。
XML并不是一种“标记语言”。确切地说,它是一种元标记语言,是一种用于定义其它标记语言的标记语言。因此,它不能直接对特定领域的数据进行描述,因而不能被使用作为数据交换的载体。相反,必须使用它来定义针对某一特定领域的数据描述的标记语言,然后将被定义的标记语言作为该特定领域里数据交换的载体。
例如:HTML超文本标记语言是一种真正的标记语言,它对WWW上多媒体信息进行描述,可以用来在WWW服务器和客户浏览器之间进行多媒体信息的交换。它由SGML标准通用标记语言定义,将来可能变成由XML定义。由此看出,XML与SGML属于同一层次的概念,均为定义其它语言的元语言。我们定义的标记语言,与HMTL属于同一层次的概念,均为真正的标记语言。HTML对WWW上多媒体信息进行描述,我们定义的标记语言对分布式语言合成服务器的计算结果——语言和韵律信息进行描述,在分布式语言合成服务器和客户机之间进行语言和韵律信息的交换。
我们定义了中文语音合成标记语言(CSSML)规范。此规范建立在XML结构化文档基础之上,借鉴和融合了JSML、SABLE、STML、SAPI以及VXML等体系中关于语音合成方面的内容,并增加了对于中文特定内容的支持,定义了一套完整的标记语言CSSML(Chinese Speech Synthesis Markup Language),给出了其DTD描述,使得此规范的内容具有足够的覆盖范围。
CSSML针对语言和韵律信息建立了一个完整的描述体系。它既可以作为分布式语音合成系统中服务器和客户机之间数据交换的标准;也可以作为独立语音合成系统的输入,通过在待合成文本中加入若干标记从而对语音合成的各项属性参数加以控制。
数据交换方法在分布式语音合成系统中的应用:
本发明提供的数据交换方法,即CSSML,主要应用于分布式语音合成系统中,作为分布式语音合成系统的数据交换标准。分布式语音合成服务器完成语言处理和韵律处理,将文本转换成语言和韵律信息。这些语言和韵律信息经由一个被称为CSSML Generator(生成器)的处理模块,转换成CSSML文档。然后CSSML文档被从网络上传递给分布式语音合成客户机。分布式语音合成客户机将接收到的CSSML文档送入一个被称为CSSML Parser(解析器)的处理模块,将其转换为相应的语言和韵律信息。然后分布式语音合成客户机在这些语言和韵律信息的基础上继续进行处理,完成最终的语音合成。
CSSML是基于XML的结构化文档,具有良好的自描述特性。以CSSML作为数据交换标准的分布式语音合成系统,具有很好的鲁棒性、兼容性和易扩展性。在一个分布式语音合成系统中,服务器和客户机既可以由同一开发商同时开发,也可以由不同的开发商在不同的时间、采用不同的技术开发。只要服务器和客户机完全遵循CSSML规范,它们就可以进行集成,形成分布式语音合成应用。终端用户亦可以开发符合自身需求的客户机,通过接入应用网络,享受分布式语音合成服务。
数据交换方法在其它方面的应用:
本发明提供的数据交换方法,即CSSML,除了在分布式语音合成系统中担任核心角色之外,还可以应用在其它方面。如作为独立语音合成系统的输入,通过在待合成文本中加入若干标记从而对语音合成的各项属性参数加以控制。
在信息内容服务领域(如Web服务),内容提供商可以将以文本形式存在的信息内容,通过语言和韵律处理工具(作用类似于分布式语音合成服务器)转换成以CSSML文档形式存在的信息内容。CSSML文档可以提供给使用语音浏览器(作用类似于分布式语音合成客户机)的用户下载,以听代看的方式浏览信息。
在模块共享方面,CSSML也有着重要的作用。语音合成的前端(主要是指语言和韵律处理)和后端(主要是指最终语音合成)是组成一个完成语音合成系统的两大部分。其中,语音合成前后端都可以使用不同的技术实现。如果定义这样的一个规范:语音合成前端的输入为纯文本,输出为CSSML文档;语音合成后端的输入为CSSML文档,输出为合成语音。这样,我们可以选取任意满足此规范的前端和任意满足此规范的后端进行集成,构建语音合成系统,达到模块共享的目的。
以下通过元素与属性、输出输入的定义以及有关重要程序的实例对本发明作进一步的详细说明。
1.元素与属性
1.1 speak
由于此标注体系采用XML文档格式给出,因此根元素即为“speak”。
<?xml version=″1.0″?><speak>...合成内容...</speak> |
1.2 xml:lang
指定当前语种,包括子类(方言)的指定,可用值请参照Internet公文RFC1766,中文方言部分请参照附录。
<speak xml:lang=″cn″><para>这是标准普通话发音</para><para xml:lang=″cn-SH″>这是上海方言发音</para> |
1.3 paragraph、sentence、phrase、word
指定语音层次结构,以使合成语音更加符合使用要求,允许嵌套。
<paragraph><sentence><phrase><word>我们的</word><word>最高目标</word></phrase><phrase>是</phrase> |
1.4 sayas
指明文本的性质,即如何决定其发音方式,“type”属性将被用来指明具体的文本性质,包括
“acronym”:缩写形式
“number”:指明数字,还可附带“ordinal”或“digits”指明读法。
“date”:指明日期,可附带“ymd”“mdy”“dmy”“ym”“my”“md”“y”指明顺序。
“time”:指明时刻,可附带“hm”“hms”指明包含内容。
“duration”:指明时间段,可附带“hm”“hms”“ms”指明内容。
“currency”:指明货币金额。
“measure”:指明度量值。
“name”:指明是人的姓名、公司名称或是地名。
“net”:指明是与Internet相关的固定说法,包括“email”“url”等附加值。
“address”:指明是表述邮政地址。
现在时钟已指向<sayas type=”number”>VIII</sayas>我住在<sayas type=”number:digits”>412</sayas>房间我已经修正了<sayas type=”number:ordinal”>34</sayas>个错误<sayas type=”date:ymd”>2000/12/13</sayas> |
1.5 phoneme
指明发音音标序列,属性包括“ph”和“py”,ph指由符合International Phonetic Alphabet(IPA)的音标序列构成;“py”指由符合中国国家拼音方案的音标序列构成。
他姓<phoneme py=”zengl”>曾</phoneme> |
1.6 voice
指明发音人特征,属性包括:
“gender”:指明发音人性别,可取值“male”(男声)“female”(女声)“neutral”(中性)。
“age”:指明发音人年龄,可取值整数或“child”“teenager”“adult”“elder”。
“variant”:指明发音人代号,可取值整数或“different”。
“name”:指明发音人姓名,通常是系统相关的,可取值为具体姓名串或“default”。
他说:<voice gender=”male”>“什么意思?”</voice>她回答:<voice gender=”female”>“没什么意思。”</voice> |
1.7 emphasis
指明轻重读/强调程度,属性有“level”,可指明强调等级,可取值“strong”“moderate”“none”以及“reduced”。
这个苹果可<emphasis>真大</emphasis> |
1.8 break
指明插入一个停顿,属性包括:
“size”:指明停顿长短,可取值“none”“small”“medium”“large”
“time”:指明具体停顿时长,以秒或毫秒为单位,如“3s”“300ms”
1.9 prosody
指明韵律上的一些参数,属性包括:
“pitch”:指明基频的高低,可取值绝对频率数值、相对改变值或“high”“medium”“low”“default”。
“contour”:指明调型曲线,取值为一系列关键点的值,每个关键点值由(位置,音高)来描述,位置为一百分比,音高与pitch的取值形式相同。
“range”:指明基频范围,可取值绝对频率数值、相对改变值或“high”“medium”“low”“default”。
“duration”:指明发音持续时长,可取值毫秒或秒、相对改变值或”fast”“medium”“slow”“default”。
“volume”:指明音量,取值范围为0.0~100.0或相对变化值或“silent”“soft”“medium”“loud”“default”。
<prosody contour=”(0%,default)(30%,+20%)(70%,+50%)”>你 |
1.10 lexicon
指明作用域内附加使用的用户词典,属性”src”指明用户词典,可以是以URI指定的某个文件或是已约定的对象名称(包括以MIME格式编码在文档中的内嵌对象)。
<lexicon src=”user lexicon/mech.lex”>这就叫做洛伦兹力 |
1.11 audio
指明插入一段已有声音样本,属性“src”指明声音样本,可以是以URI指定的某个文件或是已约定的对象名称。(包括以MIME格式编码在文档中的内嵌对象)
这时听到<audio src=”audio clip/ding.wav”>的一声 |
1.12 mark
指明插入一个标记,此标记可被用来快速检索文档,并在合成到此位置时触发mark事件。
1.13 value
指明插入一个系统变量的值,属性包括:
“name”:变量的名称。
“type”:与<sayas>中“type”属性相同。
现在时间是<value name=”currentTime”/> |
2.输入定义
系统应能接受符合上述标记规范的文档输入,并且可以接受没有任何标记的纯文本信息,并能自动作出分析。
3.输出定义
系统应能产生指定格式的音频数据,并且在扩展系统中还应能产生其他模态的输出数据以及同步信息。
4.一致性
4.1不同实现的可互操作性
应能保证在不同目标平台和实现目标集中,可被兼容和互操作。
4.2对已有规范的兼容性
由于在定义此规范时已充分考虑到现有各种标记语言,并将其定义在XML结构化文档基础之上,使得内容的传输与解析具有优良的可扩展性和兼容性。
5.附录:
5.1中文区域性语言代码
代码 |
区域 |
代码 |
区域 |
cn-AH |
安徽 |
cn-JX |
江西 |
cn-BJ |
北京 |
cn-LN |
辽宁 |
cn-CQ |
重庆 |
cn-NM |
内蒙古 |
cn-FJ |
福建 |
cn-NX |
宁夏 |
cn-GD |
广东 |
cn-QH |
青海 |
cn-GS |
甘肃 |
cn-SC |
四川 |
cn-GX |
广西 |
cn-SD |
山东 |
cn-GZ |
贵州 |
cn-SH |
上海 |
cn-HA |
河南 |
cn-SN |
陕西 |
cn-HB |
湖北 |
cn-SX |
山西 |
cn-HE |
河北 |
cn-TJ |
天津 |
cn-HL |
黑龙江 |
cn-XJ |
新疆 |
cn-HN |
湖南 |
cn-XZ |
西藏 |
cn-HQ |
海南 |
cn-YN |
云南 |
cn-JL |
吉林 |
cn-ZJ |
浙江 |
cn-JS |
江苏 | | |
5.2 CSSML 0.9 DTD描述
<?xml version=″1.0″encoding=″UTF-8″?>
<!--Chinese Speech Synthesis Markup Language v0.9 20010315-->
<!ENTITY%allowed-within-sentence″#PCDATA|sayas|phoneme|voice|emphasis|break|prosody|audio|value|mark″>
<!ENTITY%structure″paragraph|sentence″>
<!ENTITY%duration″CDATA″>
<!ENTITY%integer″CDATA″>
<!ENTITY%uri″CDATA″>
<!ENTITY%phoneme-string″CDATA″>
<!ENTITY%phoneme-string-py″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)*>
<!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 lexicon(%allowed-within-sentence;|%structure;)*>
<!ATTLIST lexicon
src%uri;#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
py%phoneme-string-py;#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
>
<!ELEMENT value EMPTY>
<!ATTLIST value
name CDATA#REQUIRED
type%sayas-types;#REQUIRED
>
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
py%phoneme-string-py;#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
>
<!ELEMENT value EMPTY>
<!ATTLIST value
name CDATA#REQUIRED
type%sayas-types;#REQUIRED
>