在這一部分中讓我們來看一看語音方面現有的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>
<
<EMP>
<SAYAS CLASS="number">10000元</SAYAS>
</EMP>
</
<
<EMP>
<SAYAS CLASS="literal">太誇張了</SAYAS>
</EMP>
</
</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的需求說明進行簡單的介紹。
總的來看,需求說明闡明了四個大方面的需求:
形態需求:這主要是對浏覽器輸入輸出以及中間過程上的數據形態的規定。
功能需求:這主要是對可支持的對話發式的定義。針對語音浏覽會最常用到的對話方式,規定了一些語音對話標識語言必須實現的對話功能。
格式需求:在標識語言的書寫格式上也有一些要求。比方是對可重復使用的常用單元的支持等。
其他方面就非常空泛了。包括觸發事件句柄、語音浏覽的用戶制和語音用戶的認證。