青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

鐵觀音

C++編程寶典

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

?

?
????這篇文檔詳細描述了VoiceXML,即語音擴展標記語言。第一章介紹它的背景、基本概念和用途;第二章介紹form的對話框結構(dialog constructs)、menu、link和它們的解釋機制FIA(Form Interpretation Algorithm);第三章介紹用戶的DTMF(Dual Tone Multi-Frequency)和語音輸入用到的語法;第四章介紹系統輸出用到的語音合成和預先錄制的音頻;第五章介紹對話框(Dialog)流程的控制,包括變量、事件和可執行元素;第六章介紹各種環境特性,例如參數(Parameter)、屬性(Property)和資源處理;附錄提供了包括VoiceXML計劃、FIA(Form Interpretation Algorithm)、音頻文件格式等附加信息。
????VoiceXML最早出現于1995年,作為一種基于XML對話的設計語言,它的出現是為了簡化AT&T一個名為PML(Phone Markup Language)項目中語音識別程序的開發過程。經過AT&T的重新組織,AT&T,Lucent and Motorola的開發團隊繼續致力于開發他們的類PML語言。
????1998年,W3C主辦了一次關于語音瀏覽器的會議。此時,AT&T and Lucent對于最開始的PML都有各自不同的發展,Motorola開發了VoXML,IBM正在開發它自己的SpeechML。此次會議的其他與會者也正在開發類似的語言,例如HP的TalkML和PipeBeach的VoiceHTML。
????于是AT&T、IBM、Lucent和Motorola共同組織了VoiceXML論壇,它的任務是定義一種標準的對話設計語言,使開發者可以用它來創建會話式的應用程序。他們選擇XML作為他們工作的基礎,因為他們很清楚,XML是技術發展的趨勢。
????在2000年,VoiceXML論壇發布了VoiceXML 1.0。此后不久,VoiceXML 1.0被提交給W3C(World Wide Web Consortium)作為一種新的國際標準。VoiceXML 2.0就是W3C的成員單位、其他的W3C工作組和公眾的共同努力的結果。
????熟悉VoiceXML1.0的開發者可直接到附錄,那里總結了VoiceXML2.0和VoiceXML1.0的差別。
?
第一節 介紹 ?
?
????VoiceXML是用來創建音頻對話的,主要包括語音合成、數字化音頻、語音識別、DTMF按鍵輸入識別、錄音、通話、混合主動式會話。它的主要作用是把基于網絡的開發和信息這兩者的優勢引入語音應答系統。
????這里有兩個簡短的例子,第一個例子是“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) 

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

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

第四節 VoiceXML元素 ?
?
元素 作用 章節
<assign> 給變量賦值。 5.3.2
<audio> 在prompt中播放一段音頻。 4.1.3
<block> 沒有人機交互的可執行代碼的容器。 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> 在輸入域被填充后執行一些操作。 2.4
<form> 用于給出信息和收集數據的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的作用域內的會話指定一個跳轉。 2.5
<log> 生成調試信息。 5.3.13
<menu> 提供可供選擇的跳轉。 2.2.1
<meta> 以name/value對的形式定義一個元數據項。 6.2.1
<metadata> 使用元數據方案定義元數據信息。 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>的參數。 6.4
<prompt> 產生一個輸出給用戶的語音合成和音頻的隊列。 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中調用另外一個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元素
?
第五節 文檔的結構和執行 ?
?
????VoiceXML文檔主要由一些叫做dialog的上層元素組成。VoiceXML有兩種對話:form和menu。文檔里還可以有<meta>、<metadata>、<var>、<script>、<property>、<catch>和<link>元素。
一、在一個文檔中執行
????文檔的執行由默認的第一個對話開始。每個對話在執行的時候,都會指定下一個對話,否則執行中止。
????下面舉個“Hello World”的例子來說明它。這個例子里由有一個文檔級的變量――hi,它的值為字符串“Hello World!”,是第一個form的提示信息。一旦第一個form播放了“Hello World”,控制會跳轉到下一個叫做“say_goodbye”的form,然后播放“Goodbye!”由于第二個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"/>
            <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>元素,除非這些元素也指定了一個值。
