首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IVR技术实现详情

IVR技术实现详情
EN

Stack Overflow用户
提问于 2013-10-18 18:23:40
回答 2查看 862关注 0票数 2

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

谁能告诉我IVR是什么(我的意思是详细的技术组件,它们的交互,集成,如何调用流程,网络,服务器,涉及的数据库,所需的输入输出响应)。我详细地查找了VoiceXML,但是它是如何

需要了解IVR的技术架构。

需要开发一个使用Java的IVR系统,但首先想知道上面的信息,以便做一个基础基础。

EN

回答 2

Stack Overflow用户

发布于 2013-11-16 15:30:55

您是想自己编写所有内容,还是想有一个像VXML这样的框架来使用?如果您只想编写VXML和JSP文件,那么您需要一个VXML浏览器。如果你想完全自己编写所有的东西,那么做一个VXML浏览器可能是大材小用了,而且,不管你做的是VXML浏览器还是别的什么,你都需要担心硬件的抽象化--一个语音/传真/调制解调器的IVR需要不同的低级代码,而不是一个连接到T1线路上的Dialogic卡的IVR,这与只处理SIP线的IVR是不同的。

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

假设您要进行后端集成-无论是数据库还是到另一台服务器的web服务,您都需要担心异步执行后端调用-如果呼叫者听到超过一秒钟的死气沉沉而没有得到警告,他们将认为IVR不工作,并将挂断。因此,当呼叫到达时,您需要发送最初的数据请求,然后说“欢迎使用我的IVR”,然后尝试检索结果。如果结果还没有返回,你需要说一些其他的东西,比如“请稍候,我正在检索你的详细信息”,然后再检查一遍。最后,如果请求没有返回,你需要一个后备计划-你可以说“该服务当前不可用”,然后转接或挂断,或者你可以提供一个减少的服务IVR。无论你做什么,你都不希望客户听到超过一秒的沉默,除非你明确告诉他们你在等待什么--要么等待他们输入,要么等待他们的账户详细信息(或类似的东西)。

要获得这种使用VXML和JSP的异步体验,您将需要一个内存中的请求队列和一个执行服务,该服务可以提供工作线程来服务这些请求。这样,您就可以对请求进行排队,并定期继续IVR调用流检查以获得结果。执行服务最终将处理该请求,并使用结果更新它。然后,当IVR检查并且请求可用时,它可以使用该信息。

VXML brower对语音进行排队,而不是等到检索到呼叫者输入时才实际播放它,因此,如果您在检索数据时使用语音停止,则语音提示将需要附加到不接受任何有效输入的语法,以便IVR知道语音何时结束。同样的事情也适用于这种情况-你将需要在语法上附加一小段静音,以便调用流在再次检查结果之前等待-通常不会有太多的点检查超过100ms-200ms。

如果您不打算使用VXML浏览器,而是自己编写一些代码,那么同样的建议也是适用的。但是,如果你打算进行后端集成,我建议让系统总是等待语音提示播放完毕,而不是仅仅将其排队--这会让一切变得更容易。您仍然需要内存中的队列和一个执行池,以便后端集成可以在后台完成。

票数 2
EN

Stack Overflow用户

发布于 2016-04-06 22:37:10

从Twilio来的瑞奇。

我们建了一个example IVR in Java,你可以去看看。在我们的架构中,当有人打电话给我们的IVR时,会向我们的服务器发出一个超文本传输协议请求,我们在那里提供一些使用TwiML回复用户的基本指令。下面是我们示例中的代码,我们播放一个MP3,并监听用户使用 verb在键盘上按下一个数字

代码语言:javascript
复制
   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),我们将查看用户按下了哪个数字并执行操作:

代码语言:javascript
复制
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的对您有所帮助!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19447305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档