2013-10-18 152 views
1

我廣泛搜索了很多關於網絡上的IVR技術實現細節。但是,找不到合適的結果。IVR技術實現細節

誰能幫我對IVR是什麼細節(我的意思是要求涉及詳細的技術組件,它們的互動,融合,呼叫流程,網絡,服務器,數據庫,如何參與,輸入輸出響應)。我看着VoiceXML的詳細,但它是如何

需要知道IVR的技術架構。

需要開發使用Java的IVR系統,但首先想了解上述信息,從而使基礎的基礎。

+0

如果你自己寫它,並計劃使用Dialogic卡,並正在尋找一種方法來避免自己編寫JNI的東西,你可能會對http://d4j.sourceforge.net/感興趣(我剛剛發現它谷歌搜索 - 我沒有嘗試過自己) –

回答

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布勞爾排隊的聲音,不等待它實際起到然後將所需要的語音提示附加到AA語法只是使得IVR知道什麼時候不接受任何有效的輸入聲音結束。如果你確實需要後端請求的結果繼續呼叫流程之前,您需要執行循環檢查結果,直到它到達或一個很小的超時時間(多久取決於你是否警告他們可能採取而不是)。同樣的情況適用於這種情況 - 您需要在語法上附加一個小沉默,以便呼叫流程在再次檢查結果之前等待 - 通常沒有太多的點檢查超過100毫秒。

如果你不打算使用VXML瀏覽器,而是自己寫一些東西,那麼主要適用相同的建議。但是如果您打算進行後端集成,我會建議讓系統始終等待語音提示完成播放,而不是僅僅排隊 - 它使一切變得更加容易。您仍然需要內存隊列和執行池,以便可以在後臺完成後端集成。

1

瑞奇從Twilio這裏。

我們建了一個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()); 
    } 

一旦用戶按下一個數字,另一個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幫助!