2

我在网上广泛搜索了很多关于 IVR 技术实现细节的信息。但是,找不到合适的结果。

任何人都可以帮助我详细了解 IVR 是什么(我的意思是涉及的详细技术组件、它们的交互、集成、呼叫流程、网络、服务器、所涉及的数据库、所需的输入输出响应)。我详细找了VoiceXML,但是怎么样

需要了解IVR的技术架构。

需要使用Java开发IVR系统,但首先要了解以上信息,以便打下基础。

4

2 回答 2

2

您想自己编写所有内容,还是需要使用 VXML 之类的框架?如果您只想编写 VXML 和 JSP 文件,那么您需要有一个 VXML 浏览器。如果您想完全自己编写所有内容,那么制作 VXML 浏览器可能是矫枉过正,无论您是制作 VXML 浏览器还是其他东西,您都需要担心硬件的抽象 - 带有一个语音/传真/调制解调器的 IVR 将与对话卡连接到 T1 线路的 IVR 需要不同的低级代码,并且与仅处理 SIP 呼叫的 IVR 不同。

假设您已经有一个 VXML 浏览器,并且您只需要提供 VXML 和 JSP 文件,那么您需要担心的是您是否只需要调用流或是否要进行后端集成。如果您的 IVR 只是要接听电话,请询问呼叫者的一些输入,然后播放更多信息并挂断或转移,那么它变得非常容易 - 您根本不需要 Java。后端集成需要 Java。

假设您将进行后端集成 - 无论是数据库还是 Web 服务到另一台服务器,您都需要担心异步执行后端调用 - 如果调用者听到超过一秒钟的死气而没有被警告他们会认为IVR 不工作,将挂断。因此,当呼叫到达时,您需要发送初始数据请求,然后说“欢迎使用我的 IVR”,然后尝试检索结果。如果尚未返回结果,您需要说其他内容,例如“请稍候,我正在检索您的详细信息”,然后再次检查。最终,如果请求没有返回,您需要一个后备计划 - 您可以说“该服务当前不可用”然后转移或挂断,或者您可以提供减少的服务 IVR。无论你做什么,你都不会

要获得这种对 VXML 和 JSP 的异步体验,您将需要一个内存中的请求队列和一个可以提供工作线程来服务这些请求的执行服务。这样,您可以将请求排队并定期继续 IVR 呼叫流检查以获取结果。执行服务最终将处理请求并使用结果更新它。然后,当 IVR 检查并且请求可用时,它可以使用该信息。但是,如果结果没有及时返回,IVR 将放弃并停止检查,因此您需要一个扫描队列的静态线程,如果执行服务正在处理它,那么在一定时间后将取消请求,然后从队列中删除请求。

VXML 浏览器对语音进行排队,并且在检索到呼叫者输入之前不会等待它实际播放,因此如果您在检索数据时使用语音暂停,那么语音提示将需要附加到不支持的语法接受任何有效输入,以便 IVR 知道语音何时结束。如果您在继续调用流程之前绝对需要后端请求的结果,您将需要循环检查结果,直到它到达或小超时已经过去(多长时间取决于您是否警告过他们可能需要期间与否)。在这种情况下同样适用 - 您需要播放附加到语法的小静默,以便调用流程在再次检查结果之前等待 - 通常没有比 100ms-200ms 更频繁的点检查。

如果您不打算使用 VXML 浏览器,而是自己编写一些东西,那么同样的建议大多适用。但是,如果您要进行后端集成,我建议您让系统始终等待语音提示完成播放,而不是仅仅排队——这让一切变得更加容易。您仍然需要内存队列和执行池,以便可以在后台完成后端集成。

于 2013-11-16T07:30:54.823 回答
2

来自 Twilio 的 Ricky 在这里。

我们用 Java 构建了一个示例 IVR,您可以查看。在我们的架构中,当有人打电话给我们的 IVR 时,会向我们的服务器发出 HTTP 请求,我们会在其中提供一些基本指令,说明我们希望使用TwiML回复用户的内容。这是我们示例中的代码,我们正在播放 MP3 并聆听用户使用动词按下键盘上的数字:

   protected void doPost(HttpServletRequest servletRequest, HttpServletResponse servletResponse)
            throws IOException {

        Gather gather = new Gather();
        gather.setAction("/menu/show");
        gather.setNumDigits(1);

        Play play = new Play("http://howtodocs.s3.amazonaws.com/et-phone.mp3");
        play.setLoop(3);

        try {
            gather.append(play);
        } catch (TwiMLException e) {
            e.printStackTrace();
        }

        TwiMLResponse twiMLResponse = new TwiMLResponse();
        try {
            twiMLResponse.append(gather);
        } catch (TwiMLException e) {
            e.printStackTrace();
        }

        servletResponse.setContentType("text/xml");
        servletResponse.getWriter().write(twiMLResponse.toXML());
    }

一旦用户按下一个数字,就会向我们指定的动作路由发出另一个 HTTP 请求(/menu/show在这种情况下),我们会在其中查看用户按下的数字并采取行动:

protected void doPost(HttpServletRequest servletRequest, HttpServletResponse servletResponse)
            throws IOException {

        String selectedOption = servletRequest.getParameter("Digits");
        Map<String, String> optionPhones = new HashMap<>();
        optionPhones.put("2", "+12024173378");
        optionPhones.put("3", "+12027336386");
        optionPhones.put("4", "+12027336637");

        TwiMLResponse twiMLResponse = null;

        try {
            twiMLResponse = optionPhones.containsKey(selectedOption)
                    ? dial(optionPhones.get(selectedOption))
                    : Redirect.toMainMenu();
        } catch (TwiMLException e) {
            e.printStackTrace();
        }

        servletResponse.setContentType("text/xml");
        servletResponse.getWriter().write(twiMLResponse.toXML());
    }

希望看看我们如何构建此 IVR 有所帮助!

于 2016-04-06T14:37:09.603 回答