- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我的任务是研究这两种实现之间的差异,以便更好地理解两者在开发难度和功能集方面的差异,但我没有发现两者之间有任何清晰简洁的比较。
最佳答案
我认为您是在询问 VoiceXML、TwiML 和 PlivoXML 等事物之间的区别。 Tropo 和 Nexmo 都支持 VoiceXML,因此这是对 XML 格式(和相关平台)的比较,而不是特定供应商的比较。我添加了 PlivoXML,因为它类似于 TiwML,但很独特。免责声明:我为 Nexmo 工作。
这三者都描述了通话过程中发生的事情——机器如何与调用者互动。本质上是用于电话调用的 HTML,允许您向用户呈现信息(播放音频、阅读文本),或从用户那里获取信息(录制音频、识别语音、按数字)。
VoiceXML 是行业标准,与 HTML 一样,它是 managed by the W3C 。 TwiML 和 PlivoXML 都是专有的。这意味着 VoiceXML 应用程序不依赖于特定的供应商。
这三个都支持录制音频或捕获 DTMF(按键)。 VoiceXML 支持语法,允许您识别语音并调整该识别引擎。 TwiML 和 PlivoXML 没有这种支持。
TwiML 示例(期望 DTMF):
<Response>
<Gather action="process.php">
<Say>Press a few digits.</Say>
</Gather>
</Response>
VoiceXML 示例(期望 DTMF 或识别):
<vxml version = "2.1">
<form>
<field name="department">
<prompt>Press 1 or say sales, press 2 or say support.</prompt>
<grammar xml:lang="en-US" root = "TOPLEVEL" mode="voice" >
<rule id="TOPLEVEL" scope="public">
<one-of>
<item> sales </item>
<item> support </item>
</one-of>
</rule>
</grammar>
<grammar xml:lang="en-US" root = "TOPLEVEL" mode="dtmf" >
<rule id="TOPLEVEL" scope="public">
<one-of>
<item> 1 <tag> out.department="sales"; </tag> </item>
<item> 2 <tag> out.department="support"; </tag> </item>
</one-of>
</rule>
</grammar>
</field>
<block>
<submit next="../php/form.php" method="post"/>
</block>
</form>
</vxml>
这三个都支持文本到语音和播放音频(通过链接引用)。 Plivo 还允许您使用 API 为正在进行的通话播放音频,但这不在 PlivoXML 的上下文中。
TwiML 示例:
<Response>
<Say>Hello From TwiML</Say>
</Response>
VoiceXML 示例:
<vxml version="2.1">
<form>
<block>
<prompt>Hello from VXML!</prompt>
</block>
</form>
</vxml>
TwiML 和 PlivoXML 允许您像浏览器一样跟踪某些 session ;然而,VoiceXML 有一个更有用的状态概念,允许您在多个请求之间共享变量。
TwiML 或 PlivoXML 文档一次只能真正收集一件事 从用户那里获取数字或记录实际上类似于具有单个元素的表单发布。
VoiceXML 形式不限于单个输入,并且包含已识别语音、DTMF 按下、录音的多个字段。 VoiceXML 还允许在同一文档中向用户播放/读回该数据,因为它只是一个变量。事实上,单个 VoiceXML 文档可以有多种形式,用户可以在这些形式之间导航。
VoiceXML 示例:
<form id="welcome">
<field name="customer_type">
<prompt>Say 'new' or press 1 if you're a new customer, press 2 or say 'existing' if you have an account.</prompt>
<grammar xml:lang="en-US" root = "TOPLEVEL" mode="voice" >
...
</grammar>
<grammar xml:lang="en-US" root = "TOPLEVEL" mode="dtmf" >
...
</grammar>
</field>
<filled>
<prompt cond="customer_type=='new'">
Thanks for contacting us.
</prompt>
<prompt cond="customer_type=='existing'">
Thanks for being a loyal customer.
</prompt>
<goto expr="'#' + customer_type" />
</filled>
</form>
TwiML 和 PlivoXML 支持在 XML 文档中添加对 session 的调用。 TwiML 还支持直接来自 TwiML 的队列概念(并向其添加调用)(PlivoXML 没有该队列支持)。 VoiceXML 在 VXML 文档中没有 session 或排队的概念(但是,API 可以提供一种外部机制来将多个事件调用一起 session )。
_TwiML 示例:
<Response>
<Dial>
<Conference>Room 1234</Conference>
</Dial>
</Response>
这三者都支持为正在进行的通话添加第二条线路。 VoiceXML 允许您使用传输的输出来指导文档的其余部分。
TwiML 示例:
<Response>
<Dial timeout="10" record="true">415-123-4567</Dial>
</Response>
VoiceXML 示例:
<vxml version = "2.1">
<form>
<transfer name="result" dest="tel:+14158058810" bridge="true">
<prompt>Please wait while we transfer you.</prompt>
<grammar xml:lang="en-US" root = "TOPLEVEL" mode="voice">
<rule id="TOPLEVEL" scope="public">
<one-of>
<item> disconnect </item>
</one-of>
</rule>
</grammar>
</transfer>
<filled>
<if cond="result == 'busy'">
<prompt>Sorry, they're busy.</prompt>
<elseif cond="result == 'noanswer'" />
<prompt>Sorry, they didn't answer.</prompt>
<else />
<prompt>You spoke for <value expr="result$.duration" /> seconds.</prompt>
</if>
<if cond="result$.inputmode == 'voice'">
You ended the call by saying, <value expr="result$.utterance" />.
</if>
</filled>
<block>
Thanks for using the transfer element.
</block>
</form>
</vxml>
可扩展性:这三个都允许调用遵循链接到另一个 VoiceXML/TwiML/PlivoXML 文档的一些概念。然而,VoiceXML 有子对话的概念,其中控制被转移到另一个 VoiceXML 应用程序,返回值被传递回调用应用程序。这可以允许与(或开发)通用外部服务集成。
VoiceXML 示例:
<form id="billing_adjustment">
<var name="account_number"/>
<var name="home_phone"/>
<subdialog name="accountinfo" src="acct_info.vxml#basic">
<filled>
<!-- Note the variable defined by "accountinfo" is
returned as an ECMAScript object and it contains two
properties defined by the variables specified in the
"return" element of the subdialog. -->
<assign name="account_number" expr="accountinfo.acctnum"/>
<assign name="home_phone" expr="accountinfo.acctphone"/>
</filled>
</subdialog>
....
</form>
示例基于/复制自 Twilio's Docs 、 Nexmo's VXML Quickstarts 和 W3C's VXML Documentation 。
关于xml - VoiceXML 和 TwiML/PlivoXML 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28801353/
平时很少在jquery中用到this。查看代码时发现用到了,就调试出this的值,心想原来如此。还是挺有用的。这里总结一下this与$(this)的区别和使用。 $(this)生成的是什么?
使用单例类和应用程序范围的托管 bean 来保存应用程序数据有区别吗? 我需要查找某些 JNDI 资源,例如远程 bean 接口(interface),因此我为自己编写了一个单例来缓存我的引用并且只允
如果您仔细查看包含的图片,您会注意到您可以使用 Eclipse IDE 重构 Groovy 代码并将方法转换为闭包,反之亦然。那么,闭包到底是什么,它与方法有什么不同呢?有人可以举一个使用闭包的好例子
vagrant box repackage有什么区别( docs ) 和 vagrant package ( docs )? 我意识到 vagrant package仅适用于 VirtualBox 提
我想看看是否有人可以解释为什么以下代码适用于 valueOf 但不适用于其他代码。 import java.math.BigDecimal; public class Change { publ
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicates: What is Closures/Lambda in PHP or Javascript in layman te
This question already has answers here: Vagrant, Docker, Puppet, Chef (3个答案) 2年前关闭。 docker和chef有什么共同
以下代码在95%的机器上产生相同的输出,但是在几台机器上却有所不同。在 Debug模式下,输出: Changing from New to Fin OK 但在 Release模式下: Changing
////Creating Object var Obj; // init Object Obj= {}; 它们之间有什么区别两个? 有没有可能把它变成一个单行? 这样使用有什么好处吗?
我想找出定时器服务之间的区别。我应该使用哪个以及何时使用。我正在使用 Jboss 应用服务器。 1) java.ejb.Schedule。 @Schedule注解或配置自xml。 2) javax.e
我发现在 C++ 中可以通过三种不同的方式将对象传递给函数。假设我的类(class)是这样的: class Test { int i; public: Test(int x);
有什么区别。 public class Test { public static void main(String args[]) { String toBeCast = "c
如果我有一列,设置为主索引,设置为INT。 如果我不将其设置为自动递增,而只是将唯一的随机整数插入其中,与自动递增相比,这是否会减慢 future 的查询速度? 如果我在主索引和唯一索引为 INT 的
这两种日期格式有什么区别。第一个给出实际时间,第二个给出时间购买添加时区偏移值。 NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]
如果有一个函数,请说foo: function foo() { console.log('bar'); } 那么在 JavaScript 中,从另一个函数调用一个函数有什么区别,如下所示: f
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
代码是什么: class Time { private: int hours; int minutes; int seconds; pu
我知道这是非常基本的,但有人介意解释一下这两个数组声明之间的区别吗: #include array myints; ...和: int myints[5]; ...以及为什么 myints.size
我学会了如何根据 http://reference.sitepoint.com/css/specificity 计算 css 特异性但是,基于this reference,我不明白伪类(来自c)和伪元
为什么在运行 2) 时会出现额外的空行?对我来说 1 就像 2。那么为什么 2) 中的额外行? 1) export p1=$(cd $(dirname $0) && pwd) #
我是一名优秀的程序员,十分优秀!