我有2个vxml文档,如下所示:
<vxml xmlns="http://www.w3.org/2001/vxml" version="2.0">
<catch event="error.badfetch">
<prompt> Error in fetching document. end of test</prompt>
<exit />
</catch>
<catch event="error.connection.baddestination">
<prompt> Error 600. End of test</prompt>
<exit />
</catch>
<form id="main_menu">
<property name="confidencelevel" value="0.1" />
<field name="menu_choice" type="digits?maxlength=1">
<prompt>
<break time="1s" />
Enter a number
</prompt>
<filled>
<prompt>
<break time="1.5s" />
This is not Google voice
<break time="2s" />
</prompt>
<goto next="doc2.vxml" />
</filled>
</field>
</form>
</vxml>
<?xml version="1.0" ?>
<vxml xmlns="http://www.w3.org/2001/vxml" version="2.0">
<form id="main">
<property name="ttsengine" expr="'google-tts'" />
<block>
<log>Google TTS test</log>
</block>
<field name="menu_choice" type="digits?maxlength=1">
<prompt>This is Google voice</prompt>
<filled>
<goto next="doc1.vxml" />
</filled>
</field>
</form>
</vxml>
我的问题: 在doc1.vxml中,将ttsengine设置为mrcp时,“这不是Google语音”已排队(未播放)。在doc2.vxml中,ttsengine设置为google。然后2条提示:使用Google引擎同时播放了“这不是Google语音”和“这是Google语音”。这是正确的还是应该使用mrcp播放1,使用google播放第二?
答案 0 :(得分:1)
据我所知,VoiceXML specification没有规定任何特定的行为。
我的期望是,VoiceXML解释器应该将所有与生成相同输出相关的一切都与第一个提示放在队列中,就好像在队列中播放该输出一样,包括影响生成的输出的任何非标准属性,例如ttsengine
属性。不幸的是,VoiceXML标准没有认可 generation 步骤的这一概念。它只是排队或播放,未指定生成提示的实际时刻。 audiofetchhint
属性会影响VoiceXML平台何时实际获取音频文件,但语音合成没有等效条件。
如果在fetchaudio
元素上添加goto
,则提示队列应在第一个文档上被清空(并因此生成) 。请注意,如果要在第二个问题中启用插入功能的情况下播放此提示,则不一定是正确的解决方法。
根据规格:
处于过渡状态时,各种提示会排队,或者通过 可执行内容中的元素或
<prompt>
元素中的元素 在表单项中。另外,音频可能会被fetchaudio排队 属性。排队的提示和音频都会播放
- 当翻译到达等待状态时,此时 播放提示,解释器监听匹配的输入 活动语法之一,或者
- 当口译员开始获取一个 指定了
fetchaudio
的资源(例如文档)。在 在这种情况下,在播放fetchaudio
之前排队的提示 完成,然后,如果实际上需要获取资源 (即,它不会在缓存中过期),将播放fetchaudio
直到提取完成。口译员仍留在 处于过渡状态,并且在提取期间不接受任何输入。
答案 1 :(得分:0)
您需要将控制权交还给用户,以便在进入下一个文档之前刷新提示缓冲区。
要完成上述工作,请在goto之前添加一个简单的菜单。
伪类似:
menu collect digits
play digits voice one
menu press 1 to hear the same in another voice
goto voice two
play digits voice two