我在网上广泛搜索了很多有关IVR技术实现细节的信息。但是,无法找到合适的结果。
任何人都可以帮助我了解IVR的详细信息(我的意思是详细的技术组件,它们的交互,集成,如何调用流,网络,服务器,涉及的数据库,需要输入输出响应)。我详细查找了VoiceXML,但它是怎么回事
需要了解IVR的技术架构。
需要使用Java开发IVR系统,但首先想了解上述信息,以便奠定基础。
答案 0 :(得分:1)
您想自己编写所有内容还是要使用像VXML这样的框架?如果你想自己写一些东西,那么制作一个VXML浏览器可能有点过头了。但是如果你只想编写VXML和JSP文件,那么你需要有一个VXML浏览器。另一方面,如果你想自己做所有事情,那么你需要担心抽象硬件 - 带有一个语音/传真/调制解调器的IVR需要不同于带有连接到T1线的Dialogic卡的IVR的低级代码。这与处理SIP呼叫的那个不同。
假设你有一个VXML浏览器并且你只需要提供VXML和JSP文件,那么你需要担心的是你是否只想要呼叫流程或者你是否要进行后端集成。如果你的IVE只是接听电话,请求来自呼叫者的一些输入,然后播放更多信息并挂断或转移然后它变得非常容易 - 你根本不需要Java。后端集成需要Java。
假设您将要进行后端集成 - 无论是数据库还是其他服务器的Web服务,您都需要担心异步执行后端呼叫 - 如果呼叫者听到超过一秒的死机而未收到警告他们会认为IVR不起作用并且会挂断。因此,当呼叫到达时,您需要发送初始数据请求,然后说“欢迎使用我的IVR”,然后尝试检索结果。如果结果尚未返回,您需要说出其他内容,然后再次检查。最终,如果请求没有返回,您需要一个备用计划 - 您可以说“该服务当前不可用”,然后转移或挂断,或者您可以提供减少的服务IVR。无论你做什么,你都不希望顾客听到沉默,除非你特意告诉他们你在等待什么 - 要么等待他们提供意见或等待他们的帐户细节(或类似的东西)。
要获得VXML和JSP的这种异步体验,您需要一个内存中的请求队列和一个可以提供工作线程来为这些请求提供服务的执行服务。这样,您可以对请求进行排队,并定期继续IVR调用流检查以获得结果。执行服务最终将处理请求并使用结果更新它。然后,当IVR检查并且请求可用时,它可以使用该信息。但是如果结果没有及时返回,则IVR将放弃并停止检查,因此您需要一个扫描队列的静态线程,并且在一段时间之后将取消请求,如果执行服务正在处理它然后从队列中删除请求。
如果您的VXML浏览器将语音排队并且不等待它实际播放,则语音提示将需要附加到不接受任何有效输入的语法,以便IVR知道语音何时完了。如果你在继续调用流程之前绝对需要后端请求的结果,你需要循环检查结果,直到它到达或者一个小的超时已经过去(多长时间取决于你是否警告他们可能需要一个或不)。同样的情况适用于这种情况 - 您需要播放附加到语法的小静音,以便呼叫流程在再次检查结果之前等待 - 通常没有多少点检查超过100毫秒。
如果你不打算使用VXML浏览器,而是自己写一些东西,那么同样的建议大多适用。但是如果你要进行后端集成,我建议让系统总是等待语音提示完成播放,而不是仅仅排队 - 它使一切变得更加容易。您仍然需要内存中队列和执行池,以便后端集成可以在后台完成。
答案 1 :(得分:1)
来自Twilio的Ricky。
我们建立了example IVR in Java你可以查看。通过我们的架构,当有人打电话给我们的IVR时,会向我们的服务器发出HTTP请求,我们会在这里提供一些基本指示,说明我们要使用TwiML回复用户的内容。这是我们示例中的代码,我们正在播放MP3并听取用户使用 verb按键盘上的数字:
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());
}
一旦用户按下数字,将对我们指定的行动路线(在这种情况下为/menu/show
)发出另一个HTTP请求,我们会查看用户按下的数字并采取行动:
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有帮助!