DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> XML在語音中的應用
XML在語音中的應用
編輯:XML詳解     
隨著XML在工業界被廣泛的采用,在不同的領域不同的行業,各自派生出了一些在一些特定領域適用的XML子集。在這一系列文章中中將要主要介紹的VoiceXML就是其中之一。它和WML的地位非常相似。WML是應用於無線上網中的特種語言,VoiceXML是應用於語音浏覽的特種語言。無線上網(WAP)和語音浏覽是現在網絡發展的兩大熱點,XML在它們身上都找到了用武之地。

  整篇文章將比較介紹XML在語音中應用的一些重要環節。除了VoiceXML之外,還會介紹一些XML在語音技術中應用的其他方面。在這一部分中主要是背景知識的介紹。

語音浏覽器,VoiceXML誕生的溫床

  電話的出現是為了方便通信。電腦的出現是為了計算。進入“後PC時代之”後,“電腦”同“網絡”這兩個詞越來越靠近。現在,很多買電腦的人得以達目的就是為了上網。網絡成了信息交換共享的一條捷徑,人們紛紛“中彈落馬”。以至於通過電話上網也提上了日程。越是簡單通用的,就越是受到最廣泛普通消費者的青睐。越是受到最廣泛普通消費者的青睐的就越是被工業界大力推崇。

  有一點是毫無疑問的,那就是現在的電話比電腦要多。隨便走在一個城市的街道上,您會很輕易地發現公用電話。但我現在還不敢想象在大街上隨處可見的“公用電腦亭”,五角錢三分鐘上網。不光是在城市,電話並不是什麼稀罕玩藝,而要買一台電腦,不少人還是要咬一咬牙。而且,電話比電腦的這種優勢還在不斷擴大。個人移動電話的發展正處於前所未有的高峰時期,相信將來的單人對單機並不是什麼神話。

  另外,電話遠比電腦具有親和力。我相信許多人對電腦的操作都具有一定工具心理。不是怕原有的界面被改動後無法還原,就是怕不知道應該在哪裡去修改想要的設置。這對已經是比較友好的視窗界面就是如此了,更不要去說什麼滿屏黑的Unix之類。而電話就不一樣了,只有非常有限的幾個鍵,遇到麻煩把話筒一掛再重新拿起就是了。而且關鍵的是電話聽筒裡說的是“人話”。

  所以我們說通過電話訪問網絡是非常有前途的。再加上現在還有一種發展趨勢就是把多種界面訪問形式,比如是語音、圖像和觸覺等,一起結合在電話上成為名副其實的PDA(個人數字助理),我們不得不在這裡再一次對電話的發展前途誇耀一番。人們將可以在任何時間任何地點通過隨手可得的“電話”,通過簡單易懂的操作方法連接到網絡。

語音浏覽是網絡的一種全新浏覽方式

  對於一家小有規模的公司來說,擁有一台電話總機並不是一件什麼新鮮事。電話用戶可以通過數字按鍵聯絡到不同的員工。還有一種普遍的電話總機功能是用或通過數字按鍵游離層狀目錄結構來獲取信息。而我們要在這裡探討的語音浏覽和這裡的形式上有相似之處。用戶主要是通過語音來發送自己的信息。我們還可以把服務的對象擴大到提供內容服務的網站上去。使用的聯絡網絡也不一定要是專用電話網,還可以是因特網。

