• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            鐵觀音

            C++編程寶典

               ::  ::  ::  ::  :: 管理 ::
              1 隨筆 :: 19 文章 :: 0 評論 :: 0 Trackbacks
            VoiceXML2.0規(guī)范
            ?
            第一章??概述

            ?

            ?
            ????這篇文檔詳細描述了VoiceXML,即語音擴展標記語言。第一章介紹它的背景、基本概念和用途;第二章介紹form的對話框結構(dialog constructs)、menu、link和它們的解釋機制FIA(Form Interpretation Algorithm);第三章介紹用戶的DTMF(Dual Tone Multi-Frequency)和語音輸入用到的語法;第四章介紹系統(tǒng)輸出用到的語音合成和預先錄制的音頻;第五章介紹對話框(Dialog)流程的控制,包括變量、事件和可執(zhí)行元素;第六章介紹各種環(huán)境特性,例如參數(shù)(Parameter)、屬性(Property)和資源處理;附錄提供了包括VoiceXML計劃、FIA(Form Interpretation Algorithm)、音頻文件格式等附加信息。
            ????VoiceXML最早出現(xiàn)于1995年,作為一種基于XML對話的設計語言,它的出現(xiàn)是為了簡化AT&T一個名為PML(Phone Markup Language)項目中語音識別程序的開發(fā)過程。經(jīng)過AT&T的重新組織,AT&T,Lucent and Motorola的開發(fā)團隊繼續(xù)致力于開發(fā)他們的類PML語言。
            ????1998年,W3C主辦了一次關于語音瀏覽器的會議。此時,AT&T and Lucent對于最開始的PML都有各自不同的發(fā)展,Motorola開發(fā)了VoXML,IBM正在開發(fā)它自己的SpeechML。此次會議的其他與會者也正在開發(fā)類似的語言,例如HP的TalkML和PipeBeach的VoiceHTML。
            ????于是AT&T、IBM、Lucent和Motorola共同組織了VoiceXML論壇,它的任務是定義一種標準的對話設計語言,使開發(fā)者可以用它來創(chuàng)建會話式的應用程序。他們選擇XML作為他們工作的基礎,因為他們很清楚,XML是技術發(fā)展的趨勢。
            ????在2000年,VoiceXML論壇發(fā)布了VoiceXML 1.0。此后不久,VoiceXML 1.0被提交給W3C(World Wide Web Consortium)作為一種新的國際標準。VoiceXML 2.0就是W3C的成員單位、其他的W3C工作組和公眾的共同努力的結果。
            ????熟悉VoiceXML1.0的開發(fā)者可直接到附錄,那里總結了VoiceXML2.0和VoiceXML1.0的差別。
            ?
            第一節(jié) 介紹 ?
            ?
            ????VoiceXML是用來創(chuàng)建音頻對話的,主要包括語音合成、數(shù)字化音頻、語音識別、DTMF按鍵輸入識別、錄音、通話、混合主動式會話。它的主要作用是把基于網(wǎng)絡的開發(fā)和信息這兩者的優(yōu)勢引入語音應答系統(tǒng)。
            ????這里有兩個簡短的例子,第一個例子是“Hello World”:
                  <?xml version="1.0" encoding="UTF-8"?>
                  <vxml xmlns="http://www.w3.org/2001/vxml"
                       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                         xsi:schemaLocation="http://www.w3.org/2001/vxml
                           http://www.w3.org/TR/voicexml20/vxml.xsd"
                            version="2.0">
                    <form>
                      <block>Hello World!</block>
                    </form>
                  </vxml>
            ????最上層的元素是<vxml>,它主要是作為dialog的容器。在VoiceXML里有兩種dialog:form和menu 。form用來輸出提示信息和收集輸入信息,menu提供一些choice,以決定下一步要做什么。這個例子里有一個form,它包含了一個block,這個block把“Hello World!”合成語音,并輸出給用戶。由于這個form沒有指定下一個dialog,因此,這次會話結束。
            ????第二個例子要求用戶選擇一種飲料,然后把它提交給服務器端的一個腳本。
                  <?xml version="1.0" encoding="UTF-8"?>
                  <vxml xmlns="http://www.w3.org/2001/vxml"
                       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                         xsi:schemaLocation="http://www.w3.org/2001/vxml
                           http://www.w3.org/TR/voicexml20/vxml.xsd"
                            version="2.0">
                    <form>
                     <field name="drink">
                       <prompt>Would you like coffee, tea, milk, or nothing?</prompt>
                       <grammar src="drink.grxml" type="application/srgs+xml"/>
                     <block>
                       <submit next="http://www.drink.example.com/drink2.asp"/>
                     </block>
                     </field>
                    </form>
                  </vxml>
            ????field是一個輸入域,用戶必須給field提供一個值,否則就不可能進行到form中的下一個元素。下面是這個例子的一個簡單的人機交互:
                  C (computer): Would you like coffee, tea, milk, or nothing?
                  H (human): Orange juice.
                  C: I did not understand what you said. (a platform-specific default message.) 
                  C: Would you like coffee, tea, milk, or nothing?
                  H: Tea
                  C: (continues in document drink2.asp) 

            第二節(jié) 背景 ?
            ?
            ????這一節(jié)包含了一個高級的結構模型,它的一些術語將用來說明VoiceXML的目標,范圍、設計法則對支持VoiceXML的系統(tǒng)的要求。
            一、結構模型
            ????這篇文檔采用的結構模型由以下幾部分組成:
            圖1: 結構模型
            ????文檔服務器(例如web服務器)通過VoiceXML解釋器環(huán)境(context)處理來自客戶端應用程序,即VoiceXML解釋器的請求。服務器端則產(chǎn)生一些文檔由VoiceXML解釋器處理。VoiceXML解釋器環(huán)境和VoiceXML解釋器會同時監(jiān)聽用戶的輸入。例如,VoiceXML解釋器可能會一直監(jiān)聽一段特別的提示輸出,以便更好的引導用戶,同時另一個則監(jiān)聽用戶參數(shù)選擇的改變,如音量或者語音合成的特性。
            ????執(zhí)行平臺由VoiceXML解釋器環(huán)境和VoiceXML解釋器控制。例如,在交互式語音應答系統(tǒng)中,VoiceXML解釋器環(huán)境負責檢測電話呼入,若有則把電話接起來并把這次呼叫引導到程序的第一個文檔;而VoiceXML解釋器在電話接起來后負責控制對話框。執(zhí)行平臺則產(chǎn)生一些事件來響應用戶相應的操作(如接收到的語音或字符輸入,或者掛機)和相應的系統(tǒng)事件(如定時器到期)。其中,有一些事件是由VoiceXML解釋器執(zhí)行,像VoiceXML文檔中指定的一些事件;另外一些則由VoiceXML解釋器環(huán)境執(zhí)行。
            ?
            二、VoiceXML的目標
            ????VoiceXML的主要目標有三個:1、最大限度地將web開發(fā)和web內(nèi)容傳輸?shù)哪芰氲秸Z音應答系統(tǒng)中;2、將該領域的程序員從底層編碼解脫出來;3、資源管理。它使得語音服務和數(shù)據(jù)服務可以通過我們熟悉的客戶服務器模式結合起來。通過和執(zhí)行平臺之間一系列的交互對話,用戶就可以瀏覽語音服務了。這些對話由文檔服務器提供,文檔服務器和執(zhí)行平臺可能不在同一臺機器上。文檔服務器負責提供全部的服務邏輯、執(zhí)行數(shù)據(jù)庫、執(zhí)行傳下來的系統(tǒng)操作、產(chǎn)生對話框。VoiceXML文檔會指定每一個交互式對話,以便于VoiceXML解釋器控制。用戶的輸入會影響到對話框的解釋,并且這些輸入也會被提交給文檔服務器。文檔服務器提供另一個VoiceXML文檔以繼續(xù)用戶和其他dialog之間的會話。
            ????VoiceXML是一種標記語言,它有以下優(yōu)點:
            ??????1、通過在每個文檔中指定多個交互式對話,最大限度地減少客戶機和服務器之間的交互;
            ??????2、使得程序員不用理會底層的和平臺特有的細節(jié);
            ??????3、使得用戶交互的代碼(在VoiceXML中)和業(yè)務邏輯(例如CGI腳本)分離;
            ??????4、提高業(yè)務在不同平臺的可移植性。VoiceXML對內(nèi)容提供商、工具提供商和平臺提供商來說是一種通用的語言;
            ??????5、它可以很容易地應用到簡單的交互中,也可以通過提供一些語言特性來支持復雜的對話。
            ????雖然VoiceXML力爭滿足大多數(shù)語音應答服務的需求,但對于一些有特殊要求的服務,最好還是由專門的應用程序來完成,因為他們有更出色的控制水平。
            ?
            三、VoiceXML的范圍
            ????VoiceXML描述的是由語音應答系統(tǒng)提供的人機交互,它包括以下幾個方面:
            ??????1、語音合成(text-to-speech);
            ??????2、聲音文件的輸出;
            ??????3、語音輸入的識別;
            ??????4、DTMF輸入的識別;
            ??????5、對話流的控制;
            ??????6、電話的一些特性,如呼叫轉移和掛機。
            ????VoiceXML提供了多種方式來收集字符和(或)語音輸入,給文檔定義的相應的變量賦值,也提供了多種方式來決定文檔的解釋順序。一個文檔可以通過URI(Universal Resource Identifier)鏈接到其他的文檔。
            ?
            四、設計法則
            ????VoiceXML程序也是一種XML程序。
            ??????1、VoiceXML通過抽象化平臺資源以提高服務的可移植性;
            ??????2、VoiceXML在支持的聲音文件格式、語音語法格式和URI方案上可以適應平臺的多樣性。雖然提供商的平臺可能支持多種語法格式,但是VoiceXML要求平臺必須支持一種通用的格式,即W3C的SRGS(Speech Recognition Grammar Specification)的XML格式,以提高協(xié)同工作的能力。同樣的,對回放和錄音的聲音文件,雖然平臺可能支持多種格式,但是附錄E上所提到的幾種聲音格式是必須要支持的;
            ??????3、對于普通類型的交互的編寫,VoiceXML完全可以支持;
            ??????4、VoiceXML有定義明確的語義,它保存了作者希望的人機交互行為。客戶端是啟發(fā)式的,它不需要理會文檔元素的解釋;
            ??????5、VoiceXML通過語法來識別語義解釋,使得程序可以運作;
            ??????6、VoiceXML有一套流程控制機制;
            ??????7、VoiceXML通過交互行為使各自分離的服務邏輯能夠運作;
            ??????8、VoiceXML并不是用來進行精確計算、數(shù)據(jù)庫操作或傳統(tǒng)的系統(tǒng)操作的,這些操作由文檔解釋器以外的外部資源處理(例如文檔服務器);
            ??????9、一般的服務邏輯、狀態(tài)管理、對話框的產(chǎn)生和對話框的先后順序都不屬于文檔解釋器處理;
            ??????10、通過URI,VoiceXML提供了多種方式鏈接到其他的文檔,也有多種方式提交數(shù)據(jù)到服務器腳本;
            ??????11、VoiceXML提供了多種方式正確地識別哪一些數(shù)據(jù)要提交到服務器,在某一次提交會用到哪個HTTP方法(GET or POST);
            ??????12、VoiceXML不要求文檔作者明確的分配和釋放對話資源,或處理并發(fā)執(zhí)行。資源分配和控制線程的并發(fā)執(zhí)行由執(zhí)行平臺處理。
            ?
            五、對執(zhí)行平臺的要求
            ????這一小節(jié)簡要地描述對支持VoiceXML解釋器的硬件/軟件平臺的要求。
            ????文檔獲得。解釋器環(huán)境要能夠獲得文檔給VoiceXML解釋器解釋,因此,必須支持“HTTP”URI協(xié)議。在某些情況下,文檔的請求(request)是在VoiceXML文檔解釋的時候產(chǎn)生的,而其他的請求是解釋器環(huán)境為了響應VoiceXML范圍之外的事件產(chǎn)生的,例如電話呼入。當通過HTTP發(fā)送文檔請求時,解釋器環(huán)境用“User-Agent”頭變量來標識自己,它的形式為“<name>/<version>”,例如,“acme-browser/1.2”。
            ????音頻輸出。執(zhí)行平臺必須支持聲音文件和文本語音轉換(TTS)的音頻輸出,并且能夠自由地序列化它們。如果某個音頻輸出資源不可用,要拋出事件error.noresource。聲音文件是通過URI引用的。VoiceXML指定了一系列必須支持的聲音文件格式(詳見附錄E),除了這些必須支持的格式以外,執(zhí)行平臺也可以支持其他格式的聲音文件。
            ????音頻輸入。執(zhí)行平臺要能夠檢測,同時報告字符和(或)語音輸入;控制檢測輸入的間隔時間,間隔時間的長短由VoiceXML文檔指定。如果音頻輸入資源不可用,要拋出事件error.noresource。
            ??????1、執(zhí)行平臺必須能夠報告用戶輸入的字符(如DTMF)。它必須支持W3C的SRGS所描述的XML格式的DTMF語法。也應該支持SRGS所描述的ABNF(Augmented Backus-Naur Form)格式的DTMF語法;
            ??????2、執(zhí)行平臺必須能夠動態(tài)地接收語音識別語法數(shù)據(jù)。它必須能用 W3C SRGS的XML格式的語音語法數(shù)據(jù)。也應該能夠接收W3C SRGS的ABNF格式的語音識別語法數(shù)據(jù),它也可以支持其他格式的語法,如JSGF(JSpeech Grammar Format),或者一些專有的格式。有些VoiceXML元素包含了語法數(shù)據(jù),其他的則通過URI來指向語法數(shù)據(jù)。語音識別器必須能夠跟著語音輸入的動態(tài)更新而更新,通過語音語法數(shù)據(jù)指定的方法來監(jiān)聽語音輸入;
            ??????3、執(zhí)行平臺必須要能夠把用戶的音頻輸入錄下來,且錄音對相應請求的變量是可用的。VoiceXML指定了一系列必須支持的錄音文件的格式(詳見附錄E),也可以支持其他的格式。
            ????轉接。平臺應該能夠支持通過通信網(wǎng)絡(如電話)連接第三方。

            第三節(jié) 概念 ?
            ?
            ????一個VoiceXML文檔(或一系列相關的文檔叫做一個應用(application))構成了一個有限的會話狀態(tài)。用戶一次只能在一個會話狀態(tài)或dialog中。每個dialog都會確定要跳轉的下一個dialog。跳轉通過URI指定,URI規(guī)定了下一個要用到的文檔和dialog。如果URI沒有指向一個文檔,則認為它指向當前文檔。如果URI沒有指向一個dialog,則認為它指向那個文檔的第一個dialog。如果一個dialog沒有指定它的下一個dialog,或者它有一個明確地退出會話的元素,則執(zhí)行中斷。
            一、Dialogs and Subdialogs
            ????VoiceXML有兩種dialog:form和menu。Form 定義了一個收集用戶輸入,并給相應的field變量賦值的交互。每個field可以指定一個語法,這個語法規(guī)定了field允許的輸入。如果有form級的語法存在,一個utterance可以填充幾個field。Menu給用戶提供了一些可選的選項,并根據(jù)用戶的選擇跳轉到另外一個dialog。
            ????Subdialog就像函數(shù)調(diào)用一樣,它提供了一種機制來調(diào)用一個新的交互,并返回到調(diào)用它的form。變量實例、語法和狀態(tài)信息都被保存起來,在返回到調(diào)用的文檔后仍然可用。例如,subdialog可以用在創(chuàng)建一個由數(shù)據(jù)庫查詢得到的確定序列;或者創(chuàng)建在單個應用的文檔中共享的組件;或者在多個應用中可重用的dialog庫。
            ?
            二、會話
            ????會話始于用戶開始和VoiceXML解釋器環(huán)境交互的時候,隨著用戶或文檔或解釋器環(huán)境請求結束而結束,包括了加載和執(zhí)行文檔的過程。
            ?
            三、應用
            ????應用(application)是由共享同一應用根文檔(application root document)的一系列文檔組成的。無論如何,只要用戶在跟應用里的文檔交互,它的根文檔都會被加載。當用戶在同一應用的其他文檔中跳轉時,應用根文檔一直都被加載,直到用戶跳轉到一個不在這個應用里的文檔。當應用根文檔被加載的時候,它的變量就像這個應用的變量一樣,對這個應用里所有的文檔都是可用的,它的語法在這個應用的生命期內(nèi)都是激活的。關于語法激活的規(guī)則在第3.1.4節(jié)討論。
            ????圖2展示了在一個應用中,共享同一個應用根文檔(root)的幾個文檔(D)之間的跳轉。
            圖2: 在一個應用中的幾個文檔之間的跳轉
            ?
            四、語法
            ????每個dialog都有一個或多個語音和(或)DTMF語法。在機器主導的應用中,每個dialog的語法只有當用戶在那個dialog中的時候才激活。而在混合主動式(mixed initiative)的應用中,相關的幾個dialog的語法同時都是激活的(也就是正在監(jiān)聽),即使用戶在同一個文檔的另外一個dialog,或者在同一個應用的另一個加載的文檔。混合主動式是指,用戶和機器交替地決定下一步要做的。在這種情況下,如果用戶說的話匹配了另一個dialog中激活的語法,執(zhí)行平臺會跳轉到那個dialog,用戶剛才所說的話就像是它在那個dialog中說的一樣。混合主動式增強了語音應用程序的靈活性和性能。
            ?
            五、事件
            ????VoiceXML提供了填充form的機制來處理“正常”的用戶輸入。另外,VoiceXML定義了一種機制來處理那些form機制沒有包含進去的事件。
            ????平臺能在多種環(huán)境下拋出事件,例如當用戶沒有響應的時候,或者沒有清楚地響應的時候,或者要求幫助的時候等。如果發(fā)現(xiàn)VoiceXML文檔有語義錯誤的時候,也會拋出事件。事件由catch元素或他們的簡寫元素捕捉。可能出現(xiàn)事件的元素都可以指定catch元素。catch也可以在封裝的元素里像拷貝一樣地繼承。這樣,可在某一級別指定對相同事件的處理,這些處理對更低級別的元素同樣有效。
            ?
            六、鏈接
            ????link支持混合主動式。它可以指定一個語法,無論何時,只要用戶在這個link的作用域內(nèi),這個語法都是激活的。如果用戶的輸入匹配了這個link的語法,控制就跳轉到該link指定的URI。

            第四節(jié) VoiceXML元素 ?
            ?
            元素 作用 章節(jié)
            <assign> 給變量賦值。 5.3.2
            <audio> 在prompt中播放一段音頻。 4.1.3
            <block> 沒有人機交互的可執(zhí)行代碼的容器。 2.3.2
            <catch> 捕獲事件。 5.2.2
            <choice> 定義一個menu item。 2.2.2
            <clear> 清除一個或多個form item變量。 5.3.3
            <disconnect> 斷開一個會話。 5.3.11
            <else> 用于<if>元素中的else。 5.3.4
            <elseif> 用于<if>元素中的elseif。 5.3.4
            <enumerate> 列舉menu中的choice的信息。 2.2.4
            <error> 捕獲<error>事件。 5.2.3
            <exit> 退出會話。 5.3.9
            <field> 在form中聲明一個輸入域。 2.3.1
            <filled> 在輸入域被填充后執(zhí)行一些操作。 2.4
            <form> 用于給出信息和收集數(shù)據(jù)的dialog。 2.1
            <goto> 在同一或不同文檔中跳轉。 5.3.7
            <grammar> 指定語音識別或DTMF語法。 3.1
            <help> 捕獲<help>事件。 5.2.3
            <if> 簡單的條件邏輯。 5.3.4
            <initial> 在進入一個混合主動式的form時聲明初始的邏輯。 2.3.3
            <link> 對所有在link的作用域內(nèi)的會話指定一個跳轉。 2.5
            <log> 生成調(diào)試信息。 5.3.13
            <menu> 提供可供選擇的跳轉。 2.2.1
            <meta> 以name/value對的形式定義一個元數(shù)據(jù)項。 6.2.1
            <metadata> 使用元數(shù)據(jù)方案定義元數(shù)據(jù)信息。 6.2.2
            <noinput> 捕獲<noinput>事件。 5.2.3
            <nomatch> 捕獲<nomatch>事件。 5.2.3
            <object> 跟自定義的擴展功能進行交互。 2.3.5
            <option> 在<field>中指定一個可選項。 2.3.1.3
            <param> <object>或<subdialog>的參數(shù)。 6.4
            <prompt> 產(chǎn)生一個輸出給用戶的語音合成和音頻的隊列。 4.1
            <property> 控制平臺的設置。 6.3
            <record> 錄音。 2.3.6
            <reprompt> 在某個事件被捕獲后重新訪問field時,再次播放這個field的prompt。 5.3.6
            <return> 從subdialog返回。 5.3.10
            <script> 指定一段客戶端的ECMAScript腳本邏輯。 5.3.12
            <subdialog> 在當前的dialog中調(diào)用另外一個dialog作為subdialog。 2.3.4
            <submit> 提交一些值到文檔服務器。 5.3.8
            <throw> 拋出事件。 5.2.1
            <transfer> 呼叫轉移。 2.3.7
            <value> 在prompt中插入一個表達式的值。 4.1.4
            <var> 聲明一個變量。 5.3.1
            <vxml> 在每個VoiceXML文檔中最上層的元素。 1.5.1
            表1:VoiceXML元素
            ?
            第五節(jié) 文檔的結構和執(zhí)行 ?
            ?
            ????VoiceXML文檔主要由一些叫做dialog的上層元素組成。VoiceXML有兩種對話:form和menu。文檔里還可以有<meta>、<metadata>、<var>、<script>、<property>、<catch>和<link>元素。
            一、在一個文檔中執(zhí)行
            ????文檔的執(zhí)行由默認的第一個對話開始。每個對話在執(zhí)行的時候,都會指定下一個對話,否則執(zhí)行中止。
            ????下面舉個“Hello World”的例子來說明它。這個例子里由有一個文檔級的變量――hi,它的值為字符串“Hello World!”,是第一個form的提示信息。一旦第一個form播放了“Hello World”,控制會跳轉到下一個叫做“say_goodbye”的form,然后播放“Goodbye!”由于第二個form沒有跳轉到其他的對話,文檔退出,執(zhí)行結束。
                  <?xml version="1.0" encoding="UTF-8"?>
                  <vxml xmlns="http://www.w3.org/2001/vxml"
                       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                         xsi:schemaLocation="http://www.w3.org/2001/vxml
                           http://www.w3.org/TR/voicexml20/vxml.xsd"
                            version="2.0">
                    <meta name="author" content="John Doe"/>
                    <meta name="maintainer" content="hello-support@hi.example.com"/>
                    <var name="hi" expr="'Hello World!'"/>
                    <form>
                     <block>
                        <value expr="hi"/>
                        <goto next="#say_goodbye"/>
                     </block>
                    </form>
                    <form id="say_goodbye">
                     <block>
                        Goodbye!
                     </block>
                    </form>
                  </vxml>
            ????上面的兩個form也可以合起來:
                  <?xml version="1.0" encoding="UTF-8"?>
                  <vxml xmlns="http://www.w3.org/2001/vxml"
                       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                         xsi:schemaLocation="http://www.w3.org/2001/vxml
                           http://www.w3.org/TR/voicexml20/vxml.xsd"
                            version="2.0">
                    <meta name="author" content="John Doe"/>
                    <meta name="maintainer" content="hello-support@hi.example.com"/>
                    <var name="hi" expr="'Hello World!'"/>
                    <form>
                     <block>
                        <value expr="hi"/> Goodbye!
                     </block>
                    </form>
                  </vxml>
            ????元素<vxml>有如下屬性:
            version 表示該文檔的VoiceXML的版本號(必須的),當前的版本號是2.0。
            xmlns 表示給VoiceXML指定的域名空間(必須的)VoiceXML的域名空間是http://www.w3.org/2001/vxml。
            xml:base 該文檔的基礎URI,文檔中所有的相對的URI引用都是相對于這個基礎URI的。
            xml:lang 表示該文檔的語言標識符,如果省略,默認的語言為平臺特定的語言。
            application 表示該文檔的應用根文檔的URI。
            表2:<vxml>元素的屬性
            ????在文檔級,語言信息可以通過繼承得到:那些有“xml:lang”屬性的元素可以繼承“xml:lang”的值,例如<grammar>和<prompt>元素,除非這些元素也指定了一個值。
            ?
            二、多文檔應用的執(zhí)行
            ????通常,每個文檔都是作為一個孤立的應用運行的。在某些情況下,你想要多個文檔作為一個應用一起運行,你可以選擇一個文檔作為應用根文檔(application root document),其他的作為應用葉文檔(application leaf document),每個葉文檔在它的<vxml>元素里指定根文檔。
            ????這樣的話,每次解釋器要加載執(zhí)行該應用的一個葉文檔時,如果應用根文檔還沒有加載,它會先加載應用根文檔。應用根文檔會一直被加載,直到解釋器加載另外一個應用的文檔。因此,解釋器在解釋的時候,下面兩個條件,必須滿足一個:
            ??????1、應用根文檔已經(jīng)加載,且用戶正在根文檔里執(zhí)行,沒有葉文檔被加載。
            ??????2、應用根文檔和一個葉文檔都被加載,且用戶在葉文檔里執(zhí)行。如果各個文檔里有定義了一些subdialog,此時可能不止加載一個葉文檔,但是只能在其中的一個文檔中執(zhí)行。
            ????當加載一個葉文檔時,雖然根文檔也被加載,但是根文檔中的對話不會被執(zhí)行,而是在葉文檔中執(zhí)行。
            ????多文檔應用有幾個好處:
            ??????1、葉文檔可以使用根文檔的變量,因此一些信息能夠共享,并保留下來;
            ??????2、根文檔的<property>元素可以給葉文檔要用的一些property指定默認值;
            ??????3、公有的ECMAScript代碼可以放在根文檔的<script>元素中,然后在葉文檔中使用;
            ??????4、根文檔中的<catch>元素可以為葉文檔指定默認的事件處理;
            ??????5、根文檔中作用域為document的語法在葉文檔中也是激活的,這樣用戶就可以和根文檔中的form、link和menu進行交互。
            ????下面是一個有兩個文檔的應用:
            ????應用根文檔(app-root.vxml):
                  <?xml version="1.0" encoding="UTF-8"?>
                  <vxml xmlns="http://www.w3.org/2001/vxml"
                       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                         xsi:schemaLocation="http://www.w3.org/2001/vxml
                           http://www.w3.org/TR/voicexml20/vxml.xsd"
                            version="2.0">
                    <var name="bye" expr="'Ciao'"/>
                    <link next="operator_xfer.vxml">
                      <grammar type="application/srgs+xml" root="root" version="1.0">
                        <rule id="root" scope="public">operator</rule>
                      </grammar>
                    </link>
                  </vxml>
            ????葉文檔(leaf.vxml):
                  <?xml version="1.0" encoding="UTF-8"?>
                  <vxml xmlns="http://www.w3.org/2001/vxml"
                       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                         xsi:schemaLocation="http://www.w3.org/2001/vxml
                           http://www.w3.org/TR/voicexml20/vxml.xsd"
                            version="2.0"  application="app-root.vxml">
                    <form id="say_goodbye">
                      <field name="answer">
                       <grammar type="application/srgs+xml" src="/grammars/boolean.grxml"/>
                        <prompt>Shall we say<value expr="application.bye"/>?</prompt>
                       <filled>
                        <if cond="answer">
                         <exit/>
                        </if>
                         <clear namelist="answer"/>
                       </filled>
                      </field>
                    </form>
                  </vxml>
            ????在這個例子中,該應用的入口文件是leaf.vxml,因此leaf.vxml先被加載,它的application屬性指定app-root.vxml為它的應用根文檔,因此接著會加載app-root.vxml。在app-root.vxml中定義了一個變量――bye和一個link,只要用戶說“operator”,那么控制就會跳轉到operator-xfer.vxml。用戶由名為say_goodbye的form開始人機交互。
                  C: Shall we say Ciao?
                  H: Si.
                  C: I did not understand what you said. (a platform-specific default message.) 
                  C: Shall we say Ciao?
                  H: Ciao
                  C: I did not understand what you said. 
                  H: Operator.
                  C: (Goes to operator_xfer.vxml, which transfers the caller to a human operator.) 
            ????注意,當用戶在多文檔的應用里,一次最多只有兩個文檔同時加載:應用根文檔和一個應用葉文檔,除非用戶正在和應用根文檔交互(此時只有一個文檔加載,即應用根文檔)。根文檔的元素不能再指定application屬性,而葉文檔一定要指定application屬性。在多文檔的情況下,應用根文檔總是被加載的,而應用葉文檔則不一定。
            ????應用根文檔的絕對URI就是解釋器當前的應用名(name of application)。如果有的話,該絕對URI可以包含一個查詢字符串,但是它不可以包含段標識符。只要應用名沒有變,解釋器就一直在同一個應用里。一旦應用名改變,解釋器就進入到一個新的應用里,并初始化新應用的根環(huán)境。應用根環(huán)境包括作用域為application的變量、語法、catch元素、script和property。
            ????在用戶會話期間,解釋器從一個文檔到另一個文檔的跳轉可以用<choice>、<goto>、<link>、<subdialog>和<submit>元素。有的跳轉是在某個應用內(nèi),有的是在兩個應用之間。根環(huán)境能否保存取決于跳轉的類型:
            ??????1、同一應用中根到葉的跳轉
            ??????當當前文檔為根文檔,且目標文檔的applocation屬性值和當前應用的絕對URI一樣,此時的跳轉即為同一應用中根到葉的跳轉。該應用根文檔和它的環(huán)境都在跳轉中保留下來。
            ??????2、同一應用中葉到葉的跳轉
            ??????當當前文檔為葉文檔,且目標文檔的application屬性值和當前應用的絕對URI一樣,此時的跳轉即為同一應用中葉到葉的跳轉,該應用根文檔和它的環(huán)境都在跳轉中保留下來。
            ??????3、同一應用中葉到根的跳轉
            ??????當當前文檔為葉文檔,且目標文檔的絕對URI和當前應用名一樣,此時的跳轉即為同一應用中葉到根的跳轉。如果是通過<choice>或<goto>或<link>跳轉的,該應用根文檔和它的環(huán)境都在跳轉中保留下來。如果是通過<submit>跳轉的,根環(huán)境會被重新初始化,因為使用<submit>元素總是會導致URI的獲取。
            ??????4、根到根的跳轉
            ??????當當前文檔為根文檔,且目標文檔也是根文檔,即目標文檔沒有指定application屬性,此時的跳轉就是根到根的跳轉。根環(huán)境和由緩存策略(caching policy)返回的應用根文檔一起被初始化。 即使目標應用名和當前應用名一樣,也可能會使用緩存策略。
            ??????5、子對話
            ??????當根文檔或葉文檔執(zhí)行<subdialog>元素,此時即為subdialog調(diào)用。正如2.3.4節(jié)所講的,subdialog調(diào)用時,創(chuàng)建了一個新的執(zhí)行環(huán)境。在subdialog執(zhí)行期間,應用根文檔和它的環(huán)境都被保存起來,但是它們在被調(diào)用文檔的執(zhí)行環(huán)境里是不可用的。Subdialog新的執(zhí)行環(huán)境有它自己的根環(huán)境,也許還有葉環(huán)境(leaf context)。當subdialog調(diào)用為一個非空的URI時,就可以用緩存策略來獲得根和葉文檔,以初始化新的根和葉環(huán)境。如果subdialog調(diào)用為一個空的URI,且為段標識符(例如“#sub1”),則根和葉文檔保持不變,因此當前的根和葉文檔會用來初始化新的根和葉環(huán)境。
            ??????6、應用之間的跳轉
            ??????兩個應用間的跳轉使得應用根環(huán)境和下一個應用的根文檔一起被初始化。
            ????如果某個文檔引用了一個不存在的應用根文檔,則拋出一個error.badfetch事件。如果某個文檔的application屬性引用的文檔也指定了application屬性,則拋出一個error.semantic事件。
            ????下面的圖表說明了根和葉文檔在應用根環(huán)境中跳轉的結果。在這個圖表中,方框表示文檔,方框內(nèi)紋理的變化表示根環(huán)境的初始化,實心箭頭表示跳轉到箭頭所指向的URI,豎向的虛線箭頭所指向的表示application屬性指定的URI。
            圖3: 保存根環(huán)境的的跳轉
            ????在這個圖中,所有的文檔都屬于同一應用。1、2、3、4表示跳轉的步驟:
            ??????1、跳轉經(jīng)由URI A到文檔1,應用環(huán)境被初始化。假設文檔1是這個會話的入口文件。當前的應用名為A。
            ??????2、文檔1指定了一個跳轉經(jīng)由URI B到文檔2。文檔2的application屬性值等于A。根文檔為文檔1,和它的環(huán)境一起被保存下來。這是在同一應用中,根到葉的跳轉。
            ??????3、文檔2指定了一個跳轉經(jīng)由URI C到另外一個葉文檔,即文檔3。文檔3的application屬性值也等于A。根文檔和它的環(huán)境一起被保存下來。這是在同一應用中,葉到葉的跳轉。
            ??????4、文檔3指定了一個跳轉經(jīng)由URI A到文檔1,它是通過來跳轉的。文檔1的根環(huán)境原封不動。這是在同一應用中。葉到根的跳轉。
            ????下面的圖說明了初始化根環(huán)境的跳轉。
            圖4: 初始化根環(huán)境的跳轉
            ??????5、文檔1指定了一個跳轉經(jīng)由URI A到文檔4。文檔4沒有指定它的application屬性,它自己就是根文檔,它的根環(huán)境被初始化。這是一個根到根的跳轉。
            ??????6、文檔4指定了一個跳轉經(jīng)由URI D到文檔5。文檔5的application屬性值為URI E和當前的應用名不一樣。解釋器進入到一個新的應用。URI E指向了文檔6。根環(huán)境根據(jù)文檔6的內(nèi)容來初始化。這就是應用之間的跳轉。
            ??????7、文檔5指定了一個跳轉經(jīng)由URI A。
            ?
            三、子對話
            ????subdialog是一種用來分解復雜的對話序列并改善他們的結構,或創(chuàng)建可重用組件的一種機制。例如帳戶信息請求可能包含了幾部分信息的收集,像帳戶號和家庭電話號碼。這樣的客戶管理服務可以由幾個應用組成 這些應用能夠共享基本的組件,因此用subdialog來構造這個服務就很合理。下面的例子說明了這一點。第一個文檔(app.vxml)用來調(diào)整用戶的帳號,因此,它必須得到帳戶的信息和要調(diào)整的級別。通過subdialog元素調(diào)用另一個VoiceXML文檔讓用戶輸入以獲得帳戶信息。當?shù)诙€文檔執(zhí)行的時候,第一個文檔的dialog被掛起,等待信息的返回。第二個文檔通過<return>元素返回用戶交互的結果,返回值可以通過<subdialog>元素的name屬性定義的變量獲得。
            ????用戶服務程序(app.vxml):
                  <?xml version="1.0" encoding="UTF-8"?>
                  <vxml xmlns="http://www.w3.org/2001/vxml"
                       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                         xsi:schemaLocation="http://www.w3.org/2001/vxml
                           http://www.w3.org/TR/voicexml20/vxml.xsd"
                            version="2.0">
                    <form id="billing_adjustment">
                      <var name="account_number"/>
                      <var name="home_phone"/>
                      <subdialog name="accountinfo" src="acct_info.vxml#basic">
                       <filled>
                         <!-- Note the variable defined by "accountinfo" is
                          returned as an ECMAScript object and it contain
                            two properties defined by the variables specified in the
                              "return" element of the subdialog. -->
                         <assign name="account_number" expr="accountinfo.acctnum"/>
                         <assign name="home_phone" expr="accountinfo.acctphone"/>
                       </filled>
                      </subdialog>
                     <field name="adjustment_amount">
                       <grammar type="application/srgs+xml" src="/grammars/currency.grxml"/>
                        <prompt>
                          What is the value of your account adjustment?
                        </prompt>
                        <filled>
                          <submit next="/cgi-bin/updateaccount"/>
                        </filled>
                       <field>
                     <form>
                  </vxml>
            ????包含帳戶信息的subdialog文檔(acct_info.vxml):
                  <?xml version="1.0" encoding="UTF-8"?>
                  <vxml xmlns="http://www.w3.org/2001/vxml"
                       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                         xsi:schemaLocation="http://www.w3.org/2001/vxml
                           http://www.w3.org/TR/voicexml20/vxml.xsd"
                            version="2.0">
                    <form id="basic">
                      <field name="acctnum">
                       <grammar type="application/srgs+xml" src="/grammars/digits.grxml"/>
                        <prompt>What is your account number?</prompt>
                       <filled>
                       <field name="acctphone">
                         <grammar type="application/srgs+xml" src="/grammars/phone_numbers.grxml"/>
                        <prompt>What is your home telephone number?</prompt>
                         <filled>
                           <!-- The values obtained by the two fields are supplied
                           to the calling dialog by the "return" element. -->
                         <return namelist="acctnum acctphone"/>
                        </filled>
                      </field>
                    </form>
                  </vxml>
            ????subdialog被調(diào)用的時候產(chǎn)生了一個新的執(zhí)行環(huán)境,subdialog既可以是現(xiàn)有文檔的一個新dialog,也可以是新文檔的一個新dialog。
            ????Subdialog可以由幾個文檔組成。圖5展示了一系列文檔(D)跳轉到subdialog(SD),并返回的執(zhí)行流程。
            圖5: subdialog由幾個文檔組成,并由最后一個subdialog返回
            ????當dialog D2調(diào)用文檔sd2.vxml中的subdialog SD1時,dialog D2的執(zhí)行環(huán)境被掛起,sd1指定執(zhí)行跳轉到sd2.vxml中的dialog(使用<goto>元素)。因此,當sd2.vxml中的dialog返回時,控制直接返回到dialog D2。
            ????圖6展示了一個多文檔的subdialog調(diào)用的例子,在這個例子中,控制由一個subdialog跳轉到另一個subdialog。
            圖6: 由幾個文檔組成的subdialog,并由第一個subdialog返回
            ????在sd1.vxml中的subdialog指定將控制跳轉到sd2.vxml的另一個subdialog,SD2。當執(zhí)行SD2時,總共有兩個環(huán)境被掛起:D2的dialog環(huán)境因等待SD1返回而掛起,SD1的dialog因等待SD2返回而掛起。當SD2返回時,控制也返回到SD1,SD1又把控制返回到dialog D2。
            ?
            四、后期處理
            ????在某些情況下(特別是當VoiceXML解釋器處理掛機事件時),解釋器可以繼續(xù)執(zhí)行,進入后期處理狀態(tài),即使解釋器和終端用戶之間的連接已經(jīng)中斷。后期處理的目的是讓VoiceXML應用去完成一些必要的后期的清理。例如提交信息到應用服務器。舉個例子來說,下面的<catch>元素將捕獲connection.disconnect.hangup事件,并進入后期處理狀態(tài)執(zhí)行。
                  <catch event="connection.disconnect.hangup">
                    <submit namelist="myExit" next="http://mysite/exit.jsp"/>
                  </catch>
            ????然而,在后期處理狀態(tài),應用必須保持跳轉狀態(tài),且不可以進入等待狀態(tài)(詳見4.1.8節(jié)),因此,在后期處理狀態(tài),應用不應該進入<field>或<record>或<transfer>。如果此時VoiceXML應用試圖進入等待狀態(tài),VoiceXML解釋器必須退出。
            ????除了上面的限制,VoiceXML應用的執(zhí)行可以在后期處理狀態(tài)正常繼續(xù)。例如,應用在后期處理狀態(tài)可在文檔之間跳轉,如果沒有任何符合條件的form item被選定的話(詳見2.1.1節(jié)),解釋器必須退出。

            (未完待續(xù))
            posted on 2006-09-16 15:58 鐵觀音 閱讀(2022) 評論(0)  編輯 收藏 引用 所屬分類: VoiceXML2.0規(guī)范
            2021久久精品免费观看| 三上悠亚久久精品| 久久午夜伦鲁片免费无码| 久久99热这里只有精品66| 久久久久女教师免费一区| 国产精品久久久久一区二区三区| 无码久久精品国产亚洲Av影片| 伊人久久大香线蕉精品不卡| 漂亮人妻被中出中文字幕久久| 久久久久久精品免费免费自慰| 亚洲午夜精品久久久久久app| 久久精品国产亚洲AV不卡| 亚洲精品无码专区久久久| 午夜天堂av天堂久久久| av国内精品久久久久影院| 99久久无码一区人妻| 性高朝久久久久久久久久| 国产成人久久精品一区二区三区| 亚洲精品乱码久久久久久久久久久久| 亚洲成色www久久网站夜月| 国内精品久久久久影院优| 麻豆精品久久精品色综合| 精品久久久久久无码人妻热 | 久久国产免费观看精品3| 国产成人精品免费久久久久| 国产一区二区精品久久凹凸| 亚洲国产精品成人AV无码久久综合影院 | 欧美性大战久久久久久| 久久精品中文字幕一区| 国产成人精品久久免费动漫 | 久久综合九色综合网站| 国产综合久久久久| 亚洲а∨天堂久久精品9966| 久久久久久亚洲AV无码专区| 久久精品国产国产精品四凭 | 国内精品久久人妻互换 | 偷偷做久久久久网站| 久久无码av三级| 伊人久久大香线蕉综合Av| 国产日韩久久免费影院| 久久久噜噜噜www成人网|