3

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

4

2 回答 2

8

我认为您是在询问 VoiceXML、TwiML 和 PlivoXML 之类的东西之间的区别。Tropo 和 Nexmo 都支持 VoiceXML,因此这是对 XML 格式(和相关平台)的比较,而不是特定供应商的比较。我添加了 PlivoXML,因为它与 TiwML 相似,但独一无二。免责声明:我为Nexmo工作。

这三个都描述了电话通话过程中发生的事情——机器如何与呼叫者交互。本质上是用于电话呼叫的 HTML,允许您向用户呈现信息(播放音频、阅读文本)或从用户那里获取信息(录制音频、识别语音、按数字)。

可移植性

VoiceXML 是一种行业标准,与 HTML 一样,它由 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 允许您像浏览器一样跟踪某些会话;然而,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 文档中添加对会议的呼叫。TwiML 还支持来自 TwiML 的队列概念(并添加对它的调用)(PlivoXML 不支持该队列)。VoiceXML 在 VXML 文档中没有会议或排队的概念(但是,API 可以提供一个外部机制来将多个活动呼叫一起会议)。

_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 的文档Nexmo 的 VXML 快速入门W3C 的 VXML 文档的示例。

于 2015-03-05T21:16:17.690 回答
1

只是在这里添加一个选项,即 Restcomm https://www.restcomm.com/

请注意,Restcomm 也有语音识别,也就是自动语音识别或 ASR。

除了 Restcomm 还带有可视化设计工具,允许通过简单的拖放功能定义呼叫流程。

Restcomm 和 Twilio、Plivo 等在 VXML 之上添加了许多功能,例如 WebRTC。

所有这些还公开了 SDK,因此开发人员可以直接在 Android 或 iOS 上开发应用程序。

这些相对于 VXML 的最大优势是 API 的简单性。作为开发人员,您可能希望专注于业务逻辑,而不是被拖入复杂的 XML 结构中。API 的暴露 JSON 对开发人员来说是最强大的灵活性。

兄弟,阿米特。

于 2018-06-12T14:58:46.717 回答