什麼是語音浏覽器

  語音浏覽器是以語音輸入為主要輸入渠道,其他形式為輔助輸入渠道,翻譯解釋執行語音標記語言,並能產生語音輸出的設備。

  上面這段味如嚼蠟的解釋源於W3C。就像要用一句話把人描述出來一樣,它頗費周折地概述了一些空泛的共性。雙腿直立行走,用上肢勞動的哺乳類動物雲雲。語音浏覽器想要實現的是通過最具有親和力的交流方式,把來自具有最豐富資源的網絡上的信息通過聲音提供給用戶。

  明眼人一看便知,設計完成一個語音浏覽器還有語音識別、語音理解和語音合成上的技術壁壘。當用戶要通過語音發出命令時,語音浏覽器要知道用戶在說些什麼?比較簡單的是命令式語音識別。系統要求你只能說“蚊子”或是“蒼蠅”。其他的都認為是非法輸入。復雜的要牽涉到對一段語音的理解。比如說當用戶說“今天星期幾?”或是“今天是一個星期中的第幾天?”時要知道是同一回事。這樣的話,用戶就方便了不少。而這就需要語音理解技術來處理了。語音合成也是必不可少的。當你要把浏覽到的信息傳送給用戶時時通過語音。這可以是一段事先錄好的自然人語音,也可以是通過文字到語音的TTS語音合成系統。可以非常明確的說,上面要用到的技術都是需要大量的技術積累才能實現的,絕不是一日之功。對於絕大多數設計實現語音浏覽器的開發上來說都會很自然的去采用一些在語音方面頗有底蘊的公司所提供的技術產品支持。主要的精力都在集成之上。

  語音浏覽器的主要特點是非常鮮明的。在許許多多普通的場合之下,通過近似自然對話的方式來發布命令,通過一種不同於Html兩維的浏覽方式,時間上線性地收取信息。只是非常有誘惑力的。有很多情況之下,根本就不允許用眼睛來監督,如在開車的時候。用戶只有通過非視覺的方式來控制。

  網頁浏覽器提供了在不同葉面之間跳轉的方法,語音浏覽器也可以從一段對話跳轉到另一段。網頁浏覽器提供了添取、發送表單的方法,語音浏覽器頁可以設定用戶的一段語音為一次有目的的輸入。事實上語音浏覽器和HTML葉面浏覽器有非常相似之處。用GRE類比題的方式來表示就是:語音浏覽器:VoiceXML::HTML浏覽器:Html。  在這一部分中讓我們來看一看語音方面現有的XML標准化進程。

W3C在語音浏覽上所作的工作

  作為一個權威的標准化組織,W3C和早就看上了語音浏覽(Voice Browser)。W3C於1998年的10月份成立了一個名為“語音浏覽器”的工作站。大家在這裡可以聯想一下,XML是最早於1996年底被提上議案的。工作站的目標非常明確,制定語音浏覽方面的標准,迎接即將來臨的語音浏覽熱潮。工作站的工作主要基於以下一些方面,我們還要在後面對其中的部分工作放大研究。

  語音標識語言對於對話的需求說明

  簡單的說,為了語音浏覽器能夠方便的結合不同的輸入輸出形式,和諧的同用戶交互“對話”,需要對用來表示對話數據的標識語言進行限制。可以想象,用於表現平面網頁的Html就不能勝任語音浏覽器。不但是因為它繁雜混亂,而且它的二維性質也使得它不能表示交互式的對話。

  標識語言當中對可重復使用對話的要求說明

  好比高級程序語言編程一樣,有一些小的模塊會是被經常重復使用的。這些小的模塊被設計成為函數或是過程,每當要用的時候就調用一次。在語音浏覽器使用的標識語言當中需要有這樣的類似機制,用來表示那些經常會被重復使用的部分。這一點可以在後面的文章中具體的體會到。經常會被重復使用的部分包括簡單的確認、收集電話號碼、日期、金額、信用卡信息和地址的信息等。

  標識語言當中語音識別語法層表示的需求說明

  前面我們已經提到過語音浏覽器的實現和語音技術的應用密不可分。為了實現語音數據的識別輸入,語音浏覽器會用到現成的語音識別平台。不同的語音識別方法有著不同的平台要求。如果只是獨立人的小詞匯量識別,我們還可能不需花費太多的時間在識別之上。但只要要求一旦稍微放松一點,語音識別的難度一下子就會變得很高。對於非獨立人的小詞匯量、帶語法結構的語音識別,就需要在語音識別平台的接口上對帶識別的語音輸入語法結構做出具體的描述。而這種情況是現在一般的語音浏覽器所遇到的最普遍情況。W3C在這裡定義了一套這樣的語法標識表示。

  標識語言中對自然語言處理的需求說明

  這其實就是前面我們已經提到的語音理解方面的問題。這同上面的一點一樣,和語音技術密切相關。定義了對於自然語言理解在語音浏覽器實現當中的標識表示需求說明。

  標識語言中對語音合成的需求說明

  為了實現語音的輸出,人們必須要用到語音合成。簡單的把事先錄制好的聲音拼湊起來回放也可以視為語音合成中的一種。而實際當中用的更多的還是TTS(Text To Speech)。怎樣表示要合成的語句呢?不同的語音平台有著不同的方法。W3C正是在抽象出這些特征的共性。比如說一句話中的某一個詞要重讀,某一句話是男聲發音。通過標識語言,我們就可以統一的描述一段待合成的文字。

  下面我們將對一些W3C的部分工作放大研究。

語音合成

  前面我們已經談到了一些語音合成的問題。當語音浏覽器需要將輸出的結果由字符變成自然語音時,我們必須時間把語音讀本的一些語言特征事先標示出來提供給語音合成器。語音浏覽器中這是用XML語言來實現的。

  所示文字數據從語音浏覽器的前段處理得到後,被一種轉換機制變成標識語言。這裡的轉換機制其實就是代碼的開銷。符合語音合成器的標識語言被送入特定的語音合成器當中,最終用戶就可以聽到自然語音了。

  請注意,語音合成方式並不是唯一的。還有簡單的方法是把文字數據非拆成一些經常會被重復使用的短語段,然後通過匹配的方法讀取事先錄制好的語音段,拼合成為一段自然語音。但這種方法的缺點解釋非常明顯的。首先是對文字數據的范圍限制很大,一定實效詞匯量的,並且有著固定的句式。其次人工錄制的開銷較大,並且隨著文字數據范圍的擴大,開銷成倍的擴大。最後,這種方法合成的自然語音並不自然。

  由於不同的公司有著不同的語音應用平台,所以在從前語音合成的標識語言並不統一。但好在的是由於語音合成技術本身存在的一致性,這些不同的標識語言所標示的語音特征大同小異。差別只是在一些標識的表示方法不同之上。

  下面讓我們來看一下幾種主要的語音合成標識語言。


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 (malefemaleneutral) #IMPLIED
age (%integer;childteenageradultelder) #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 (strongmoderatenonereduced) ''moderate'' >

<!-- These basic container elements can contain only data -->
<!ENTITY % sayas-types "(acronymnumberordinaldigitstelephonedatetime durationcurrencymeasurenamenetaddress)">
<!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 (largemediumsmallnone) ''medium''
time %duration; #IMPLIED >

<!ELEMENT mark EMPTY>
<!ATTLIST mark name CDATA #REQUIRED >


  語音對話
  所謂語音對話就是語音浏覽器的對話控制部分。它是整個語音浏覽器的主要“食物”。VoiceXML其實就是典型的語音浏覽對話控制語言。編寫VoiceXML非常類似在編寫一段程序,而不像Html那樣純粹是信息的堆砌。

  因為要考慮到語音浏覽器的特殊浏覽方式,對於語音對話控制部分的標識語言的設計就顯得特別的困難。W3C也只是對它的需求進行了說明,然後又認證由工業界提交的現成版本。因為我們將在後面詳細介紹VoiceXML的結構,所以我們只在這一小節中對W3C的需求說明進行簡單的介紹。

  總的來看,需求說明闡明了四個大方面的需求:

  形態需求:這主要是對浏覽器輸入輸出以及中間過程上的數據形態的規定。
  功能需求:這主要是對可支持的對話發式的定義。針對語音浏覽會最常用到的對話方式,規定了一些語音對話標識語言必須實現的對話功能。

  格式需求:在標識語言的書寫格式上也有一些要求。比方是對可重復使用的常用單元的支持等。

  其他方面就非常空泛了。包括觸發事件句柄、語音浏覽的用戶制和語音用戶的認證。   在這一部分中主要是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&aUML; Speech API Grammar Format (JSGF)。

  built-in grammar是浏覽器平台自己設定的grammar。它是具有個性化的東西。不同的廠家可能會有不同的built-in grammar。為的是方便在浏覽器上的應用開發。

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved