铁观音

C++编程宝典

   ::  ::  ::  ::  :: 管理 ::
  1 随笔 :: 19 文章 :: 0 评论 :: 0 Trackbacks
第四章  System Output(Prompt)
 
    <prompt>元素用于控制合成语音和预录制音频的输出。从概念上讲,提示语是即时排队播放的,因此解释器会一直播放提示语,除非需要用户提供输入。从这一点看,提示语被播放,同时系统也在等待用户输入。一旦收到来自语音识别(或DTMF识别)子系统的输入,解释器就会继续执行。
    <prompt>元素的属性有:
bargein 控制用户是否可以打断该提示语,值为true或false。当为true时,用户可打断系统提示。默认为bargein property的值。见6.3.4节 。
bargeintype 设置bargein的类型,值为‘speech’或者‘hotword’,默认为bargeintype property属性值。见6.3.4节。
cond ECMAScript 表达式。只有当其结果值为boolean true,该<prompt>元素才被执行,否则不被执行。缺省时为true。
count 它是一个数字,用于标识不同的<prompt>,默认值为“1”。
timeout 等待随后用户输入的时间,该属性值是一个Time Designation(见6.5节)。默认的noinput timeout值是依赖于平台的。
xml:lang 该<prompt>的语言标识符。它默认为该文档的"xml:lang"属性的值。
xml:base 声明一个基本URI,用于解析该<prompt>元素中的相对URI。<prompt>元素中的该属性的优先权高于<vxml>元素。如果缺省,它的值从文档层次继承得到。
表33:<prompt>元素的属性
 
第一节 Speech Markup  
          
 
    <prompt>元素的内容是以W3C SSML1.0(Speech Synthesis Markup Language)为模型的。
    下面是SSML1.0中定义的语音标记,它们在VoiceXML2.0中是可用的。这些元素的例子和定义请参考SSML1.0。
元素 作用 章节链接
<audio> 指定要播放的音频文件和文本。 2.3.1
<break> 在语音输出中插入一个停顿。 2.2.3
<desc> 为<audio>元素中的非语音音频提供一段描述。 2.3.3
<emphasis> 在所包含的文本中加强重音。 2.2.2
<lexicon> 为相应的提示语指定发音词典。 3.3
<mark> VoiceXML平台忽略该元素。 2.3.2
<metadata> 指定该提示语的XML元数据内容。 3.4
<paragraph>(或<p>) 标识一个段落,可包括0个或多个句子。 2.1.3
<phoneme> 为包含的文本指定发音。 2.1.5
<prosody> 包含在一个规则定义中的元素,该元素提供了一个匹配该规则的输入的例子。 2.2.4
<say-as> 为包含的文本指定结构的类型。 2.1.4
<sentence>(或<s>) 把所包含的文本标识为一个句子。 2.1.3
<sub> 用指定的文本的发音代替所包含的文本的发音。 2.1.6
<voice> 指定文本的声音特性。 2.2.1
表34:VoiceXML可用的SSML元素
    当在VoiceXML中使用时,<audio>元素(见4.1.3节)和<say-as>元素(见附录P)定义了一些新的属性。VoiceXML也允许<enumerate>元素和<value>元素出现在<prompt>元素中。
    VoiceXML平台必须是SSML中定义的Conforming Speech Synthesis Markup Language Processor。虽然平台要处理文档中定义的一个或多个“xml:lang”属性,但是并不要求平台必须是支持多语言的。当遇到一种不支持的语言时,平台要抛出error.unsupported.language事件,该事件在它的“_message”变量中指定了这种不支持的语言。
 
第二节 Basic Prompts   
          
 
    在前面的例子中你已经见过<prompt>元素了:
      <prompt>Please say your city.</prompt>
    你可以使用<prompt> ... </prompt>这种形式,如果:
      ·不需要指定该<prompt>元素的属性;
      ·该<prompt>元素的内容完全由PCDATA组成,或是由<audio>元素和<value>元素组成。
    例如,<prompt>元素可以包含如下内容:
      Please say your city.
										
      <audio src="say_your_city.wav"/>
    但是,在下面的例子中,<prompt>元素的内容需要嵌入语音标记:
      <prompt>Please <emphasis>say</emphasis> your city.</prompt>
 

第三节 Audio Prompting  
          
 
    提示语可以是预先录音的文件,音频流和合成语音这三种方式的任意组合:
      <prompt>
        Welcome to the Bird Seed Emporium.
        <audio src="rtsp://www.birdsounds.example.com/thrush.wav"/>
        We have 250 kilogram drums of thistle seed for
        <say-as interpret-as="currency">$299.95</say-as>
										
         plus shipping and handling this month.
        <audio src="http://www.birdsounds.example.com/mourningdove.wav"/>
      </prompt>
    在任何提示中都可以播放音频。音频的内容可以通过URI指定;在VoiceXML中,它也可以是先前录音的一个音频变量(audio variable):
      <prompt>
        Your recorded greeting is
        <audio expr="greeting"/>
        To rerecord, press 1.
        To keep it, press pound.
        To return to the main menu press star M.
        To exit press star, star X.
      </prompt>
    当声音文件或音频流不可用时,<audio>元素可以有备用的内容:
      <prompt>
        <audio src="welcome.wav">
        <emphasis>Welcome</emphasis> to the Voice Portal.
        </audio>
      </prompt>
    如果声音文件不能播放(例如,“src”指向的或“expr”求得的值为一个无效的URI,或者声音文件的格式是平台不支持的格式等),该<audio>的内容就会被播放。这些内容可以是文本、语音标记或者另外的<audio>元素。如果声音文件不能播放,且该<audio>元素的内容为空,则不会有任何声音,也不会抛出error事件。
    如果<audio>元素包含有“expr”属性,该属性求得的值为ECMAScript的undefined,则该元素,包括它的备用内容,被忽略。这样,开发者就可以动态的指定<audio>元素的内容,如果不需要播放该元素,就可以给它的“expr”属性赋一个null值来忽略它。下面的例子展示了该技巧怎样用在回放由几个音频片断组成的一组卡的信息:
      <?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>
           <!-- script contains the function sayCard(type,position)
                which takes as input the type of card description (audio or text) and
                 its position in an array, and returns the selected card description in
                 the specified array position; if there is no description in the 
                 requested array position, then returns EMCAScript undefined -->
										
          <script src="cardgame.js"/>
										
          <field name="takecard">
             <grammar type="application/srgs+xml" src="/grammars/boolean.grxml"/>
             <prompt>
                <audio src="you_have.wav">You have the following cards: </audio>
                <!-- maximum of hand of 5 cards is described -->
                <audio expr="sayCard(audio,1)"><value expr="sayCard(text,1)"/></audio>
                <audio expr="sayCard(audio,2)"><value expr="sayCard(text,2)"/></audio>
                <audio expr="sayCard(audio,3)"><value expr="sayCard(text,3)"/></audio>
                <audio expr="sayCard(audio,4)"><value expr="sayCard(text,4)"/></audio>
                <audio expr="sayCard(audio,5)"><value expr="sayCard(text,5)"/></audio>
                <audio src="another.wav">Would you like another card?</audio>
             </prompt>
             <filled>
               <if cond="takecard">
                 <script>takeAnotherCard()</script>
                 <clear/>
               <else/>
                 <goto next="./make_bid.aspl"/>
               </if>
             </filled>
           </field>
        </form>
      </vxml>
    SSML中定义的<audio>的属性有:
src 要引用的音频的URI。必须支持的声音文件格式见附录E;其他格式的声音文件,如果平台支持的话,在这里也可以用。
表35:<audio> 从SSML继承的属性
    VoiceXML中定义的<audio>元素的属性:
fetchtimeout 见6.1节。默认为fetchtimeout property指定的值。
fetchhint 见6.1节。默认为audiofetchhint property指定的值。
maxage 见6.1节。默认为audiomaxage property指定的值。
maxstale 见6.1节。默认为audiomaxstale property指定的值。
expr ECMAScript表达式,它求得的值为要播放的音频源。该表达式可以引用先前<record>元素录下的音频,也可以是要获取的音频源的URI的值。
表36:<audio> VoiceXML中加入的属性
    必须指定属性“src”和“expr”其中的一个,否则会抛出error.badfetch事件。
    注意:音频流是平台播放的最佳选择:即当获得一部分音频的内容时,平台就可以开始播放,而不用等到完全获得音频。如果fetchhint的值为"prefetch",则必须预先获得完整的音频才可以进行回放。

第四节 <value> Element 
         
 
    <value>元素用于把表达式的值插入到提示语中。它的属性有:
exprECMAScript表达式。
表37:<value>元素的属性
    例如,如果n为12,该<prompt>元素
      <prompt>
        <value expr="n*n"/> is the square of <value expr="n"/>.
      </prompt>
把字符串“144 is the square of 12”传给语音合成引擎。
    播放<value>元素值的方式由它两端的语音合成标记控制。例如,下面的例子把<value>元素的值读成日期形式:
      <var name="date" expr="'2000/1/20'"/>
        <prompt>
          <say-as interpret-as="date"> <value expr="date"/> </say-as>.
        </prompt>
    被<value>元素插入的文本不会受到任何特别的解释。特别的,它不会作为一个SSML文档或文档段被解释。XML特定的字符(&,<和>)不会被特别对待,也不需要避开。<value>元素在CDATA部分求得的值插入一段文本也是一样的结果。例如,下面赋值的变量
      <script>
        <![CDATA[
             e1 = 'AT&T';
         ]]>
      </script>
在一个<prompt>元素中被引用时
      <prompt>The price of<value expr="e1"/> is $1.</prompt>
输出如下结果:
      The price of AT&T is $1.
 

第五节 Bargein 
        
 
    如果执行平台支持bargein,则开发者就能够指定用户是否可以使用DTMF或语音打断正在播放的提示语。这样可以加快交互的速度,但并不是所有的情况我们都希望用户可以打断提示语。如果要求用户必须听完所有的警告,合法的通知或广告,则应该让bargein失效,可通过设置bargein属性达到。如下:
      <prompt bargein="false"><audio src="legalese.wav"/></prompt>
    如果一个<prompt>元素的bargein属性值为true,则用户可以打断该提示语;反之,如果bargein属性值为false,则用户必须听完该<prompt>元素的提示语。如果有几个<prompt>元素排队,则遵循正在播放的那个<prompt>元素的bargein属性值。如果在该序列中的某个<prompt>元素出现bargein,则其后的<prompt>元素都不会被播放(即使其中有的<prompt>元素的bargein属性值为false)。如果没有指定bargein属性,则使用bargein propery的值。
    当bargein属性值为false,则在播放<prompt>元素提示语时,输入是不会被缓冲的,且在跳转状态中,所有的DTMF输入缓冲均被删除(4.1.8描述了在跳转状态时输入的收集)。
    注意,不是所有的语音识别引擎或执行平台都支持bargein。一个支持bargein的平台必须支持下一节中描述的bargeintype中的一种。
    Bargein type
    当bargein为激活时,bargeintype用于表示平台要响应的语音或DTMF输入的bargein的类型。该属性允许的值为:
speech当检测到有DTMF或语音输入时,提示语马上停止播放,不管输入是否匹配激活的语法。
hotword直到检测到输入完全匹配一个激活的语法时,才马上停止播放提示语。不匹配语法的输入被忽略,且不会产生nomatch的事件。
表38:bargeintype 的值
    如果没有指定bargeintype属性,则使用bargeintype property的值。支持bargein的执行平台必须至少支持上述两种bargein类型中的一种。在一个<prompt>元素序中,混合使用这两种类型可能导致不可预知的行为,我们不鼓励这种做法。
    当bargeintype为speech时,由于语音识别技术的复杂性,语音输入的精确定义是依赖于执行平台的。我们期望一旦平台能够可靠的确定输入为语音时,就要立刻停止播放提示语。尽快停止播放提示语可避免"stutter"效应,免得用户以为系统没有听到语音而停止说了一半的话,并且从头开始说。
第六节 Prompt Selection  
         
 
    分级提示即每次播放的提示语都可以不一样。当用户对服务更熟悉时,提示语可变得更简短;而用户需要更多的帮助时,提示语可变得更详细;或者提示语不停的改变只是为了使交互更有趣。
    每个input item、<initial>元素和<menu>元素都有一个内部的提示语计数器,当进入该<form>元素或<menu>元素时,这些计数器被置为1。无论系统何时播放一个提示语,它相应的计数器都会增加1。这就是支持分级提示的机制。
    例如,下面的例子的form中有一个form级的<prompt>元素和几个filled级的<prompt>元素:
      <?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="tapered">
          <block>
            <prompt bargein="false">
               Welcome to the ice cream survey.
            </prompt>
          </block>
          <field name="flavor">
             <grammar mode="voice" version="1.0" root="root">
               <rule id="root" scope="public">
                <one-of>
                  <item>vanilla </item>
                  <item>chocolate </item>
                  <item>strawberry </item>
                </one-of>
              </rule>
            </grammar>
            <prompt count="1">What is your favorite flavor?</prompt>
            <prompt count="3">Say chocolate, vanilla, or strawberry.</prompt>
            <help>Sorry, no help is available.</help>
          </field>
        </form>
      </vxml>
    一个可能的对话流程:
      C: Welcome to the ice cream survey.
      C: What is your favorite flavor? (the "flavor" field's prompt counter is 1) 
      H: Pecan praline.
      C: I do not understand.
      C: What is your favorite flavor? (the prompt counter is now 2) 
      H: Pecan praline.
      C: I do not understand.
      C: Say chocolate, vanilla, or strawberry. (prompt counter is 3)
      H: What if I hate those?
      C: I do not understand.
      C: Say chocolate, vanilla, or strawberry. (prompt counter is 4) 
      H: ...
    当FIA选定提示语时,会检查它的计数器。小于或等于当前计数器值的<prompt>元素中,count属性值最高的被FIA选定并播放。如果没有指定count属性,则该属性的默认值为1。
    条件提示是指当条件满足时才播放该提示语。如下:
      <?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="another_joke">
          <var name="r" expr="Math.random()"/>
            <field name="another">
             <grammar type="application/srgs+xml" src="/grammars/boolean.grxml"/>
            <prompt cond="r < .50">
               Would you like to hear another elephant joke?
             </prompt>
             <prompt cond="r >= .50">
                For another joke say yes.  To exit say no.
              </prompt>
              <filled>
                <if cond="another">
                  <goto next="#pick_joke"/>
               </if>
            </filled>
          </field>
        </form>
      </vxml>
    当必须选择一个<prompt>元素时,根据下面的算法选择一组<prompt>元素进行排队。
      1、将该元素包含的所有<prompt>元素按照文档顺序形成一个有序的列表;
      2、将该列表中cond属性值为false的<prompt>元素删除;
      3、找出“正确的计数”:该列表中小于或等于当前计数器值,且count属性值最高的<prompt>元素;
      4、将该列表中所有不符合“正确的计数”的<prompt>元素删除,该列表中剩下的<prompt>元素排队进行播放。
 
第七节 Timeout  
          
 
    timeout属性指定了当最后一个<prompt>元素播放结束后,等待用户输入时,允许的静音时间。如果静音事件超过了timeout属性值,则抛出noinput事件。在<prompt>元素排队时,该属性默认为timeout property指定的值(见6.3.4节)。换句话说,每个<prompt>元素都有它自己的timeout值。
    允许指定<prompt>元素的timeout属性值是为了能够支持分级timeout。例如,用户在第一次输入时有5秒的事件,而第二次则有10秒。
    <prompt>元素的timeout属性决定了接下来用户输入的noinput timeout:
      <prompt count="1">
          Pick a color for your new Model T.
      </prompt>
										
      <prompt count="2" timeout="120s">
          Please choose color of your new nineteen twenty four
          Ford Model T. Possible colors are black, black, or
          black.  Please take your time.
     </prompt>
    如果在用户输入之前有几个<prompt>元素进行排队,则使用最后一个<prompt>元素的timeout属性值。

第八节 Prompt Queueing and Input Collection  
          
 
    VoiceXML解释器一直都处于下面的两种状态之一:
      ·在input itm 中等待输入(例如<field>,<record>或<transfer>元素) ;
      ·在input item中跳转以响应在等待状态中收集到的输入(包括语音输入、DTMF按键输入和与输入有关的的事件,如noinput和nomatch事件)。当在跳转状态时,任何语音输入都不会被收集、接受或解释。从而,root和文档级的语音语法在整个应用中可能都没有被激活的机会。然而,在跳转状态时,DTMF输入应该被收集并缓冲。同样的,和跳转的执行没有直接关系的异步产生的事件(如connection.disconnect.hangup事件)也应该被缓冲,直到等待状态才被删除。
    等待和跳转状态与FIA的几个阶段的关系如下:
      ·在一个input item的收集阶段开始时才进入等待状态(在解释器等待输入的那一刻)。
      ·跳转状态贯穿了处理阶段和选定阶段,包括control item(例如<block>元素)的选定阶段和input item的选定阶段,直到解释器等待输入的那一刻。
    分成两个状态是为了更好的简化编程的模型。特别的,这个模型让VoiceXML应用的开发者能够依靠所有的可执行内容(例如<filled>元素和<block>元素的内容)一直运行到完成要执行的操作。因为在跳转状态,正在执行的操作不会被用户的输入打断。
    在跳转状态有多种<prompt>元素进行排队,或者是可执行内容中的<prompt>元素,或者是form item中的<prompt>元素。另外,由于指定了fetchaudio属性,音频也可以参加排队。当出现下面的情况之一时,播放排队的<prompt>元素和音频:
      ·当解释器达到等待状态时,此时系统播放提示语,且解释器监听是否有匹配激活的语法的输入;
      ·当解释器开始获取资源(例如一个文档),且该元素指定了fetchaudio属性。在这种情况下,fetchaudio之前的提示语都会被播放,之后,如果确实需要获取资源(即该资源在缓存中不是非过期的),就播放该fetchaudio直到获取完成。在获取资源时,解释器处于跳转状态,且不接收任何输入。
    注意,如果一个<prompt>元素的bargein属性值为false,则输入不会被收集,且在跳转状态时,缓冲中的DTMF输入被删除(见4.1.5)。
    在解释器退出前,会播放完所有已排队的<prompt>元素。当解释器正在退出时,解释器保持在跳转状态,且不接受任何输入。
    一个允许的优化是:在达到等待状态之前的跳转状态期间就播放已排队的<prompt>元素。如果这样做的话,对于在播放<prompt>元素时接收到的输入音频的处理是能够保持正确的语义的。例如,对于bargein和语法的处理。
    下面的例子表明了,在某些情形下这些规则的操作。
    情形1
    典型的non-fetching情形:第一个<field>元素后面有可执行的内容(如<block>元素和<filled>元素),再后面是另外一个<field>元素。
      in document d0
										
      <field name="f0"/>
										
      <block>
          executable content e1
          queues prompts {p1}
      </block>
										
      <field name="f2">
        queues prompts {p2}
        enables grammars {g2}
     </field>
    在<field>元素f0的等待状态中接收到输入,导致了下面操作的发生:
      · 在跳转状态
        o 执行e1(没有<goto>元素)
        o 对<prompt>元素{p1}排队
        o 对<prompt>元素{p2}排队
      ·在等待状态中同时进行如下操作
        o 播放<prompt>元素{p1,p2}
        o 激活语法{g2},并等待输入
    情形2
    典型的获取资源的情形:第一个<field>元素后面是以<goto>元素为结尾的可执行内容,该<goto>元素指定了fetchaudio属性,并跳转到另一个文档中的<field>元素,该文档是从服务器获取的。
      in document d0
										
      <field name="f0"/>
										
      <block>
          executable content e1
          queues prompts {p1}
          ends with goto f2 in d1 with fetchaudio fa
      </block>
										
      in document d1
      <field name="f2">
        queues prompts {p2}
        enables grammars {g2}
     </field>
    在<field>元素f0的等待状态中接收到输入,导致了下面操作的发生:
      · 在跳转状态
        o 执行 e1
        o 对<prompt>元素 {p1}排队
        o 同时
          ·获取 d1
          ·播放 {p1} ,之后播放fa,直到获取资源完毕
        o 对<prompt>元素 {p2}排队
      ·在等待状态中同时进行如下操作
        o 播放 {p2}
        o 激活语法 {g2} 并等待输入
    情形3
    和情形2类似,只是没有指定fetchaudio属性。
      in document d0
										
      <field name="f0"/>
										
      <block>
          executable content e1
          queues prompts {p1}
          ends with goto f2 in d1 (no fetchaudio specified)
      </block>
										
      in document d1
      <field name="f2">
        queues prompts {p2}
        enables grammars {g2}
     </field>
    在<field>元素f0的等待状态中接收到输入,导致了下面操作的发生:
      · 在跳转状态
        o 执行 e1
        o 对<prompt>元素 {p1}排队
        o 获取 d1
        o 对<prompt>元素 {p2}排队
      ·在等待状态中同时进行如下操作
        o 播放<prompt>元素 {p1, p2}
        o 激活语法{g2},并等待输入
posted on 2006-09-16 22:29 铁观音 阅读(789) 评论(0)  编辑 收藏 引用 所属分类: VoiceXML2.0规范