第二章 Dialog的结构 | |
|
第一节 Forms | |
|
form是VoiceXML文档的主要组成部分,它包括以下几个部分: |
|
1、一组form. item,即在FIA(form. interpretation algorithm)的主循环被访问的一些元素。Form. item可细分为input item和control item,input item可由用户填充,而control item不能; |
|
2、非form. item(non-form. item)变量的声明; |
|
3、事件处理; |
|
4、填充后(filled)的操作,也就是当某些input item的组合被赋值后要执行的程序逻辑模块。 |
|
Form元素的属性: |
id | Form的名字。如果有指定的话,这个form就可以在该文档内被引用,或者在别的文档中引用它。例如,,。 | scope | 该form语法的默认作用域(scope)。如果它的值为dialog,则该form语法只是在这个form里是激活的;如果它的值为document,则该form语法在这个文档的任何对话中都是激活的;如果该文档为应用根文档,则该form语法在这个应用的任何文档的任何dialog中都是激活的。注意,单独的form的语法作用域的优先权高于默认的语法作用域。例如在非根文档的某个form默认的作用域为dialog,且有一个form语法的作用域为document,则该语法在这个文档的任何对话中都是激活的。 |
|
表3:元素的属性 |
|
这一节描述了关于form的一些概念,并给出了它们的一些操作的具体例子。 |
|
一、Form的解释 |
|
form由内置的FIA解释。FIA有一个主循环用来重复选定一个form. item并访问它。被选定的form. item是在文档顺序中第一个警戒条件不满足的form. item。例如,field的默认警戒条件检测看该field的form. item变量是否有值。因此,如果一个简单的form只包含了几个field,则每个field会顺序地提示给用户。 |
|
解释一个form. item一般包括以下步骤: |
|
1、选定并播放一个或多个prompt; |
|
2、收集用户的输入,或填充一个或多个input item的响应,或一些事件的抛出(例如help); |
|
3、解释属于最新的input item的填充的操作。 |
|
FIA终止于解释一个控制语句的跳转(例如用元素到另一个对话或文档,或者一个元素把数据提交到文档服务器)。当再没有符合条件的form. item可以被选定时,FIA也随着一个隐式的而中止。 |
|
关于FIA更详细的说明见2.1.6节。 |
|
二、Form. Items |
|
form. item就是在FIA的主循环中能够被访问的元素。Input item控制FIA为特定的元素收集信息。当FIA选定一个control item时,该control item可以包含一个要执行的代码块,或告诉FIA开始为混合主动式的form的提示和收集进行初始化。 |
|
、Input Items |
|
input item指定了得到用户输入的input item变量。它有一些提示,告诉用户要说或者键入什么;还有定义允许的输入的语法;还有处理一些由此产生的事件的事件处理。Input item也可以有元素,它定义了input item变量被填充以后要进行的操作。Input item有以下几个: |
| 它的值是通过ASR或DTMF语法获得的。 | | 它的值是用户录音的一段音频。例如,元素可以用来收集语音邮件的语音信息。 | | 它把用户转接到另一个电话号码。如果该转接返回控制,则把该转接结果的状态赋值给它的变量。 | | 它通过一些参数调用依赖于平台的object,该object是一个ECMAScript. Object。平台的object可以是一个内置的dialog,比如说用来收集信用卡信息的dialog。也可以是用特定的DTMF文本方法收集文本消息的dialog。虽然当依赖于平台的object不被平台支持时,要抛出error.unsupported.objectname事件来处理元素(专门的事件变量“_message”提供了更详细的错误信息,详见5.2.2节),但是对于这些依赖于平台的object的执行却是没有任何限制的。 | | 有点像函数调用。它调用同一文档中的另一个dialog,或者调用另一个文档。它返回的是一个ECMAScript. Object。 |
|
表4:Input Items |
|
、Control Items |
|
control item有两种: |
| 它包含一些程序语句的序列,这些程序语句是用于提示和计算的,不是用于收集输入的。有一个form. item变量(通常是隐含的),在它被解释之前,该变量被置为true。 | | 该元素用于在混合主动式的form里控制最初的交互。它应该提示用户说一些话来匹配一个form级别的语法。在元素的执行中,当至少有一个input item变量被识别结果所填充时,元素的form. item变量变为true,从而把它置为不是FIA可选定的。 |
|
表5:Control Items |
|
三、Form. Item变量和条件 |
|
每个form. item都有一个和它相关的form. item变量,当进入该form时,它的默认值为undefined。Input item的form. item变量包含了解释该form. item的结果。Input item的form. item变量也称为input item变量(Input item variable),它保存了从用户那里收集到的值。Input item变量可以用name属性给它命名;或让它匿名,此时会产生一个内部名称。 |
|
每个form. item也有一个警戒条件,它决定该form. item是否能够被FIA选定。默认的警戒条件只是检测该form. item是否有非undefined的值,如果有,该form. item就不会被访问。 |
|
通常,input item都会有名称,control item都没有名称;form. item变量都没有被赋初始值,且没有指定附加的警戒条件。但有些时候需要更精确地控制。如:form可以在开始的时候给一个form. item 变量赋初始值来跳过相应的field的执行,然后清零(如用元素)并强制该field重新被选定;另一个field可以有一个警戒条件,只有当该field没有被选定过,且其他两个field已经被填充时才激活它;或只有当某个条件为true时,才能执行。这样一来,哪些form. item会被FIA选定并执行的顺序可以得到更好的控制。然而,通常很多对话都可以不用这么复杂。 |
|
总的来说,所有的form. item都有如下的属性: |
name | 该form. item变量的名称,作用域为dialog。它保存了该form. item的值。 | expr | 给form. item变量赋初始值,默认的初始值为ECMAScript. 的undefined 。如果有初始值,则该form. item不会被执行,除非该form. item变量被清零。 | cond | 它是一个表达式的值,如果缺省,默认值为true。如果是在元素里,它用来检测是否有input item被填充了。 |
|
表6:Form. Item共有的属性 |
|
四、Directed Forms |
|
最简单、最普通的form类型是,在computer-directed交互中,该form的form. item正好被顺序地执行一次。 |
|
<?xml version="1.0" encoding="UTF-8"?>
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">
Welcome to the weather information service.
What state?
Please speak the state for which you want the weather.
What city?
Please speak the city for which you want the weather.
|
|
该对话执行的顺序为: |
|
C (computer): Welcome to the weather information service. What state?
H (human): Help.
C: Please speak the state for which you want the weather.
H: Georgia.
C: What city?
H: Tblisi.
C: I did not understand what you said. What city?
H: Macon.
C: The conditions in Macon Georgia are sunny and clear at 11 AM ... |
|
FIA的第一次循环选定时,选定了第一个block,因为它的form. item变量(隐含的)值为undefined。该block输出了它的提示语,且它的form. item变量被置为true。在FIA的第二次反复选定时,略过了第一个block,因为它的form. item变量值不为undefined,此时FIA选定了名为“state”的field,因为该field的变量state的值为undefined。该field提示用户输入州名,然后把变量state置为用户输入的答案。关于field级的语法填充form. item变量的具体描述见3.1.6节。第三次提示并收集名称为city的field。第四次执行了最后的block,并跳转到另外一个URI。 |
|
这个例子里的每个field都有播放一段提示语引导用户输入,有一个语法指定要监听的内容,有help事件的事件处理。无论何时,只要用户要求帮助,help事件就会被抛出。Help事件处理捕获这些事件并播放一段更详细的提示语。 |
|
下面还有一个机器主导的form,用于收集信用卡信息的: |
|
<?xml version="1.0" encoding="UTF-8"?>
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">
We now need your credit card type, number, and expiration date.
What kind of credit card do you have?
Type of card?
<!-- This is an inline grammar. -->
visa
mastercard
amex
american express
Please say Visa, Mastercard, or American Express.
What is your card number?
Card number?
Please say or key in your 15 digit card number.
Please say or key in your 16 digit card number.
American Express card numbers must have 15 digits.
Mastercard and Visa card numbers have 16 digits.
What is your card's expiration date?
Expiration date?
Say or key in the expiration date, for example one two oh one.
<!-- validate the mmyy -->
I have
number
expiring on
.
Is this correct?
|
|
注意:语法的可选项‘amex’和‘american express’返回的真实值需要在条件表达式中分开处理。3.1.5节描述了语法中的语义元素怎样才能对多种输入返回一个单独的值。 |
|
该对话的流程可能是这样的: |
|
C: We now need your credit card type, number, and expiration date.
C: What kind of credit card do you have?
H: Discover.
C: I did not understand what you said. (a platform-specific default message.)
C: Type of card? (the second prompt is used now.)
H: Shoot. (fortunately treated as "help" by this platform)
C: Please say Visa, Master card, or American Express.
H: Uh, Amex. (this platform. ignores "uh")
C: What is your card number?
H: One two three four ... wait ...
C: I did not understand what you said.
C: Card number?
H: (uses DTMF) 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 #
C: What is your card's expiration date?
H: one two oh one
C: I have Amex number 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 expiring on 1 2 0 1. Is this correct?
H: Yes. |
|
Field是form的主要组成元素。Field声明了一个变量并指定了相应的提示语、语法、DTMF序列、帮助信息和其他一些事件处理。每个field声明了一个VoiceXML form. item变量,它的作用域为该form的dialog。该field被填充后,它的变量可以被提交,也可以赋值给其他的变量。 |
|
每个field有它自己的语音和(或)DTMF语法,既可以明确的使用元素指定,也可以用type属性隐含地指定。Type属性用于指定内置的语法,像digits、boolean或number。 |
|
每个field可以有一个或多个提示语。如果有一个提示语,它会被反复地播放给用户,直到用户输入信息。若有多个提示语则根据提示语选择算法来选定提示语(详见4.1.6节)。在每次要播放提示语的时候,count属性可以决定用哪一条提示语。在这个例子,提示语越变越短,这叫做锥形提示(tapered prompting:语音提示渐渐地简短而精炼,或越来越精细)。 |
|
元素是一个事件处理,它定义了当用户请求帮助时该做什么。帮助信息也可以是分级的。这些信息可以简化,下面两个元素的效果是等同的。 |
|
Please say visa, mastercard, or amex.
Please say visa, mastercard, or amex.
|
|
元素定义的是,当用户提供了相应field要识别的输入后该做什么。一个用途就是在语法检查之后再指定一套完整的约束,像上面例子中名为expiry_date的field。 |
|
五、Mixed Initiative Forms |
|
上一节我们讨论了执行严格的,由计算机主导的会话,要实现混合主动式的form,即计算机和用户共同主导该会话,必须有一个或多个form级别的语法。这种会话的编写有几种方式,其中一种普遍的方式是使用元素和元素,元素用来获得全面的信息,而元素用来获得特定的信息。下面的例子说明了这一点。其他一些更复杂的技巧也可以取得同样的效果,例如使用元素的cond属性。 |
|
如果某个form拥有几个form级别的语法,那么: |
|
1、它的input item在任何顺序中都能够被填充; |
|
2、用户的一个utterance就可以填充一个以上的input item。 |
|
只有input item能够被form级别的语法的匹配结果填充,control item不能。关于form级别的语法填充field变量的描述见3.1.6节。 |
|
当用户在其他的对话内,form级别的语法也可能是激活的。假如某个文档有两个form,一个是汽车租金的form,另一个是酒店预定的form,它们都有在整个文档激活的语法,在和酒店预定的form交互的时候,用户可以输入汽车租金的信息,引导计算机到汽车租金的form里。用户可以根据任何激活的语法讲话,填充input item和进行相应的操作。 |
|
例子。下面的例子是天气信息服务的第二个版本,是混合主动式的。这个例子为了增强它的说明性,加入了广告和城市名及州名的确认: |
|
<?xml version="1.0" encoding="UTF-8"?>
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">
<!-- Caller can't barge in on today's advertisement. -->
Welcome to the weather information service.
For what city and state would you like the weather?
Please say the name of the city and state for which you would like a weather report.
<!-- If user is silent, reprompt once, then try directed prompts. -->
What state?
Please speak the state for which you want the weather.
Please say the city in for which you want the weather.
Please speak the city for which you want the weather.
<!-- Most of our customers are in LA. -->
Do you want to hear the weather for , ?
|
|
下面是该例子的一个可能的流程,它显示了它的优势,即使该用户是个新手: |
|
C: Welcome to the weather information service. Buy Joe's Spicy Shrimp Sauce.
C: For what city and state would you like the weather?
H: Uh, California.
C: Please say the city in California for which you want the weather.
H: San Francisco, please.
C: Do you want to hear the weather for San Francisco, California?
H: No
C: For what city and state would you like the weather?
H: Los Angeles.
C: Do you want to hear the weather for Los Angeles, California?
H: Yes
C: Don't forget, buy Joe's Spicy Shrimp Sauce tonight!
C: Mostly sunny today with highs in the 80s. Lows tonight from the low 60s ... |
|
名称为go_ahead的field有一个modal属性,它的值为true,它的作用是使所有的语法都失效,除了当前form. item中定义的那个语法,因此,在该field中只有boolean语法是激活的。 |
|
有经验的用户可以更快的完成流程,但是他还是必须要听广告: |
|
C: Welcome to the weather information service. Buy Joe's Spicy Shrimp Sauce.
C: What ...
H (barging in): LA.
C: Do you ...
H (barging in): Yes.
C: Don't forget, buy Joe's Spicy Shrimp Sauce tonight!
C: Mostly sunny today with highs in the 80s. Lows tonight from the low 60s ... |
|
Controlling the order of field collection. |
|
FIA可以用多种方式定制。其中一种方法是给一个form. item变量赋值,这样该form. item就不会被选定了;另一种方法是用把form. item变量置为undefined,强制FIA再次访问该form. item。 |
|
还有一种是用元素的nextitem属性明确地指定下一个要访问的form. item,该方法强加了一个到目标form. item 的立即跳转。目标form. item的变量、条件和计数器都不会被重置。即使该form. item已经被访问过,他的提示语还是会播放的。如果跳转出现在中,该剩下的操作和任何挂起的操作都会被跳过。 |
|
下面这个例子中出现在exit事件的事件处理中: |
|
<?xml version="1.0" encoding="UTF-8"?>
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">
Hello, you have been called at random to answer questions critical to U.S. foreign policy.
Do you agree with the IMF position on privatizing
certain functions of Burkina Faso's agriculture ministry?
If this privatization occurs, will its effects be
beneficial mainly to Ouagadougou and Bobo-Dioulasso?
Do you agree that sorghum and millet output might
thereby increase by as much as four percent per annum?
You have elected to exit.
Are you sure you want to do this, and perhaps
adversely affect U.S. foreign policy vis-a-vis sub-Saharan Africa for decades
to come?
Okay, but the U.S. State Department is displeased.
Good, let's pick up where we left off.
|
|
无论用户在哪个要收集的问题中说“exit”,平台都会抛出exit事件,并由元素的事件处理捕获。该事件处理把FIA引导到下一个要访问的field,“confirm_exit”。confirm_exit域在正常的调查完成过程中将不再被访问,因为其前面的元素将控制转向“register”脚本。 |
|
六、Form. Interpretation Algorithm |
|
我们已经从概念上讨论了FIA,在这一节,我们将更详细地讨论它(更详细的描述见附录C)。 |
|
、Initialization Phase |
|
FIA只要进入一个form就会初始化它。内部的提示语计数器变量(在form的dialog作用域内)被置为1。每个变量(form级别的元素和form. item变量)根据在文档中的顺序被一一初始化为undefined和相应的expr属性的值。 |
|
、Main Loop |
|
FIA的主循环有三个阶段: |
|
选定(select)阶段:选定下一个没有被填充的form. item供访问。 |
|
收集(collect)阶段:访问被选定的form. item,播放它的提示语让用户输入,激活相应的语法,等待收集用户的输入(例如语音或DTMF按键输入)或者事件(例如请求帮助或noinput timeout)。 |
|
处理(process)阶段:处理用户输入,填充form. item并执行元素的操作,例如确认输入;处理事件,执行该事件相应的事件处理。 |
|
注意:FIA可以被给定一个输入(一组语法槽值(grammar slot/slot value pairs)),该输入是用户在另外一个FIA时被收集到的。在这种情况下,主循环的第一次循环跳过了选定和收集阶段,直接跳到处理阶段,使用给定的输入处理。另一个要注意的是,如果在选定或收集阶段有错误发生,产生一个事件,该事件被抛出,FIA也直接跳到处理阶段。 |
|
1、Select phase |
|
选定阶段的目的是选定下一个要访问的form. item,当出现以下情况时,选定阶段结束: |
|
如果上一次主循环的处理阶段指定了一个,则该指定的form. item被选定。 |
|
另外,如果第一个form. item的警戒条件为false,则该form. item被选定。在检查警戒条件时,如果发生错误,事件被抛出,FIA跳过收集阶段,进入处理阶段,处理该事件。 |
|
如果没有任何form. item的警戒条件为false,且FIA最后一次循环完成时没有碰到明确的控制跳转,FIA会执行一个隐含的操作(类似的,如果执行是在form. 之外,例如当在form之外产生一个错误时,没有任何明确的控制跳转,解释器将执行一个隐含的操作)。 |
|
2、Collect phase |
|
收集阶段的目的是收集用户输入或事件。当一个form. item被选定时,FIA要执行的操作取决于该form. item的类型: |
|
如果访问的是一个field item,FIA根据该field item的提示语计数器和提示语条件选定提示语,进行排队,然后激活并监听该field级别的语法和任何其他更高级别的激活的语法,等待语法识别和某个事件。 |
|
如果访问的是,FIA根据提示语计数器和提示语条件对提示语进行排队,激活该item的语法,在该transfer执行前播放它的提示语队列。 |
|
如果访问的是或,FIA根据提示语计数器和提示语条件对提示语进行排队,FIA没有激活语法,相反,执行环境给subdialog或object指定了收集输入的行为。在执行subdialog或object之前不播放提示语队列,而应该在后来的输入收集的时候播放。 |
|
如果访问的是,FIA根据该的提示语计数器和提示语条件选定提示语,进行排队,然后监听form级别的语法和其他更高级别的激活的语法,等待语法识别和某个事件。 |
|
如果访问的是,FIA把它的form. item 变量置为true,对它的内容求值,跳过处理阶段,没有收集任何输入,FIA主循环的下一次循环进入该。 |
|
3、Process phase |
|
处理阶段的目的是处理上一个阶段收集到的输入或事件。 |
|
(1)、如果出现一个事件(如noinput或挂机),FIA确定该应用的catch元素并执行它,该应用catch元素在当前form. item 的范围内选定,在该会话封装的范围内进行,这样可能会导致该FIA终止(例如,如果它跳转到一个对话或文档,或执行了),或者可能导致FIA进入主循环的下一个循环(如,执行帮助的默认事件处理)。 |
|
(2)、如果某个输入匹配了语法,则FIA执行该link的跳转,或者抛出它的事件,如果抛出一个事件,事件在当前的form. item(如、 、等等)的环境下处理。 |
|
(3)、如果输入匹配了一个不同于当前form的另一个form的语法,该FIA终止,另一个form被初始化,该form的FIA带着这个输入直接进入它的处理阶段。 |
|
如果某个输入匹配了该form的语法,则: |
|
(1)、该语法的语义结果被映射到一个或多个form. item变量,详细描述见3.1.6节; |
|
(2)、FIA标识这些赋值所触发的操作,详细描述见24节; |
|
(3)、FIA根据它们在文档中的顺序执行每个操作。如果遇到、、、、或者元素,就不会再执行剩下的元素了,FIA要么终止,要么继续主循环的下一个循环。不会终止FIA(终止意味着一个操作),只是相当于给相应的prompt做个标记,让FIA在下一次循环再次播放prompt。如果在执行某个时抛出一个事件,FIA将在该的作用域内开始选定事件处理,该作用域可以是一个 form. item或者该form自己,然后在该dialog作用域外处理。 |
|
在完成处理阶段后,解释器继续返回到选定阶段。 |
|
关于FIA更详细的描述见附录C。 |
发表评论 取消回复