第三節 Form Items
|
? |
? |
????form item就是一個<form>中的元素,該元素在form解釋期間可以被訪問。這些元素包括<field>、<block>、<initial>、<subdialog>、<object>、<record>和<transfer>元素。 |
|
????所有的form item都有下面的特點: |
|
??????·它們都有一個變量,由name屬性指定。該變量可以通過expr屬性獲得初始值。 |
|
??????·它們都有一個警戒條件,由cond指定。如果一個form item沒有被填充,且它的警戒條件沒有指定或值為true,則該form item可以被訪問。 |
|
????Form item可再細分為input item和control item,前者定義了該form的input item變量,后者用于幫助控制該form的input item的收集。Input item(<field>、<subdialog>、<object>、<record>和<transfer>)一般來說包含下面幾個元素: |
|
??????·<filled>元素,它包含了一些在相應的input item被填充后要執行的操作。 |
|
??????·<property>元素,用于指定作用于該input item(<initial>元素也可以包含<property>元素)的property。 |
|
??????·<prompt>元素,用于指定相應的元素被訪問時要播放的提示語。 |
|
??????·<grammar>元素,用于指定該input item(<subdialog>不能包含<grammar>元素)允許輸入的語音或DTMF按鍵。 |
|
??????·<catch>元素及它的一些簡寫形式,用于指定作用于該input item(<initial>元素不能包含<catch>元素)的事件處理。 |
|
????每個input item都有相應的一組影子變量。影子變量用于返回一個input item執行后的結果。而不是返回要存儲于name屬性的值。例如,在<field>的語法識別結果中有這次識別的confidence level(它是一個影子變量),獲得這個值對我們可能有很大的幫助。影子變量的引用可以使用如下這種形式:name$.shadowvar,name就是該input item的name屬性的值,shadowvar就是指定的影子變量名。影子變量是可寫的,它的值可以被應用更改。例如,<field>返回的影子變量,confidence。下面的例子展示了怎樣訪問這個影子變量。 |
|
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0" 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">
<form id="get_state">
<field name="state">
<prompt>Please say the name of a state. </prompt>
<grammar src="http://mygrammars.example.com/states.gram" type="application/srgs"/>
<filled>
<if cond="state$.confidence < 0.4">
<throw event="nomatch"/>
</if>
</filled>
</field>
</form>
</vxml>
|
|
????在這個例子中,識別結果的confidence要經過檢查,confidence值太低的結果不會被接受。 |
? |
一、FIELD |
|
????<field>是一個form item,用于收集用戶輸入,它的屬性有: |
name |
該form item的form item變量,它的作用域為dialog,它保存了識別的結果,在所在的form的form item中,該form item變量名必須是唯一的,如果該變量名不是唯一的,在獲取文檔時會拋出error.badfetch事件,該變量名必須符合變量的命名規則,詳見5.1節。 |
expr |
該form item變量的初始值,默認為ECMAScript 的undefined。如果給它一個初始值,該form item 將不會被訪問,除非它被清零。 |
cond |
一個表達式,當它的結果值為true時,該form item才被訪問。如果沒有指定該屬性值,也能被訪問。 |
type |
該<field>的類型,即內置語法類型的名稱(詳見附錄P)。平臺對內置語法類型的支持是可選的。如果不支持一個指定的內置語法類型,要拋出一個error.unsupported.builtin 事件。 |
slot |
語法槽名,用于存放變量(如果沒有指定,默認值為該變量名)。當所用的語法格式支持返回一組成對的槽/值(slot/value)的機制,且槽名與該form item變量名不同時,該屬性就很有用。 |
modal |
如果它的值為false(默認值),在該field的收集階段所有激活的語法都可以匹配;如果它的值為true,則只有該field的語法是允許匹配的,其它的都暫時失效。 |
|
表9:<field>元素的屬性 |
|
????下表是<field>元素的影子變量(shadow variables),該<field>的form item 變量名為name。影子變量utterance、 inputmode 和 interpretation的值必須和application.lastresult$ (詳見5.1.5節)中相應變量的值一樣。 |
name$.utterance |
被識別的詞的原始串。正確的標記和拼寫是依賴于平臺的(例如“five hundred thirty”或“5 hundred 30”或只是“530”)。如果是DTMF語法,該變量將包含匹配的數字串。 |
name$.inputmode |
用戶輸入的模式,值為dtmf或voice。 |
name$.interpretation |
一個ECMAscript變量,它包含了用戶輸入的語義解釋,詳見3.1.5。 |
name$.confidence |
該<field>的confidence級別,它的取值范圍為0.0-1.0,0.0表示最小的confidence,1.0表示最大的confidence。平臺可以用utterance的confidence (application.lastresult$.confidence的值)作為name$.confidence 的值 ,<field>和utterance 級別的confidence之間的差別是依賴于平臺的。 Confidence值更詳細的解釋是依賴于平臺的,因為它的計算方法很可能每個平臺不一樣。 |
|
表10:<field>元素的影子變量 |
? |
????<一>、使用顯式語法的<field> |
|
????顯示語法可以通過絕對的或相對的URI指定: |
|
<field name="flavor">
<prompt>What is your favorite ice cream?</prompt>
<grammar src="../grammars/ice_cream.grxml" type="application/srgs+xml"/>
</field>
|
|
????也可以指定一個聯機(inline)語法,下面的例子使用了W3C ABNF格式的語法。 |
|
<field name="flavor">
<prompt>What is your favorite flavor?</prompt>
<help>Say one of vanilla, chocolate, or strawberry.</help>
<grammar mode="voice" type="application/srgs">
#ABNF 1.0;
$options = vanilla | chocolate | strawberry
</grammar>
</field>
|
|
????如果同時指定<grammar>元素的src屬性和聯機語法,平臺會拋出error.badfetch事件。 |
? |
????<二>、使用依賴于平臺的內置的顯式語法 |
|
????平臺對內置資源的支持是可選的,如語音語法、DTMF語法和音頻文件。這些資源使用平臺特有的URI訪問,例如http://localhost:5000/grammar/boolean,或者使用平臺特有的方案(scheme),例如通常使用的“builtin”方案,“builtin:grammar/boolean”。如果平臺支持訪問內置資源,它應該支持訪問基本的內置語法(見附錄P)。例如: |
|
<grammar src="builtin:grammar/boolean"/>
<grammar src="builtin:dtmf/boolean"/>
|
|
????上面的例子中,第一個<grammar>引用了內置的boolean語音語法,第二個<grammar>引用了內置的boolean的DTMF語法。 |
|
????下面的<field>: |
|
<field type="sample">
<prompt>Prompt for builtin grammar</prompt>
</field>
|
|
????和下面這個使用平臺特有的內置語法的<field>,效果是一樣的。 |
|
<field>
<grammar src="builtin:grammar/sample"/>
<grammar src="builtin:dtmf/sample"/>
<prompt>Prompt for builtin grammar</prompt>
</field>
|
|
????sample是基本的內置<field>的type之一(如,boolean、date等)。 |
|
????另外,依賴于平臺的內置語法的URI可用來訪問特定解釋器環境支持的語法,我們建議平臺特有的內置語法以“x-”開頭命名,因為在將來的正式版本中不會使用該命名空間。如下: |
|
<grammar src="builtin:grammar/x-sample"/>
<grammar src="builtin:dtmf/x-sample"/>
|
? |
????<三>、使用<option>列表的<field> |
|
????當要為<field>指定一組簡單的可選項時,用<option>列表比用一個語法方便。<option>列表由包含于<field>元素中的一組<option>元素組成,每個<option>元素包含了用來產生語音語法的PCDATA,<option>的語法產生規則和2.2.5節中的<choice>一樣。<option>有一個屬性用于為每個<option>指定一個DTMF序列,還有一個屬性用于控制要賦給該<field>元素的form item變量的值。當一個<option>元素被選定時,它的屬性value的值決定了該<field>的影子變量和application.lastresult$的語義解釋值。 |
|
????下面的例子中的<field>元素給用戶提供了三個選項,把被選定的application.lastresult$元素的value屬性值賦給變量maincource: |
|
<field name="maincourse">
<prompt>
Please select an entree. Today, we are featuring <enumerate/>
</prompt>
<option dtmf="1" value="fish"> swordfish </option>
<option dtmf="2" value="beef"> roast beef </option>
<option dtmf="3" value="chicken"> frog legs </option>
<filled>
<submit next="/cgi-bin/maincourse.cgi" method="post" namelist="maincourse"/>
</filled>
</field>
|
|
????該例子可能的流程: |
|
C: Please select an entree. Today, we're featuring swordfish; roast beef; frog legs.
H: frog legs.
C: (assigns "chicken" to "maincourse", then submits "maincourse=chicken" to /maincourse.cgi)
|
|
????下面的例子展示了在一個form的<catch>元素中的<enumerate>元素的正確用法和錯誤用法,該form有幾個<field>元素包含有<option>元素。 |
|
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0" 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">
<form>
<block>
We need a few more details to complete your order.
</block>
<field name="color">
<prompt>Which color?</prompt>
<option>red</option>
<option>blue</option>
<option>green</option>
</field>
<field name="size">
<prompt>Which size?</prompt>
<option>small</option>
<option>medium</option>
<option>large</option>
</field>
<field name="quantity">
<grammar type="application/srgs+xml" src="/grammars/number.grxml"/>
<prompt>How many?</prompt>
</field>
<block>
Thank you. Your order is being processed.
<submit next="details.cgi" namelist="color size quantity"/>
</block>
<catch event="help nomatch">
Your options are <enumerate/>.
</catch>
</form>
</vxml>
|
|
????該例子可能的流程: |
|
C: We need a few more details to complete your order. Which color?
H: help. (throws "help" event caught by form-level <catch>)
C: Your options are red, blue, green.
H: red.
C: Which size?
H: H: 7 (throws "nomatch" event caught by form-level <catch>)
C: Your options are small, medium, large.
H: small.
|
|
????在上面的步驟,form級別的<catch>元素中的<enumerate>元素可以列舉一些內容:“color”和“size”<field>中的<option>元素。然而,下一個<field>就不一樣了: |
|
C: How many?
H: a lot. (throws "nomatch" event caught by form-level <catch>)
|
|
????Form級別的<catch>元素中使用<enumerate>,導致平臺拋出error.semantic事件。因為“quantity”<field>中沒有包含任何可以列舉的<option>元素。 |
|
????有一種辦法可以解決,就是在“quantity”<field>元素中加一個field級別的<catch>元素,如下: |
|
<catch event="help nomatch">
Please say the number of items to be ordered.
</catch
|
|
????這樣,“nomatch”事件被<field>中的<catch>捕獲,下面是一個可能的流程: |
|
C: Please say the number of items to be ordered.
H: 50.
C: Thank you. Your order is being processed.
|
|
????<enumerate>元素在2.2.4節中也有詳細描述。 |
|
????<option>元素的屬性有: |
dtmf |
該<option>元素的DTMF序列,它的作用等同于一個簡單的DTMF語法,和應用于該序列識別的DTMF<property>。它和DTMF語法不同的是,它的空格是不起作用的:dtmf=“123#”跟dtmf=“1 2 3 #”的效果是一樣的。 |
accept |
值為exact (默認)或approximate。當其值為exact時,語音識別時需完全匹配該元素定義的文本;當其值為approximate,語音識別只需大概匹配該元素定義的文本(詳見2.2.5節)。 |
value |
當用戶選擇該<option>時,賦給該<field>元素的form item變量的字符串,無論用戶是使用語音輸入還是DTMF按鍵輸入。默認是使用<option>元素的CDATA內容賦值,這些CDATA開頭和結尾的空格都被去掉了。如果<option>沒有內容,就用DTMF序列代替。 |
|
表11:<option>元素的屬性 |
|
????使用<option>元素不排除同時使用<grammar>元素,結果將是這兩個"語法"中的任一個的匹配。而在同一個<field>中同時出現兩個<grammar>元素則意味著選項的邏輯或,即兩個語法中只能匹配一個。 |
? |
二、BLOCK |
|
????<block>是form item,它包含的是可執行的內容,如果該<block>的form item 變量為undefined,且“cond”屬性(如果有的話)值為true,它就會被執行。 |
|
<block>
Welcome to Flamingo, your source for lawn ornaments.
</block
|
|
????當FIA進入<block>時,該<block>的form item 變量被自動的置為true。因此,每次的form調用中,<block>一般只被執行一次。 |
|
????有時候,你可以更多地控制<block>。你可以給該form item 變量命名,通過賦值或清零控制<block>的執行。該變量在該form的dialog作用域內被聲明。 |
|
????<block>的屬性有: |
name |
該form item變量名,它用來標記該<block>是否符合被執行的條件。默認為不可訪問的內部變量。 |
expr |
該form item變量的初始值,默認為ECMAScript 的undefined。如果給該form item變量一個初始值,該form item就不會被執行,除非它的form item變量被清零。 |
cond |
它是一個boolean表達式,用來判定該form item是否可以訪問。在會話之后,它的值必須為true。 |
|
表12:<choice>元素的屬性 |
? |
三、INITIAL |
|
????在一個典型的混合主動式的form中,當FIA播放最初的form信息給用戶時,就進入了<initial>元素,而不是進入計算機主導的模式,在計算機主導的模式中,每個field單獨地被訪問。和field item不同的是<initial>沒有任何語法,也沒有任何的<filled>操作。例如: |
|
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0" 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">
<form id="get_from_and_to_cities">
<grammar src="http://www.directions.example.com/grammars/from_to.grxml"
type="application/srgs+xml"/>
<block>
Welcome to the Driving Directions By Phone.
</block>
<initial name="bypass_init">
<prompt>
Where do you want to drive from and to?
</prompt>
<nomatch count="1">
Please say something like "from Atlanta Georgia to Toledo Ohio".
</nomatch>
<nomatch count="2">
I'm sorry, I still don't understand.
I'll ask you for information one piece at a time.
<assign name="bypass_init" expr="true"/>
<reprompt/>
</nomatch>
</initial>
<field name="from_city">
<grammar src="http://www.directions.example.com/grammars/city.grxml"
type="application/srgs+xml"/>
<prompt>From which city are you leaving?</prompt>
</field>
<field name="to_city">
<grammar src="http://www.directions.example.com/grammars/city.grxml"
type="application/srgs+xml"/>
<prompt>Which city are you going to?</prompt>
</field>
</form>
</vxml>
|
|
????如果在訪問<initial>時拋出一個事件,則執行相應的事件處理。和其他的form item一樣,如果<initial>的form item變量為undefined,且它的cond屬性為true,它還是可以再次被訪問的。如果用戶的輸入填充了一個或多個field item變量,則在任何一個<filled>操作被執行前,所有的<initial>form item變量都被置為true。 |
|
????<initial>form item變量可以顯式地被禁用,或重新被FIA訪問。例如,在上面的例子中,<initial>的form item變量在第二個nomatch事件中被置為true,這樣,FIA就不再處理<initial>元素,而去選定下一個form item,即一個<field>,它提示用戶輸入起點城市;同樣的,<initial>元素的form item變量也可以被清零,這樣,FIA就可以再次選定該<initial>元素。 |
|
????在同一個form中可以有多個<initial>元素。只有cond屬性為true且在文檔中的順序最靠前的一個<initial>元素會被訪問。當該<initial>元素的form item變量被填充,該form 所有的<initial>元素都被置為true,因此FIA不會訪問其他的<initial>元素。顯式的重置一個或多個<initial>元素,可以使它們再次變為可用,甚至允許FIA在下一次的循環中選定另一個<initial>元素。 |
|
????在FIA的一次循環中,<initial>元素的cond屬性也可用來決定哪一個<initial>元素要被選定。一個應用可提供多個<initial>元素,但是用cond屬性限定它們只能在特定的環境下才可用。例如,用cond屬性來判斷使初級還是高級操作模式,且只有在高級操作模式中使用元素。此外,如果在文檔順序中第一個<initial>元素的cond屬性被指定了一個值,該值永遠都不會實現,則該<initial>元素也永遠不會被執行。如果每個<initial>元素的cond屬性都有一個使它們不會被選定的值,則哪一個<initial>元素都不會被執行。 |
|
????在訪問<initial>元素時,一般的語法作用域規則也會起作用,詳見3.1.3節。特別地,作用域為<field>元素內的語法都不會被激活。 |
|
????注意,顯式的給一個input item變量賦值,不會影響到<initial>元素的form item變量的值。 |
|
????<initial>元素的屬性: |
name |
該form item變量的名稱,用于檢測該<initial>元素是否為可選定的。默認為一個不可訪問的內部變量。 |
expr |
該form item變量的初始值。默認為ECMAScript的undefined。如果賦一個初始值給它,該form item將不會被訪問,除非該form item變量被清零。 |
cond |
ECMAScript表達式。只有當其結果值為boolean true,該代碼塊才被執行,否則不被執行。缺省時為 true。 |
|
表13:<initial>元素的屬性 |
? |
四、SUBDIALOG |
|
????subdialog提供了重用相同的dialog和建立可重用應用庫的一種機制。 |
|
????在調用的dialog中的<subdialog>元素通過它的屬性src或srcexpr調用了被調用的dialog(即subdialog)。Subdialog在一個新的執行環境中執行,該執行環境包括了該subdialog中所有的聲明和狀態信息,它的文檔,應用根文檔(如果有的話),計數器重置和變量初始化。當執行了一個<return>元素或<exit>元素,或再沒有任何符合條件的form item可供FIA選定時,subdialog返回。<return>元素使控制和數據返回到調用的dialog(見5.3.10節)。當subdialog返回時,它的執行環境被刪除,且調用dialog中的執行恢復。 |
|
????<subdialog>元素所在的dialog和被調用的dialog的環境時互相獨立的,即使這兩個dialog是在同一個文檔中。在被調用的dialog中是不能訪問調用dialog的作用域鏈中的變量的。在兩個執行環境中沒有任何共享的變量實例。即使調用dialog和被調用dialog在同一個文檔中,它們的執行環境包含的也是不同的變量實例。當調用dialog和被調用dialog在不同的文檔中,但它們的根文檔是同一個時,subdialog中的根變量同樣是不同的變量實例。當subdialog返回時,所有應用于subdialog環境的變量綁定都丟失了。 |
|
????然而,在subdialog的環境中,一般的語法、事件和變量的作用域規則也適用。激活的語法包括在該subdialog的文檔和應用根文檔中的<link>,<menu>和<form>元素的適當的語法,和解釋器環境定義的默認語法。同樣的,事件處理和變量綁定也是根據標準的作用域層次進行的。 |
|
????從編程的角度看,subdialog的工作機制和子程序的工作機制是不一樣的,因為它的調用和被調用的環境是相互獨立的,subdialog不能訪問調用它的dialog中的變量實例,而子程序取可以訪問調用程序中的變量實例。類似的,subdialog在語言上不遵循事件滲透模式(event percolation model),而在java語言中,如果在某個方法中拋出事件,且該被調用的環境沒有處理該事件,則該事件會自動的滲透到調用的環境中。在subdialog中拋出的事件交由subdialog中的事件處理取處理。這些事件處理要返回到調用的環境中只有通過顯式的返回該事件。 |
|
????<subdialog>元素的src或srcexpr屬性指定了要調用的subdialog的URI(見RFC2396)。如果該URI是一個絕對或相對的URI,該URI可以包含一個查詢串,則獲取該URI并在目標文檔中尋找該subdialog。如果<subdialog>元素指定了namelist屬性,則該屬性中的變量被加入到該URI的查詢串中。 |
|
????如果該URI只包含一個段,且沒有指定namelist屬性,則不獲取任何URI,并在當前文檔中尋找要調用的subdialog。 |
|
????如果URI中有包含一個段,則該段指定了要調用的subdialog,如果沒有包含段,則以目標文檔的第一個dialog為要調用的subdialog。 |
|
????如果該URI是非法的(即它指定的diaog或文檔不存在),必須拋出一個error.badfetch事件。注意,對于那些在dialog或文檔跳轉中出現的錯誤,在什么范圍內處理是依賴于平臺的。 |
|
????<subdialog>元素的屬性有: |
name |
存放subdialog返回值的變量,他是一個ECMAScript Object,該對象的屬性就是<return>元素的namelist屬性中的變量名。 |
expr |
該form item變量的初始值,它默認為ECMAScript的undefined。如果給它賦一個初始值,則該form item就不會被訪問,除非該form item變量被清零。 |
cond |
ECMAScript表達式。只有當其結果值為boolean true,該元素才被執行,否則不被執行。缺省時為true。 |
namelist |
要提交的變量名列表,默認是提交0個變量。如果指定了該屬性,它可以包含多個變量,以空格隔開。在VoiceXML和ECMAScript中聲明的變量都可以被提交。 |
src |
要調用的subdialog的URI。 |
srcexpr |
ECMAScript表達式,它的結果值為要調用的subdialog的URI。 |
method |
見5.3.8節。 |
enctype |
見5.3.8節。 |
fetchaudio |
見6.1節。它默認為<property>的fetchaudio的值。 |
fetchhint |
見6.1節。它默認為<property>的documentfetchhint的值。 |
fetchtimeout |
見6.1節。它默認為<property>的fetchtimeout的值。 |
maxage |
見6.1節。它默認為<property>的documentmaxage的值。 |
maxstale |
見6.1節。它默認為<property>的documentmaxstale的值。 |
|
表14:<subdialog>元素的屬性 |
|
????必須正確的指定屬性src和srcexpr中的一個,否則,要拋出一個error.badfetch事件。 |
|
????<subdialog>元素不但可以包含所有form item可包含的元素,還可以包含<param>元素。<subdialog>元素的<param>元素指定了要傳給subdialog的參數,這些參數必須在subdialog中用<var>元素聲明。試圖用<param>元素給一個form item變量或未聲明的變量賦值,會產生一個語義錯誤。當subdialog初始化時,它的變量按照文檔順序被依次初始化為<param>元素中相應的變量的值。在<param>元素的環境中,通過對它的屬性expr求值來得到參數值。在這種情況下,<var>元素的expr屬性被忽略。如果<var>元素聲明的變量沒有相應的<param>元素配對時,則它的expr屬性值被作為該變量的默認值,或者該變量為undefined(如果該<var>元素沒有指定expr屬性)。 |
|
????在下面的例子中,個人的生日用于驗證他們的駕駛執照。<subdialog>元素的src指定了同一個文檔中的另一個dialog作為subdialog,<param>元素用于傳遞生日給subdialog: |
|
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0" 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">
<!-- form dialog that calls a subdialog -->
<form>
<subdialog name="result" src="#getdriverslicense">
<param name="birthday" expr="'2000-02-10'"/>.
<filled>
<submit next="http://myservice.example.com/cgi-bin/process"/>
</filled>
</subdialog>
</form>
<!-- subdialog to get drivers license -->
<form id="getdriverslicense">
<var name="birthday"/>
<field name="drivelicense">
<grammar src="http://grammarlib/drivegrammar.grxml"
type="application/srgs+xml"/>
<prompt> Please say your drivers license number. </prompt>
<filled>
<if cond="validdrivelicense(drivelicense,birthday)">
<var name="status" expr="true"/>
<else/>
<var name="status" expr="false"/>
</if>
<return namelist="drivelicense status"/>
</filled>
</field>
</form>
</vxml>
|
|
????該例子返回了駕駛執照的值和用于表明執照是否非法的狀態變量給調用的dialog。 |
|
????該例子說明了使用<param>元素傳遞數據給subdialog的方便性,而不需要使用服務器端的腳本編程。下面這個例子使用了服務器端的腳本編程,它的效果和上面的例子是一樣的: |
|
????調用一個subdialog的form的文檔 |
|
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0" 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">
<form>
<field name="birthday">
<grammar type="application/srgs+xml" src="/grammars/date.grxml"/>.
What is your birthday?
</filled>
<subdialog name="result" src="/cgi-bin/getlib#getdriverslicense" namelist="birthday">
<filled>
<submit next="http://myservice.example.com/cgi-bin/process"/>
</filled>
</subdialog>
</form>
</vxml>
|
|
????包含subdialog的文檔(由/cgi-bin/getlib產生) |
|
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0" 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">
<form id="getdriverslicense">
<var name="birthday" expr="'1980-02-10'"/>
<!-- Generated by server script -->.
<field name="drivelicense">
<grammar src="http://grammarlib/drivegrammar.grxml"
type="application/srgs+xml"/>
<prompt>
Please say your drivers license number.
</prompt>
<filled>
<if cond="validdrivelicense(drivelicense,birthday)">
<var name="status" expr="true"/>
<else/>
<var name="status" expr="false"/>
</if>
<return namelist="drivelicense status"/>
</filled>
</field>
</form>
</vxml>
|
|
????在上面的例子中,一段服務器端腳本執行后產生了該文檔,并把生日嵌入到代文檔中。 |
|
????下面的例子的作用是使用一個subdialog收集信用卡信息,該subdialog在一個單獨的文檔中。它可在不同的應用中重用。它返回了狀態、信用卡號和過期時間。如果得不到結果,返回狀態值為“no_result”: |
|
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0" 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">
<!-- Example of subdialog to collect credit card information. -->
<!-- file is at http://www.somedomain.example.com/ccn.vxml -->
<form id="getcredit">
<var name="status" expr="'no_result'"/>
<field name="creditcardnum">
<prompt>What is your credit card number?</prompt>.
<help>.
I am trying to collect your credit card information.
<reprompt/>
</help>
<nomatch>
<return namelist="status"/>
</nomatch>
<grammar src="ccn.grxml" type="application/srgs+xml"/>
</field>
<field name="expirydate">
<grammar type="application/srgs+xml" src="/grammars/date.grxml"/>
<prompt>What is the expiry date of this card?</prompt>
<help>
I am trying to collect the expiry date of the credit card number you provided.
<reprompt/>
</help>
<nomatch>
<return namelist="status"/>
</nomatch>
</field>
<block>
<assign name="status" expr="'result'"/>
<return namelist="status creditcardnum expirydate"/>
</block>
</form>
</vxml>
|
|
????下面是一個應用,它包含有一個調用dialog。該應用通過混合主動式dialog獲得軟件名和操作系統名,然戶調用subdialog要求用戶輸入信用卡信息: |
|
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0" 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">
<!-- Example main program -->
<!-- http://www.somedomain.example.com/main.vxml -->
<!-- calls subdialog ccn.vxml -->
<!-- assume this gets defined by some dialog -->
<var name="username"/>
<form id="buysoftware">
<var name="ccn"/>
<var name="exp"/>
<grammar src="buysoftware.grxml" type="application/srgs+xml"/>.
<initial name="start">.
<prompt>
Please tell us the software product you wish to buy
and the operating system on which it must run.
</prompt>
<noinput>
<assign name="start" expr="true"/>
</noinput>
</initial>
<field name="product">
<prompt>Which software product would you like to buy?</prompt>
</field>
<field name="operatingsystem">
<prompt>Which operating system does this software need to run on?</prompt>
</field>
<subdialog name="cc_results" src="http://somedomain.example.com/ccn.vxml">
<filled>
<if cond="cc_results.status=='no_result'">
Sorry, your credit card information could not be
Obtained. This order is cancelled.
<exit/>
<else/>
<assign name="ccn" expr="cc_results.creditcardnum"/>
<assign name="exp" expr="cc_results.expirydate"/>
</if>
</filled>
</subdialog>
<block>
We will now process your order. Please hold.
<submit next="www.somedomain.example.com/process_order.asp"
namelist="username product operatingsystem ccn exp"/>
</block>
</form>
</vxml>
|
? |
五、OBJECT |
|
????在VoiceXML應用程序中通過<object>元素,VoiceXML的執行平臺可以擴展依賴于平臺的一些功能。在初始化和執行期間,<object>元素直接使用他自己的內容(例如它的<param>子元素)。因此,不能認為<object>元素的內容是可有可無的。注意,和其他的field item一樣,<object>元素也有<prompt>元素和<catch>元素,它也可以有<filled>操作。 |
|
????例如,能像上面的例子一樣訪問一個依賴于平臺的用來收集信用卡信息的object。 |
|
<object name="debit" classid="method://credit_card/gather_and_debit"
data="http://www.recordings.example.com/prompts/credit/jesse.jar">
<param name="amount" expr="document.amt"/>
<param name="vendor" expr="vendor_num"/>
</object>
|
|
????在這個例子中,當object被調用時,<param>元素用于傳遞參數。<object>元素執行后返回一個ECMAScript Object作為該fom item變量的值。下面的例子中的<block>元素引用了object返回的值。 |
|
<block>
<prompt>
The card type is <value expr="debit.card"/>.
</prompt>
<prompt>
The card number is <value expr="debit.card_no"/>.
</prompt>
<prompt>
The expiration date is <value expr="debit.expiry_date"/>.
</prompt>
<prompt>
The approval code is <value expr="debit.approval_code"/>.
</prompt>
<prompt>
The confirmation number is <value expr="debit.conf_no"/>.
</prompt>
</block>
|
|
????在下面這個例子中,假設平臺有一個object,該object可以讓用戶通過電話鍵盤輸入任意的文本信息。 |
|
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0" 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">
<form id="gather_pager_message">
<object name="message" classid="builtin://keypad_text_input">
<prompt>
Enter your message by pressing your keypad once
per letter. For a space, enter star. To end the
message, press the pound sign.
</prompt>
</object>
<block>
<assign name="document.pager_message" expr="message.text"/>
<goto next="#confirm_pager_message"/>
</block>
</form>
</vxml>
|
|
????用戶首先聽到一些提示語,然后按鍵輸入信息。在<block>元素中把用戶輸入的信息賦給變量document.pager_message。 |
|
????<object>元素的屬性: |
name |
當該<object>元素執行時,該form item變量被置為一個ECMAScript object類型的值。 |
expr |
該form item變量的初始值,默認為ECMAScript的undefined。如果它的值不為ECMAScript的undefined,則它將不會被訪問,除非該form item變量被清零。 |
cond |
ECMAScript 表達式。只有當其結果值為boolean true,該form item塊才被執行,否則不被訪問。缺省時為true。 |
classid |
一個URI,它指定了要執行的object的位置。該URI的拼寫規則是依賴于平臺的。 |
codebase |
基路徑,用于解析classid、data和archive屬性指定的相對URI。它默認為當前文檔的基礎URI。 |
codetype |
下載classid指定的object時期望的數據類型。如果沒有指定,默認為屬性type的值。 |
data |
指定object數據的位置的URI。如果它是一個相對的URI,則以codebase屬性指定的值為基路徑。 |
type |
Data屬性指定的數據的類型。 |
archive |
一組和該object有關的檔案的URI,由空格隔開。這些檔案包含了classid和data屬性指定的數據。如果這些URI是一個相對的URI,則以codebase屬性指定的值為基路徑。 |
fetchhint |
見6.1節。它默認為<property>的documentfetchhint的值。 |
fetchtimeout |
見6.1節。它默認為<property>的fetchtimeout的值。 |
maxage |
見6.1節。它默認為<property>的documentmaxage的值。 |
maxstale |
見6.1節。它默認為<property>的documentmaxstale的值。 |
|
表15:<object>元素的屬性 |
|
????沒有必要提供依賴于平臺的object,如果基于特定平臺的object不支持,將拋出error.unsupported.objectname事件。如果做到了這一點,就可以認為是支持<object>元素了。 |
|
????Object自己負責檢查它收到的參數名或參數值是否非法。如果是非法的話,<object>元素拋出一個錯誤。該錯誤可以是依賴于object的,也可以是5.2.6節中列出的標準錯誤之一。 |
? |
六、RECORD |
|
????<record>元素是一個input item,用于收集用戶的錄音。該input item變量保存了錄制的音頻的引用。它能被播放(使用<audio>元素的expr屬性)或者提交給服務器,如下面的例子: |
|
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0" 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">
<form>
<property name="bargein" value="true"/>
<block>
<prompt>
Riley is not available to take your call.
</prompt>
</block>
<record name="msg" beep="true" maxtime="10s" finalsilence="4000m
dtmfterm="true" type="audio/x-wav">
<prompt timeout="5s">
Record a message after the beep.
</prompt>
<noinput>
I didn't hear anything, please try again.
</noinput>
</record>
<field name="confirm">
<grammar type="application/srgs+xml" src="/grammars/boolean.grxml"/>
<prompt>
Your message is <audio expr="msg"/>.
</prompt>
<prompt>
To keep it, say yes. To discard it, say no.
</prompt>
<filled>
<if cond="confirm">
<submit next="save_message.pl" enctype="multipart/form-data"
method="post" namelist="msg"/>
</if>
<clear/>
</filled>
</field>
</form>
</vxml>
|
|
????它先給用戶播放<record>元素的提示語,然后進行錄音。如果遇到如下的情況之一,就會終止錄音:達到final silence的條件,或者有DTMF按鍵輸入,或者達到最大的錄音時間,或者用戶掛機。該錄音被回放,如果用戶滿意,就用HTTP POST方法把它提交給服務器存儲。注意:和其他的input item一樣,<record>元素也有<grammar>、<prompt>和<catch>元素。它也可以有<filled>操作。 |
|
|
圖7: 提示語、音頻錄制和DTMF輸入的時間選擇 |
|
????當用戶在錄音時掛機,錄音終止并拋出connection.disconnect.hangup事件。然而,在用戶掛機之前所錄下來的音頻還是可用的,可通過<record>元素的form item變量引用。即使,在掛機之后,應用程序,例如下面這個簡單的語音郵件服務,還是能把該音頻數據返回給服務器: |
|
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0" 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">
<form>
<record name="msg" beep="true" maxtime="10s" finalsilence="4000ms"
dtmfterm="true" type="audio/x-wav">
<prompt timeout="5s">
Record a message after the beep.
</prompt>
<noinput>
I didn't hear anything, please try again.
</noinput>
<catch event="connection.disconnect.hangup">
<submit next="./voicemail_server.asp"/>
</catch>
</record>
</form>
</vxml>
|
|
????在播放完所有的提示語之后(如果有定義“beep”聲的話,也包括“beep”聲),錄音開始。作為一種優化,平臺可以在用戶開始說話的同時開始錄音。 |
|
????Timeout時間間隔在開始播放提示語時即生效,它的持續時間由timeout property決定。如果在開始錄音之前就已經超過了timeout的時間間隔,則拋出noinput事件。 |
|
????Maxtime時間間隔在開始錄音時生效,它的持續時間取決于該form item的maxtime屬性。如果在錄音結束之前就超過maxtime時間間隔,則錄音終止,且該form item的maxtime影子變量被置為true。 |
|
????當拋出一個事件,或者有DTMF(語音)輸入匹配了一個激活的語法,或者超過了maxtime時間間隔,錄音終止。最為一個最佳的選擇,平臺可以在達到一個靜音的時間間隔(由finalsilence屬性設置)后終止錄音,該靜音的時間間隔表示用戶已經停止輸入了。 |
|
????如果在執行<record>元素時,沒有收集到任何音頻,則該form item變量保持unfilled。例如,當在播放提示語的時候接收到DTMF或語音輸入,或達到timeout時間間隔(如果在播放提示語的時候,開發者想要一個輸入來初始化錄音,則<prompt>元素應緊接著放在<field>元素之后,且該<prompt>元素的timeout屬性值為0),就會出現這種情況。 |
|
????<record>元素包含了dtmfterm屬性,當它的值為true時,它的作用等同于定義了一個本地的DTMF語法,該語法匹配了所有的DTMF輸入。 |
|
????任何DTMF按鍵匹配了一個激活的語法就會終止錄音。DTMF按鍵沒有匹配一個激活的語法就會被忽略(因此不會終止錄音,也就是不會影響到錄音)且它的信號可以被平臺清除掉(可選的)。 |
|
????平臺在錄音的時候支持語音語法,這是可選的。如果平臺在錄音的同時支持語音識別,則錄音會被匹配一個激活的語音語法的語音輸入終止。終止錄音的語音輸入可通過application.lastresult$和該item的utterance和confidence影子變量訪問。用于識別終止錄音的語音輸入的音頻是不可用的,且它不是錄音的一部分。 |
|
????如果終止錄音時匹配的語法(DTMF或語音)是一個本地語法,該錄音存放在該form item變量中,否則該form item變量為unfilled且返回到FIA。無論是哪一種情況,application.lastresult$和該form item的影子變量都會被賦值。 |
|
????注意:在這種情況下雖然該form item變量沒有被錄音所填充,然而匹配一個非本地的語法可以導致給該form item變量賦某種值(詳見3.1.6節)。 |
|
????<record>元素的屬性有: |
name |
該input item變量保存了所錄制的音頻。注意,各個平臺實現該變量的方式可以是不同的(雖然該技術說明書中要求所有的平臺都必須在<audio>元素和<submit>元素中支持該變量的行為)值。 |
expr |
該form item變量的初始值,它默認為ECMAScript的undefined 。如果給它賦一個初始值,則該form item就不會被訪問,除非該form item變量被清零。 |
cond |
ECMAScript表達式。只有當其結果值為boolean true,該元素才被執行,否則不被執行。缺省時為 true。 |
modal |
如果該屬性值為true(默認值),在錄音時,所有非本地的語音和DTMF語法都會失效。若為false,則是激活的。 |
beep |
當為true時,錄音前有“嘟”音提示。缺省值為 false。 |
maxtime |
最長錄音時間。它是一個Time Designation (見6.5節)。默認為一個依賴于平臺的值。 |
finalsilence |
表示錄音結束的靜音輸入時間。它是一個Time Designation (見6.5節)。默認為一個依賴于平臺的值。 |
dtmfterm |
如果該屬性值為true,任何沒有匹配一個激活語法的DTMF按鍵被認為匹配了一個激活的(anonymous)本地DTMF語法。默認值為true。 |
type |
表示所錄制的音頻的媒體格式。平臺必須支持附錄E中指定的聲音文件格式(也可以支持其他的格式)。默認為一個平臺指定的格式,該格式應該是不許支持的格式之一。 |
|
表16:<record>元素的屬性 |
|
????在錄音之后,<record>元素的影子變量也被賦值: |
|
????下表是<field>元素的影子變量(shadow variables),該<field>的form item 變量名為name。影子變量utterance、 inputmode 和 interpretation的值必須和application.lastresult$ (詳見5.1.5節)中相應變量的值一樣。 |
name$.duration |
錄音的持續時間,單位為毫秒。 |
name$.size |
錄音的大小,單位為byte。 |
name$.termchar |
如果該form item的dtmfterm屬性值為true,且用戶通過DTMF按鍵終止錄音,則該影子變量的值為用戶的按鍵(例如“#”),否則它的值為undefined。 |
name$.maxtime |
如果是因為達到最大錄音時間而終止錄音,則該變量值為true,否則為false。 |
name$.utterance |
如果是因為用戶在錄音時的語音輸入匹配了一個語法而終止了錄音,則該變量值為被匹配的字符串,否則它的值為undefined。 |
name$.confidence |
當用戶在錄音時的語音輸入匹配了一個語法而終止了錄音,該變量值為被匹配的字符串的confidence級別(0.0-1.0)否則值為undefined。 |
|
表17:<record>元素的影子變量 |
? |
七、TRANSFER |
|
????<transfer>元素引導VoiceXML解釋器將主叫方連接到諸如電話、或其它語音應用程序。在轉接過程中,當前的解釋器進程處于等待狀態。 |
|
????有各種轉接方式,如:“bridge”、“blind”。還有基于網絡的轉接,如“switchhook transfer”。在VoiceXML解釋器中,只支持Bridge和Blind兩種方式的轉接類型。其它的依賴于指定的平臺和網絡特性,以及配置,這些內容超出了本規范的范圍。 |
|
????<Transfer>元素是可選的。支持<Transfer>的平臺應支持Bridge和Blind兩種Transfer類型。支持Bridge transfer的平臺在轉接通話過程中,對DTMF接收和語音識別的支持是可選的。 |
|
????<Transfer>元素的屬性: |
name |
在bridge方式下,保存轉接通話完成后的結果值。在blind方式下,這個變量的值是undefined。 |
expr |
Form item的初始值。缺省是ECMAScript undefined。如果初始化到一個值,這個元素將不被訪問。只有當這個Item的值被清除后才能被訪問。 |
cond |
這是一個表達式,只有當它是true時,這個才form item可以被訪問。 |
dest |
目標的URI地址(如:電話、IP電話地址)。VoiceXML平臺必須支持tel:URL語法格式(這種語法格式在[RFC2806]中描述),也可以支持其它基于URI地址格式。 |
destexpr |
ECMAScript表達式,它生成URI地址。 |
bridge |
決定平臺在<transfer>執行后,是否依然監控主叫方和被叫方。
true | Bridge transfer:VoiceXML解釋器一直處于等待狀態,直到Transfer從轉接通話狀態下退出。如果因為掛機或網絡的原因而線路中斷,會拋出一個Connection.disconnect.hangup事件。如果通話因為其它原因而中斷,中斷原因會寫在元素的屬性里。 | false | Blind transfer(default):VoiceXML解釋器在完成轉接后,不再監控轉接過程,也不再在元素的名字屬性中報告掛斷結果,而是立即拋出一個connection.disconnect.transfer事件。 |
|
connectiontimeout |
在電話轉接過程中,VoiceXML解釋器在noanswer事件出現前能夠等待的時間。這一屬性只有在bridge是true時才有效。在缺省情況下,這個值是平臺指定的。 |
maxtime |
允許通話的最大時間。0表示沒有時間限制。只有當bridge是true時才有效。缺省情況下,這個值是0。 |
transferaudio |
在轉接而對方沒有應答前,用來放音的語音URI地址。如果語音沒有取到,錯誤將被忽略,轉接繼續進行。 |
aai |
應用程序之間用來交換的串信息。它可以在進程變量session.connection.aai中得到。aai數據的傳輸依賴于網關或ISDN、SIP。數據發送到遠端是否成功,并沒有報告。雖然所有的平臺必須支持aai屬性,平臺不一定非要發送aai和接收aai數據。如果平臺不能接收aai數據,必須將session.connection.aai變量置為ECMAScript undefined。 |
destexpr |
ECMAScript表達式,它生成URI地址。 |
|
表18:<transfer>元素的屬性 |
|
????“dest”和“destexpr”必須指定其一。如果兩者都沒有指定,error.badfetch事件就會拋出。“aai”和“aai”事件也必須指定其一,不然,error.badfetch事件也產生。 |
? |
????<一>、Blind Transfer |
|
????Blind Transfer是用來將主、被叫聯結起來的操作。在元素<transfer>前和在元素<transfer>內的<prompt>語句都會在轉接開始前依次播放,而且同樣具有bargein屬性。 |
|
|
圖8: 在Blind Transfer下的聯結: <transfer bridge="false"> |
|
????因為在轉接過程中聲音文件不能播放給主叫,所以transferaudio屬性指定的語音文件在轉接過程中被忽略。不管轉接是否成功,VoiceXML語音平臺不能再獲得對呼入和轉接電話的控制權。 |
|
????轉接的狀態不能得到。例如,不可能知道被叫是不是忙,這次呼叫是否成功等等。然而,有些錯誤是可以得到的,如主叫無權呼叫被叫方或者目標地址URI是錯誤的。 |
|
????一旦轉接開始,VoiceXML解釋器與電話進程脫離聯系,平臺將拋出一個connection.disconnect.transfer錯誤,解釋器還會繼續運行。 |
Action |
Form item變量的值 |
事件或錯誤 |
原因 |
轉接開始 |
undefined |
connection.disconnect.transfer |
轉接進行,但不會返回。 |
轉接結束 |
unknown |
? |
轉接結束,但結果未知。 |
|
表19:Blind Transfer Outcomes |
? |
????<二>、Bridge Transfer |
|
????對于Bridge Transfer,主叫和被叫是以全雙工方式進行的。 |
|
|
圖9: bridge transfer下的電話轉接:<transfer bridge="true"> |
|
????在<transfer>語句前和在<transfer>語句內的提示語音會依次播放,bargein也是有效的。 |
? |
??????1、Listening for user input during a transfer |
|
??????在<transfer>元素中可以指定一個或多個語法,這樣在通話過程中,就可以監視用戶的輸入而中斷轉接。 |
|
??????可以指定兩種輸入: |
|
????????·DTMF輸入; |
|
????????·語音輸入。 |
|
??????如果用戶的輸入匹配了所指定的語法,VoiceXML解釋器將繼續按照VoiceXML文本所指定的操作運行。如果沒有指定語法文件,在轉接過程中,將不監控用戶的輸入。Bargein屬性同樣適用于元素<transfer>前和元素<transfer>內的語音提示。此時,外呼開始;Transferaudio所指定的語音播放開始;語法文件所指定的DTMF或語音識別成為Bargein的唯一方式(直到對遠端的聯結建立)。因此bargeintype被忽略。轉接元素是模式的,因為在其作用域之外的語法沒有激活。 |
|
??????平臺解釋器沒有監控被叫的輸入。 |
? |
??????2、Handling caller, callee, or network disconnections |
|
??????當試圖去聯結被叫,平臺監控呼叫進程指示器(in bound或out of bound,依賴于特殊的聯結類型和協議)。在成功的轉接期間,平臺監控(out of band)電話事件,如電話的掛機事件。 |
|
??????如果被叫掛斷,主叫重新繼續它的任務。如果主叫掛斷,平臺掛斷被叫。主叫或被叫掛斷或兩者同時掛斷都不影響平臺解釋器的運行。 |
|
??????在轉接到被叫前,可能的結果如下: |
Action |
Form item變量的值 |
事件或錯誤 |
原因 |
主叫掛斷 |
? |
connection.disconnect.hangup |
主叫掛機。 |
被叫忙 |
busy |
? |
被叫忙。 |
網絡忙 |
Network_busy |
? |
中間網絡不應答。 |
被叫沒有應答 |
noanswer |
? |
在connecttimeout屬性指定的時間內沒有應答。 |
---- |
unknown |
? |
轉接結束但結果未知。 |
|
表20:Bridged Transfer Outcomes Prior to Connection Being Established |
|
??????轉接后可能的結果: |
Action |
Form item變量的值 |
事件或錯誤 |
原因 |
主叫掛斷 |
? |
connection.disconnect.hangup |
主叫掛斷。 |
主叫掛斷 |
near_end_disconnect |
? |
主叫通過DTMF或語音強迫被叫掛機。 |
平臺掛斷被叫 |
maxtime_disconnect |
? |
因為最大的通話時間到達,平臺掛斷被叫。 |
網絡掛斷 |
network_disconnect |
? |
網絡掛斷被叫。 |
被叫掛斷 |
far_end_disconnect |
? |
被叫掛斷。 |
---- |
unknown |
? |
轉接因未知原因而中斷。 |
|
表21:Bridged Transfer Outcomes After Connection Established |
|
??????在轉接完成后,元素<transfer>的影子變量有如下ECAMScript屬性: |
name$.duration |
轉接通話時間(浮點值),如果在被叫回答前就被掛斷,此值為零。 |
name$.inputmode |
中斷轉接過程的輸入模式(voice或dtmf)。 |
name$.utterance |
如果轉接因語音而中斷,此值中應是說出的文本;否則沒有定義。 |
|
表22:<transfer>元素的影子變量 |
? |
??????3、Audio during bridge transfer attempt |
|
??????在Bridge transfer過程中,也許要對主叫播放語音。例如一個廣告(“Buy Joe's Spicy Shrimp Sauce”)或一個信息(“Your call is very important to us; please wait while we connect you to the next available agent.”)。這樣便可以對呼叫進程中振鈴、忙等情況而出現的靜音起一個補償作用。 |
|
??????當遠端的應答出現時,Transferaudio的播放中止。遠端的應答不會永遠出現的,因為遠端交換機可以播放語音而不回答呼叫(這些語音包括一個特殊的音調、忙音、網絡忙音、或者一個提示聯結不能進行的錄音)。 |
|
??????如果一個語音播放的時間短于轉接到遠端的所需的時間,主叫也許會聽到靜音、平臺所指定的語音、或者是呼叫進行過程中的信息。具體是何種語音依賴于不同的平臺。 |
? |
????<三>、Transfer Errors and Events |
|
事件 |
原因 |
轉接類型 |
connection.disconnect.hangup |
主叫掛機。 |
bridge |
connection.disconnect.transfer |
將主叫轉接到另一方,而且返回。 |
blind |
|
表23:Events Thrown During Transfer |
|
????如果transfer不能進行,下列錯誤將會拋出: |
錯誤 |
原因 |
轉接類型 |
error.connection.noauthorization |
主叫不允許呼叫目標。 |
Blind和Bridge |
error.connection.baddestination |
目標URI錯誤。 |
Blind和Bridge |
error.connection.noroute |
平臺不能對目標呼叫 |
bridge |
error.connection.noresource |
平臺不能分配資源而不能呼叫。 |
bridge |
error.connection.protocol.nnn |
協議棧在聯結中出現一個例外,此例外不能對應于任何一個error.connection事件。 |
bridge |
error.unsupported.transfer.blind |
平臺不能支持Blind轉接。 |
blind |
error.unsupported.transfer.bridge |
平臺不能支持Bridge轉接。 |
bridge |
error.unsupported.uri |
平臺不能支持用到的URI格式,指定的變量_message(Section 5.2.2)將包含串“The URI x is not a supported URI format”,x是<transfer>的dest或destexpr屬性。 |
Blind和Bridge |
|
表24:Transfer Attempt Error Events |
? |
????<四>、Example |
|
????下面的例子試圖將主叫轉接到另一方,并等待通話的結束。語音提示可能在元素<transfer>前或內部。這也許用來通知主叫,發生了什么事情。這種通知通常是“請等待,正在轉接呼叫”。在<block>、<transfer>中的<prompt>元素,在執行轉接前,依次播放。語音隊列開始播放,呼叫便開始。在缺省情況下,主叫聯結到外呼的電話通道。“transferaudio”屬性指定對主叫播放的語音文件,它會在遠端應答時停止播放。如果語音的長度大于聯結所需的時間,只要遠端應答,也會停止播放。 |
|
|
圖10:Sequence and timing during an example of a bridge transfer |
|
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0" 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">
<form id="xfer">
<var name="mydur" expr="0"/>
<block>
<!-- queued and played before starting the transfer -->
<prompt>
Calling Riley. Please wait.
</prompt>
</block>
<!-- Play music while attempting to connect to far-end -->
<!-- "hotword" bargeintype during transferaudio only -->
<!-- Wait up to 60 seconds for the far end to answer -->
<transfer name="mycall" dest="tel:+1-555-123-4567"
transferaudio="music.wav" connecttimeout="60s" bridge="true">
<submit next="./voicemail_server.asp"/>
<!-- queued and played before starting the transfer -->
<!-- bargein properties apply during this prompt -->
<prompt>
Say cancel to disconnect this call at any time.
</prompt>
<!-- specify an external grammar to listen for "cancel" command -->
<grammar src="cancel.grxml" type="application/srgs+xml"/>
<filled>
<assign name="mydur" expr="mycall$.duration"/>
<if cond="mycall == 'busy'">
<prompt>
Riley's line is busy. Please call again later.
</prompt>
<elseif cond="mycall == 'noanswer'"/>
<prompt>
Riley can't answer the phone now. Please call again later.
</prompt>
</if>
</filled>
</transfer>
<!-- submit call statistics to server -->
<block>
<submit namelist="mycall mydur" next="/cgi-bin/report"/>
</block>
</form>
</vxml>
|
?
第四節 Filled | ? | ? | ????<filled>元素指定了當一個或多個input item被填充后要執行的操作。它可以出現在兩個地方:作為<form>元素的子元素,或者作為input item的子元素。 | | ????如果作為<form>元素的子元素,當一個或多個input item的組合被填充后,<filled>元素用于執行一些操作。下面的例子中的<filled>元素用于交叉檢查以確保“start_city” <field>和“end_city”<field>的識別結果不一樣: | | <?xml version="1.0" encoding="UTF-8"?> <vxml version="2.0" 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"> <form id="get_starting_and_ending_cities"> <field name="start_city"> <grammar src="http://www.grammars.example.com/voicexml/city.grxml" type="application/srgs+xml"/> <prompt>What is the starting city?</prompt> </field> <field name="end_city"> <grammar src="http://www.grammars.example.com/voicexml/city.grxml" type="application/srgs+xml"/> <prompt>What is the ending city?</prompt> </field> <filled mode="all" namelist="start_city end_city"> <if cond="start_city == end_city"> <prompt>You can't fly from and to the same city.</prompt> <clear/> </if> </filled> </form> </vxml> | | ????如果<filled>作為一個input item的子元素出現,它指定了當該input item被填充后要執行的操作: | | <?xml version="1.0" encoding="UTF-8"?> <vxml version="2.0" 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"> <form id="get_city"> <field name="city"> <grammar type="application/srgs+xml" src="http://www.ship-it.example.com/grammars/served_cities.grxml"/> <prompt>What is the city?</prompt> <filled> <if cond="city == 'Novosibirsk'"> <prompt>Note, Novosibirsk service ends next year.</prompt> </if> </filled> </field> </form> </vxml> | | ????每次收集用戶的輸入后,該輸入中提及的input item都被做了標記,然后解釋器根據每個<filled>元素在文檔中的順序(input item中的<filled>元素和<form>中的<filled>元素優先權一樣)依次訪問它們。那些匹配該utterance的<filled>元素被依次執行,除非已經沒有<filled>元素,或者出現控制跳轉,或者拋出事件。 | | ????<filled>元素的屬性有: | mode | 值為all(默認)或any。如果值為any,當任意一個指定的input item被用戶最近一次的輸入填充后,就執行該<filled>元素的操作。如果值為all,當所有提到的input item被填充,且用戶最后一次輸入填充了至少一個input item,就執行該<filled>元素的操作。在input item中的<filled>元素不能指定該屬性。 | namelist | 要觸發的input item。對于<form>元素中的<filled>元素,該屬性默認為該form中所有的input item變量(包括顯式和隱式)。一個input item中的<filled>元素則不能指定該屬性,這種情況下,namelist屬性值實際上就是該input item的名稱。注意control item不能出現在該屬性中。 |
| 表25:<filled>元素的屬性 |
第五節 Links | ? | ? | ????<link>元素可以有一個或幾個語法,語法的作用域為包含該<link>元素的元素。該包含<link>元素的元素的scope屬性不會影響<link>元素中語法的作用域。<link>元素被包含于一個<form>元素中,該<form>元素的scope屬性為document,該<link>元素語法的作用域在該form內,而不是整個文檔。<link>元素中的<grammar>元素是不允許指定scope屬性的。當這些語法中的一個被匹配,<link>元素被激活,要么跳轉到一個新的文檔或dialog(如<goto>),要么拋出一個事件(如<throw>)。 | | ????例如,當用戶說“books”或按“2”時,<link>元素被激活: | | <link next="http://www.voicexml.org/books/main.vxml"> <grammar mode="voice" version="1.0" root="root"> <rule id="root" scope="public"> <one-of> <item>books</item> <item>VoiceXML books</item> <one-of> </rule> </grammar> <grammar mode="dtmf" version="1.0" root="r2"> <rule id="r2" scope="public"> 2 </rule> </grammar> </link> | | ????當語法被匹配時,下面的<link>元素動態的決定要跳轉到當前文檔的哪一個dialog: | | <link expr="'#' + document.helpstate"> <grammar mode="voice" version="1.0" root="root"> <rule id="root" scope="public"> help </rule> </grammar> </link> | | ????<link>元素可以是<vxml>和<form>的子元素,或form item<field>和<initial>的子元素。作為<vxml>的子元素,<link>元素的語法在整個文檔中都是激活的;作為<form>的子元素,<link>元素的語法在該form中是激活的;如果應用根文檔中有一個文檔級的<link>元素,它的語法在該應用所有被加載的文檔中都是激活的。 | | ????如果在一個form item中執行,且該form item的modal屬性為true,則form級或文檔級的<link>元素的語法是不激活的。 | | ????也可以定義一個<link>元素,當語法匹配時拋出一個事件,而不是跳轉到一個新的文檔或dialog,該事件是在當前執行的地方被拋出,而不是在定義<link>元素的地方被拋出。例如,當用戶的輸入匹配了<link>元素的語法或用戶按鍵輸入了"2",在用戶正在訪問的form item的地方拋出了help事件,由該form item的作用域內相應的<catch>元素處理(詳見5.2.4節)。 | | <link dtmf="2" event="help"> <grammar mode="voice" version="1.0" root="r5"> <rule id="r5" scope="public"> <one-of> <item>arrgh</item> <item>alas all is lost</item> <item>fie ye froward machine</item> <item>I don't get it</item> <one-of> </rule> </grammar> </link> | | ????當匹配了<link>元素中的語法時,application.lastresult$也被賦值,這樣才能允許呼叫流程在這個實際的語義結果的基礎上往下走。在5.1.5中有一個例子。 | | ????從概念上講,可以認為<link>元素由兩部分組成:條件和操作。“條件”就是<link>元素的內容,即它的語法,只有語法被匹配了,才能激活。“操作”由該元素的屬性指定,即要跳轉到哪里或拋出哪個事件。“條件”是靜態地解決/求值的,而“操作”則是動態地解決/求值的。這意味著: | | ??????1、該<link>元素的內容中的任何URI都是被靜態地求值的,即根據定義了<link>元素的文檔的基本URI求值(詳見1.5.1節的xml:base)。 | | ??????2、<link>元素屬性中的任何URI都是被動態的求值的,即根據語法被匹配時正在執行的文檔的基本URI求值。 | | ??????3、<link>元素的屬性中的任何ECMAScript表達式都是被動態地求值的,即在語法被匹配時的作用域內和執行的環境中求值的。 | | ????<link>元素的屬性有: | next | 要跳轉到的URI,該URI是一個文檔(也許有段標識符指定一個起始的dialog)或當前文檔的一個dialog。 | expr | 和next屬性一樣,只不過該URI是根據給定的ECMAScript表達式動態地求值的。 | event | 當用戶匹配了<link>元素中的一個語法時要拋出的事件。 | eventexpr | 一個ECMAScript表達式,它的結果值為當用戶匹配了<link>元素中的一個語法時要拋出的事件。 | message | 描述事件產生原因的文本信息。 | messageexpr | 一個ECMAScript表達式,它的結果值為描述事件產生原因的文本信息。 | dtmf | 該<link>元素的DTMF序列,它的作用等同于一個簡單的DTMF語法,和應用于該序列識別的DTMF<property>。它和DTMF語法不同的是,它的空格是不起作用的:dtmf=“123#”跟dtmf=“1 2 3 #”的效果是一樣的。該屬性能和其他的<grammar>同時使用。當用戶的輸入匹配了<link>元素中的一個語法或DTMF序列,該<link>元素被 激活。 | fetchaudio | 見6.1節。它默認為fetchaudio<property>的值。 | fetchhint | 見6.1節。它默認為documentfetchhint<property>的值。 | fetchtimeout | 見6.1節。它默認為fetchtimeout<property>的值。 | maxage | 見6.1節。它默認為documentmaxage<property>的值。 | maxstale | 見6.1節。它默認為documentmaxstale<property>的值。 |
| 表26:<link>元素的屬性 | | ????必須正確的指定屬性“next”,“expr”,“event”或“eventexpr”中的一個,否則會拋出一個error.badfetch事件。必須正確的指定屬性“message”或“messageexpr”中的一個,否則會拋出一個error.badfetch事件。 |
|
|
? |
|
|
|