?
二、多文檔應用的執行
????通常,每個文檔都是作為一個孤立的應用運行的。在某些情況下,你想要多個文檔作為一個應用一起運行,你可以選擇一個文檔作為應用根文檔(application root document),其他的作為應用葉文檔(application leaf document),每個葉文檔在它的<vxml>元素里指定根文檔。
????這樣的話,每次解釋器要加載執行該應用的一個葉文檔時,如果應用根文檔還沒有加載,它會先加載應用根文檔。應用根文檔會一直被加載,直到解釋器加載另外一個應用的文檔。因此,解釋器在解釋的時候,下面兩個條件,必須滿足一個:
??????1、應用根文檔已經加載,且用戶正在根文檔里執行,沒有葉文檔被加載。
??????2、應用根文檔和一個葉文檔都被加載,且用戶在葉文檔里執行。如果各個文檔里有定義了一些subdialog,此時可能不止加載一個葉文檔,但是只能在其中的一個文檔中執行。
????當加載一個葉文檔時,雖然根文檔也被加載,但是根文檔中的對話不會被執行,而是在葉文檔中執行。
????多文檔應用有幾個好處:
??????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可以包含一個查詢字符串,但是它不可以包含段標識符。只要應用名沒有變,解釋器就一直在同一個應用里。一旦應用名改變,解釋器就進入到一個新的應用里,并初始化新應用的根環境。應用根環境包括作用域為application的變量、語法、catch元素、script和property。
????在用戶會話期間,解釋器從一個文檔到另一個文檔的跳轉可以用<choice>、<goto>、<link>、<subdialog>和<submit>元素。有的跳轉是在某個應用內,有的是在兩個應用之間。根環境能否保存取決于跳轉的類型:
??????1、同一應用中根到葉的跳轉
??????當當前文檔為根文檔,且目標文檔的applocation屬性值和當前應用的絕對URI一樣,此時的跳轉即為同一應用中根到葉的跳轉。該應用根文檔和它的環境都在跳轉中保留下來。
??????2、同一應用中葉到葉的跳轉
??????當當前文檔為葉文檔,且目標文檔的application屬性值和當前應用的絕對URI一樣,此時的跳轉即為同一應用中葉到葉的跳轉,該應用根文檔和它的環境都在跳轉中保留下來。
??????3、同一應用中葉到根的跳轉
??????當當前文檔為葉文檔,且目標文檔的絕對URI和當前應用名一樣,此時的跳轉即為同一應用中葉到根的跳轉。如果是通過<choice>或<goto>或<link>跳轉的,該應用根文檔和它的環境都在跳轉中保留下來。如果是通過<submit>跳轉的,根環境會被重新初始化,因為使用<submit>元素總是會導致URI的獲取。
??????4、根到根的跳轉
??????當當前文檔為根文檔,且目標文檔也是根文檔,即目標文檔沒有指定application屬性,此時的跳轉就是根到根的跳轉。根環境和由緩存策略(caching policy)返回的應用根文檔一起被初始化。 即使目標應用名和當前應用名一樣,也可能會使用緩存策略。
??????5、子對話
??????當根文檔或葉文檔執行<subdialog>元素,此時即為subdialog調用。正如2.3.4節所講的,subdialog調用時,創建了一個新的執行環境。在subdialog執行期間,應用根文檔和它的環境都被保存起來,但是它們在被調用文檔的執行環境里是不可用的。Subdialog新的執行環境有它自己的根環境,也許還有葉環境(leaf context)。當subdialog調用為一個非空的URI時,就可以用緩存策略來獲得根和葉文檔,以初始化新的根和葉環境。如果subdialog調用為一個空的URI,且為段標識符(例如“#sub1”),則根和葉文檔保持不變,因此當前的根和葉文檔會用來初始化新的根和葉環境。
??????6、應用之間的跳轉
??????兩個應用間的跳轉使得應用根環境和下一個應用的根文檔一起被初始化。
????如果某個文檔引用了一個不存在的應用根文檔,則拋出一個error.badfetch事件。如果某個文檔的application屬性引用的文檔也指定了application屬性,則拋出一個error.semantic事件。
????下面的圖表說明了根和葉文檔在應用根環境中跳轉的結果。在這個圖表中,方框表示文檔,方框內紋理的變化表示根環境的初始化,實心箭頭表示跳轉到箭頭所指向的URI,豎向的虛線箭頭所指向的表示application屬性指定的URI。
圖3: 保存根環境的的跳轉
????在這個圖中,所有的文檔都屬于同一應用。1、2、3、4表示跳轉的步驟:
??????1、跳轉經由URI A到文檔1,應用環境被初始化。假設文檔1是這個會話的入口文件。當前的應用名為A。
??????2、文檔1指定了一個跳轉經由URI B到文檔2。文檔2的application屬性值等于A。根文檔為文檔1,和它的環境一起被保存下來。這是在同一應用中,根到葉的跳轉。
??????3、文檔2指定了一個跳轉經由URI C到另外一個葉文檔,即文檔3。文檔3的application屬性值也等于A。根文檔和它的環境一起被保存下來。這是在同一應用中,葉到葉的跳轉。
??????4、文檔3指定了一個跳轉經由URI A到文檔1,它是通過來跳轉的。文檔1的根環境原封不動。這是在同一應用中。葉到根的跳轉。
????下面的圖說明了初始化根環境的跳轉。
圖4: 初始化根環境的跳轉
??????5、文檔1指定了一個跳轉經由URI A到文檔4。文檔4沒有指定它的application屬性,它自己就是根文檔,它的根環境被初始化。這是一個根到根的跳轉。
??????6、文檔4指定了一個跳轉經由URI D到文檔5。文檔5的application屬性值為URI E和當前的應用名不一樣。解釋器進入到一個新的應用。URI E指向了文檔6。根環境根據文檔6的內容來初始化。這就是應用之間的跳轉。
??????7、文檔5指定了一個跳轉經由URI A。
?
三、子對話
????subdialog是一種用來分解復雜的對話序列并改善他們的結構,或創建可重用組件的一種機制。例如帳戶信息請求可能包含了幾部分信息的收集,像帳戶號和家庭電話號碼。這樣的客戶管理服務可以由幾個應用組成 這些應用能夠共享基本的組件,因此用subdialog來構造這個服務就很合理。下面的例子說明了這一點。第一個文檔(app.vxml)用來調整用戶的帳號,因此,它必須得到帳戶的信息和要調整的級別。通過subdialog元素調用另一個VoiceXML文檔讓用戶輸入以獲得帳戶信息。當第二個文檔執行的時候,第一個文檔的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被調用的時候產生了一個新的執行環境,subdialog既可以是現有文檔的一個新dialog,也可以是新文檔的一個新dialog。
????Subdialog可以由幾個文檔組成。圖5展示了一系列文檔(D)跳轉到subdialog(SD),并返回的執行流程。
圖5: subdialog由幾個文檔組成,并由最后一個subdialog返回
????當dialog D2調用文檔sd2.vxml中的subdialog SD1時,dialog D2的執行環境被掛起,sd1指定執行跳轉到sd2.vxml中的dialog(使用<goto>元素)。因此,當sd2.vxml中的dialog返回時,控制直接返回到dialog D2。
????圖6展示了一個多文檔的subdialog調用的例子,在這個例子中,控制由一個subdialog跳轉到另一個subdialog。
圖6: 由幾個文檔組成的subdialog,并由第一個subdialog返回
????在sd1.vxml中的subdialog指定將控制跳轉到sd2.vxml的另一個subdialog,SD2。當執行SD2時,總共有兩個環境被掛起:D2的dialog環境因等待SD1返回而掛起,SD1的dialog因等待SD2返回而掛起。當SD2返回時,控制也返回到SD1,SD1又把控制返回到dialog D2。
?
四、后期處理
????在某些情況下(特別是當VoiceXML解釋器處理掛機事件時),解釋器可以繼續執行,進入后期處理狀態,即使解釋器和終端用戶之間的連接已經中斷。后期處理的目的是讓VoiceXML應用去完成一些必要的后期的清理。例如提交信息到應用服務器。舉個例子來說,下面的<catch>元素將捕獲connection.disconnect.hangup事件,并進入后期處理狀態執行。
      <catch event="connection.disconnect.hangup">
        <submit namelist="myExit" next="http://mysite/exit.jsp"/>
      </catch>
????然而,在后期處理狀態,應用必須保持跳轉狀態,且不可以進入等待狀態(詳見4.1.8節),因此,在后期處理狀態,應用不應該進入<field>或<record>或<transfer>。如果此時VoiceXML應用試圖進入等待狀態,VoiceXML解釋器必須退出。
????除了上面的限制,VoiceXML應用的執行可以在后期處理狀態正常繼續。例如,應用在后期處理狀態可在文檔之間跳轉,如果沒有任何符合條件的form item被選定的話(詳見2.1.1節),解釋器必須退出。

(未完待續)
posted on 2006-09-16 15:58 鐵觀音 閱讀(2053) 評論(0)  編輯 收藏 引用 所屬分類: VoiceXML2.0規范
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            西西裸体人体做爰大胆久久久 | 亚洲精品网址在线观看| 欧美日韩一区二区在线 | 国产日韩欧美a| 国产精品久99| 亚洲精品视频免费观看| 欧美激情91| 亚洲黄色视屏| 久久在线91| 欧美成年人视频网站| 欧美福利网址| 亚洲精品黄网在线观看| 一区二区精品| 欧美在线一级视频| 亚洲丶国产丶欧美一区二区三区| 久久综合综合久久综合| 欧美激情网站在线观看| 99re66热这里只有精品3直播 | 国产精品手机在线| 国模精品一区二区三区色天香| 最新国产乱人伦偷精品免费网站| 在线综合亚洲欧美在线视频| 久久精品动漫| 亚洲国产日韩在线一区模特| 亚洲午夜久久久久久久久电影院 | 亚洲久久一区| 欧美一区二区三区四区在线| 久久裸体艺术| 一本久道久久综合狠狠爱| 久久精品观看| 欧美视频中文字幕在线| 黄色小说综合网站| 亚洲一区二区在线观看视频| 暖暖成人免费视频| 亚洲欧美在线免费观看| 欧美精品国产精品日韩精品| 国内一区二区三区在线视频| 亚洲在线中文字幕| 欧美二区视频| 久久精品国产99精品国产亚洲性色 | 亚洲成人在线网站| 亚洲免费在线精品一区| 亚洲电影免费在线| 久久久久国产一区二区三区| 国产精品videosex极品| 日韩一级在线观看| 欧美国产免费| 亚洲成色777777在线观看影院| 日韩一级裸体免费视频| 老司机精品福利视频| 国产视频一区二区在线观看| 亚洲一区免费看| 亚洲乱码国产乱码精品精天堂| 亚洲精品永久免费| 久久久国产91| 国产精品免费福利| 91久久精品国产91久久| 久久亚洲综合色| 亚洲欧美国产va在线影院| 欧美日韩卡一卡二| 亚洲视频在线观看视频| 亚洲乱码一区二区| 欧美视频在线免费看| 亚洲在线观看视频| 亚洲永久在线| 国产日韩欧美制服另类| 久久国产精品亚洲77777| 午夜精品在线| 国产综合视频| 欧美成人资源网| 亚洲男女毛片无遮挡| 午夜久久影院| 国产精品一区毛片| 欧美在线不卡视频| 久久成人综合网| 激情视频一区二区三区| 免费在线播放第一区高清av| 久久美女性网| 亚洲精品中文字幕有码专区| 最新亚洲一区| 欧美激情二区三区| 中文精品视频一区二区在线观看| 在线一区二区三区做爰视频网站| 国产精品国产三级国产专播精品人 | 久久漫画官网| 老**午夜毛片一区二区三区| 亚洲国产专区校园欧美| 亚洲国产精品久久久久| 欧美日韩亚洲不卡| 久久久高清一区二区三区| 久久久久久自在自线| 日韩午夜在线播放| 亚洲欧美日韩网| 最新热久久免费视频| 亚洲天堂网在线观看| 激情综合在线| 亚洲视频观看| 91久久国产自产拍夜夜嗨| 欧美日韩国语| 亚洲精品一二三| 免费在线观看成人av| 欧美大秀在线观看| 午夜精品久久久| 久久国产欧美| 亚洲综合激情| 开心色5月久久精品| 亚洲一本视频| 久久人人爽人人爽爽久久| 夜夜爽www精品| 久久精品中文字幕一区| 午夜激情久久久| 欧美欧美全黄| 亚洲成人直播| 在线观看亚洲a| 亚洲欧美日本另类| 亚洲午夜小视频| 女人色偷偷aa久久天堂| 久久精品国产一区二区三区| 欧美日韩国产色视频| 欧美成人一区二区三区在线观看| 国产精品男女猛烈高潮激情| 亚洲三级观看| 最新成人在线| 久久视频在线视频| 久久久五月天| 国产永久精品大片wwwapp| 亚洲在线观看免费视频| 亚洲一区视频在线观看视频| 欧美极品色图| 亚洲第一毛片| 亚洲日本一区二区三区| 欧美α欧美αv大片| 欧美激情精品久久久久久久变态 | 国产精品欧美久久久久无广告| 亚洲激情偷拍| 亚洲精品日韩欧美| 牛夜精品久久久久久久99黑人 | 亚洲免费一在线| 国产精品成人免费精品自在线观看| 91久久国产综合久久蜜月精品| 亚洲精品国久久99热| 欧美电影免费观看网站| 最新国产乱人伦偷精品免费网站| 亚洲国产日韩美| 欧美激情精品久久久久| 亚洲日本成人在线观看| 一区二区三区四区五区精品视频 | 91久久精品一区二区三区| 久久久亚洲高清| 亚洲国产精品ⅴa在线观看| 日韩天堂在线视频| 欧美性片在线观看| 亚洲男同1069视频| 久久综合给合久久狠狠狠97色69| 激情六月婷婷综合| 欧美成人精品一区二区| 日韩视频不卡中文| 欧美与欧洲交xxxx免费观看| 韩国v欧美v日本v亚洲v| 亚洲一区在线免费| 欧美一区二区三区视频在线| 久久人人爽人人爽| 亚洲高清不卡一区| 欧美成人黑人xx视频免费观看| 亚洲人成网站777色婷婷| 亚洲一区二区三区精品动漫| 国产欧美日韩视频| 久久青草欧美一区二区三区| 亚洲黄色高清| 欧美一级电影久久| 亚洲国产视频一区| 国产精品视频久久| 老巨人导航500精品| 中日韩美女免费视频网址在线观看| 久久精品视频在线| 一本色道久久综合亚洲精品不卡| 国产美女诱惑一区二区| 牛牛国产精品| 午夜精品一区二区三区电影天堂| 欧美激情国产日韩精品一区18| 欧美一区二区三区久久精品| 亚洲人成亚洲人成在线观看| 国产精品一区二区你懂得| 欧美freesex8一10精品| 亚欧美中日韩视频| 日韩视频在线一区二区三区| 麻豆成人在线| 性色一区二区| 一区二区三区不卡视频在线观看 | 欧美日韩中文字幕精品| 久久久91精品国产| 亚洲专区一二三| 亚洲精品久久久久久久久久久| 久久久久久成人| 亚洲自拍偷拍麻豆| 亚洲靠逼com| 亚洲国产导航| 狠狠色狠色综合曰曰| 国产麻豆日韩欧美久久| 欧美网站在线|