VoiceXML和TwiML/PlivoXML之间有什么区别?

VoiceXML和TwiML/PlivoXML之间有什么区别?,xml,twilio,voicexml,nexmo,tropo,Xml,Twilio,Voicexml,Nexmo,Tropo,我的任务是研究这两种实现之间的差异,以便更好地理解这两种实现在开发难度和功能集方面的差异,但我没有发现这两种实现之间有任何清晰、简洁的比较。我想你是在问VoiceXML、TwiML、,和PlivoXML。Tropo和Nexmo都支持VoiceXML,因此这是XML格式(和相关平台)的比较,而不是特定供应商的比较。我添加了PlivoXML,因为它类似于TiwML,但很独特。免责声明:我为你工作 这三个都描述了在电话通话过程中发生的事情——机器如何与来电者进行交互。基本上是电话的HTML,允许您向用

我的任务是研究这两种实现之间的差异,以便更好地理解这两种实现在开发难度和功能集方面的差异,但我没有发现这两种实现之间有任何清晰、简洁的比较。

我想你是在问VoiceXML、TwiML、,和PlivoXML。Tropo和Nexmo都支持VoiceXML,因此这是XML格式(和相关平台)的比较,而不是特定供应商的比较。我添加了PlivoXML,因为它类似于TiwML,但很独特。免责声明:我为你工作

这三个都描述了在电话通话过程中发生的事情——机器如何与来电者进行交互。基本上是电话的HTML,允许您向用户提供信息(播放音频、阅读文本)或从用户处获取信息(录制音频、识别语音、按数字)

便携性 VoiceXML是一个行业标准,与HTML一样,它也是。TwiML和PlivoXML都是专有的。这意味着VoiceXML应用程序与特定的供应商无关

输入 这三个都支持录制音频或捕获DTMF(按键)。VoiceXML支持语法,允许您识别语音,并调整识别引擎。TwiML和PlivoXML没有这种支持

TwiML示例(应为DTMF):


按几个数字。
VoiceXML示例(需要DTMF或识别):


按1或说销售,按2或说支持。
出售
支持
1 out.部门=“销售”;
2 out.department=“支持”;
输出 三者都支持文本到语音和播放音频(通过链接引用)。Plivo还允许您使用API为正在进行的调用播放音频,但这不在PlivoXML的上下文中

TwiML示例:

<Response>
    <Dial>
        <Conference>Room 1234</Conference>
    </Dial>
</Response>

TwiML的你好
VoiceXML示例:

<Response>
    <Dial>
        <Conference>Room 1234</Conference>
    </Dial>
</Response>

你好,来自VXML!
变量与状态 TwiML和PlivoXML允许您像浏览器一样跟踪某些会话;然而,VoiceXML有一个更有用的状态概念,允许您跨多个请求共享变量

TwiML或PlivoXML文档一次只能收集一件东西从用户处获取数字或记录实际上类似于带有单个元素的表单post

VoiceXML表单不仅限于单个输入,还包含可识别语音、DTMF按键和录音的多个字段。VoiceXML还允许在同一文档中向用户播放/读回数据,因为它只是一个变量。事实上,一个VoiceXML文档可以有多个表单,用户可以在这些表单之间导航

VoiceXML示例:

<Response>
    <Dial>
        <Conference>Room 1234</Conference>
    </Dial>
</Response>

如果您是新客户,请说“新”或按1;如果您有帐户,请按2或说“现有”。
...
...
谢谢联系我们。
感谢您成为一位忠实的客户。
会议和队列 TwiML和PlivoXML支持在XML文档中添加对会议的调用。TwiML还支持TwiML中的队列概念(并向其添加调用)(PlivoXML不支持该队列)。VoiceXML在VXML文档中没有会议或排队的概念(但是,API可以提供一种外部机制来将多个活动调用会议在一起)

_TwiML示例:

<Response>
    <Dial>
        <Conference>Room 1234</Conference>
    </Dial>
</Response>

1234房间
转移 这三种方法都支持在正在进行的通话中添加第二段通话。VoiceXML允许您使用传输的输出来指导文档的其余部分

TwiML示例:

<Response>
    <Dial>
        <Conference>Room 1234</Conference>
    </Dial>
</Response>

415-123-4567
VoiceXML示例:


请稍候,我们正在为您转接。
断开
对不起,他们很忙。
对不起,他们没有回答。
你说了几秒钟。
您在结束通话时说。
感谢您使用传输元件。
可扩展性:这三种方法都允许调用遵循指向另一个VoiceXML/TwiML/PlivoXML文档的链接概念。但是,VoiceXML有子对话框的概念,在子对话框中,控制权被转移到另一个VoiceXML应用程序,返回值被传递回调用应用程序。这可以允许与通用外部服务集成(或开发)

VoiceXML示例:

<Response>
    <Dial>
        <Conference>Room 1234</Conference>
    </Dial>
</Response>


,以及。

只需在此处添加一个选项,即restcom

请注意,Restcomm还具有语音识别,即自动语音识别或ASR

此外,Restcomm还提供了可视化设计器工具,允许通过简单的拖放功能定义调用流

Restcomm和Twilio、Plivo等在VXML之上添加了许多特性,如WebRTC

所有这些还公开了SDK的功能,因此开发者可以直接在Android或iOS上开发应用程序

与VXML相比,这些方法的最大优点是API的简单性。作为开发人员,您可能希望将重点放在业务逻辑上,而不是拖进复杂的XML结构中。API公开JSON对开发人员来说是最强大的灵活性<Response> <Dial timeout="10" record="true">415-123-4567</Dial> </Response>
<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>
<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>