性格决定命运 气度左右格局 拼搏方能取胜 谦虚才会进步

IVR-2 [Voice XML规范详细描述3]

上一篇 / 下一篇  2008-03-25 09:27:49 / 个人分类:做着

二、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变量被清零。
condECMAScript表达式。只有当其结果值为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变量被清零。
condECMAScript表达式。只有当其结果值为boolean true,该元素才被执行,否则不被执行。缺省时为true。
namelist要提交的变量名列表,默认是提交0个变量。如果指定了该属性,它可以包含多个变量,以空格隔开。在VoiceXML和ECMAScript中声明的变量都可以被提交。
src要调用的subdialog的URI。
srcexprECMAScript表达式,它的结果值为要调用的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变量被清零。
condECMAScript. 表达式。只有当其结果值为boolean true,该form. item块才被执行,否则不被访问。缺省时为true。
classid一个URI,它指定了要执行的object的位置。该URI的拼写规则是依赖于平台的。
codebase基路径,用于解析classid、data和archive属性指定的相对URI。它默认为当前文档的基础URI。
codetype下载classid指定的object时期望的数据类型。如果没有指定,默认为属性type的值。
data指定object数据的位置的URI。如果它是一个相对的URI,则以codebase属性指定的值为基路径。
typeData属性指定的数据的类型。
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>操作。
 
    当用户在录音时挂机,录音终止并抛出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变量被清零。
condECMAScript表达式。只有当其结果值为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。
exprForm. item的初始值。缺省是ECMAScript. undefined。如果初始化到一个值,这个元素将不被访问。只有当这个Item的值被清除后才能被访问。
cond这是一个表达式,只有当它是true时,这个才form. item可以被访问。
dest目标的URI地址(如:电话、IP电话地址)。VoiceXML平台必须支持tel:URL语法格式(这种语法格式在[RFC2806]中描述),也可以支持其它基于URI地址格式。
destexprECMAScript表达式,它生成URI地址。
bridge决定平台在<transfer>执行后,是否依然监控主叫方和被叫方。
WOa-d1ZN0
trueBridge transfer:VoiceXML解释器一直处于等待状态,直到Transfer从转接通话状态下退出。如果因为挂机或网络的原因而线路中断,会抛出一个Connection.disconnect.hangup事件。如果通话因为其它原因而中断,中断原因会写在元素的属性里。
falseBlind transfer(default):VoiceXML解释器在完成转接后,不再监控转接过程,也不再在元素的名字属性中报告挂断结果,而是立即抛出一个connection.disconnect.transfer事件。
ITPUB个人空间;J#B PTTf*E
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。
destexprECMAScript表达式,它生成URI地址。
表18:<transfer>元素的属性
    “dest”和“destexpr”必须指定其一。如果两者都没有指定,error.badfetch事件就会抛出。“aai”和“aai”事件也必须指定其一,不然,error.badfetch事件也产生。
 
    <一>、Blind Transfer
    Blind Transfer是用来将主、被叫联结起来的操作。在元素<transfer>前和在元素<transfer>内的<prompt>语句都会在转接开始前依次播放,而且同样具有bargein属性。
 
    因为在转接过程中声音文件不能播放给主叫,所以transferaudio属性指定的语音文件在转接过程中被忽略。不管转接是否成功,VoiceXML语音平台不能再获得对呼入和转接电话的控制权。
    转接的状态不能得到。例如,不可能知道被叫是不是忙,这次呼叫是否成功等等。然而,有些错误是可以得到的,如主叫无权呼叫被叫方或者目标地址URI是错误的。
    一旦转接开始,VoiceXML解释器与电话进程脱离联系,平台将抛出一个connection.disconnect.transfer错误,解释器还会继续运行。
ActionForm. item变量的值事件或错误原因
转接开始undefinedconnection.disconnect.transfer转接进行,但不会返回。
转接结束unknown 转接结束,但结果未知。
表19:Blind Transfer Outcomes

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar