首頁>>廠商>>CTI系統(tǒng)平臺廠商>>易谷網(wǎng)絡(luò)

基于VoiceXML技術(shù)的可視化IVR系統(tǒng)設(shè)計和實現(xiàn)(三)

上海易谷網(wǎng)絡(luò)科技有限公司 查瑋 2009/12/29

基于VoiceXML技術(shù)的可視化IVR系統(tǒng)設(shè)計和實現(xiàn)(一)

基于VoiceXML技術(shù)的可視化IVR系統(tǒng)設(shè)計和實現(xiàn)(二)

  在系統(tǒng)分析和系統(tǒng)總體設(shè)計之后,就進(jìn)入了系統(tǒng)實現(xiàn)階段。該階段主要是對IVR系統(tǒng)業(yè)務(wù)編輯工具和執(zhí)行引擎部分進(jìn)行實現(xiàn)。

4.1可視化流程定義工具實現(xiàn)

  Windows操作系統(tǒng)具有友好的圖形界面,越來越被國內(nèi)外眾多的用戶所喜歡[30],因而開發(fā)Windows應(yīng)用程序?qū)⒕哂袕V泛的市場?捎糜陂_發(fā)Windows應(yīng)用程序的語言較多,其中Visual C++是眾多軟件開發(fā)人員所喜歡的語言之一,它是一種可視化的面向?qū)ο蟪绦蛘Z言,其MFC基類封裝了Windows API函數(shù),提供了許多功能模塊,使得開發(fā)人員可以利用MFC快速、高效地開發(fā)Windows應(yīng)用程序,減少了許多重復(fù)勞動,提高了代碼利用率和程序開發(fā)效率,縮短了軟件開發(fā)周期,使開發(fā)人員有更多的時間去研究新的問題。

  完成了基礎(chǔ)類的設(shè)計之后,整個IVR系統(tǒng)的流程工具都是基于這個基礎(chǔ)類包來完成的。作為流程編輯工具,流程編輯器的設(shè)計應(yīng)當(dāng)遵循如下原則:方便簡便,便于開發(fā)人員掌握,適合與不同的業(yè)務(wù)不同行業(yè)IVR系統(tǒng)的工作流程。所以在設(shè)計中,以樹形結(jié)構(gòu)反映工作流程的概念,如圖4.1所示。


  從圖4.4所示結(jié)構(gòu)中,通過主窗體可以訪問其它窗體操作,同時控制窗體與類模塊的信息交互。系統(tǒng)中的各個窗口的實現(xiàn)均是基于基礎(chǔ)類包的。下面詳細(xì)介紹IVR系統(tǒng)流程工具各個部分的實現(xiàn)。其實現(xiàn)工具的內(nèi)容詳見文獻(xiàn)[31]。

  主程序是IVR系統(tǒng)流程定義工具的主體,它包括各個窗口的定義、流程類的定義、節(jié)點類定義等。主程序通過主窗體類定義將其它各個類窗體組織在一起,同時負(fù)責(zé)各子窗體之間的信息交互。主窗體類則定義了流程間的組織結(jié)構(gòu),它通過用戶界面操作協(xié)助用戶完成流程制作,同時生成含有VoiceXML標(biāo)簽的Web頁面交給執(zhí)行引擎進(jìn)行解釋執(zhí)行。

  主窗體主要負(fù)責(zé)各個窗體和類模塊之間的信息交互和訪問控制。圖4.2描述IVR系統(tǒng)業(yè)務(wù)流程定義工具的主窗體界面。分為工具箱窗體、菜單窗體、流程編輯(畫布)窗體、屬性窗體,同時包括流程節(jié)點的訪問控制。

圖4.2 IVR系統(tǒng)流程定義工具主窗體

  工具箱窗體:工具箱窗體提供系統(tǒng)支持節(jié)點類型控件的選擇,用戶通過拖拽方式添加節(jié)點以制作流程。工具箱窗體類主要包括工具箱窗體的事件響應(yīng)和主窗體交互部分,提供每種實現(xiàn)方法。

  菜單窗體:菜單窗體是提供關(guān)于整個系統(tǒng)流程的打開、編輯等操作。

  屬性設(shè)置窗體:屬性窗體為每一類節(jié)點提供屬性設(shè)置功能,其中包括屬性窗體操作、與主窗體信息交互兩大類,提供各個節(jié)點所涉及到的每種屬性窗體的實現(xiàn)方法。

  流程編輯(畫布)窗體:此窗體類提供了制作流程的畫布操作。在此窗口定義了一個畫布控件;流程編輯窗體接收畫布對象的事件,提交給主窗體,同時通過與主窗體的信息交互控制在畫布上確保正確制作流程。

  主程序除了上述4種主要的模塊定義之外,還有一些窗體類和類模塊定義,主要負(fù)責(zé)各種屬性的設(shè)置和操作:同時為使流程制作更加人性化,主程序增加了一些通用編輯功能。

  以上為主程序的設(shè)計及其部分實現(xiàn)。在實現(xiàn)中通過引用窗體控件和畫布窗體類定義,集成了對畫布控件和節(jié)點控件的訪問操作。

4.2 IVR系統(tǒng)執(zhí)行引擎的實現(xiàn)

  IVR系統(tǒng)執(zhí)行引擎是整個IVR系統(tǒng)的核心系統(tǒng),它負(fù)責(zé)對之前由IVR系統(tǒng)流程定義工具生成的中間文件(含有VoiceXML標(biāo)簽的Web頁面)解釋和驅(qū)動。本文設(shè)計的IVR系統(tǒng)是基于VoiceXML技術(shù),以開源OpenVXI項目為基礎(chǔ),設(shè)計并實現(xiàn)的IVR系統(tǒng)執(zhí)行引擎部分。

  OpenVXI[32] 是一種簡便的開源庫,用來解釋VoiceXML對話標(biāo)記語言(dialog markup language)。為了避免其它私有的標(biāo)準(zhǔn),它嚴(yán)格支持VoiceXML 2.0 草案(現(xiàn)在已經(jīng)支持部分3.0的標(biāo)準(zhǔn)),同時OpenVXI是一個跨平臺的開發(fā)系統(tǒng)。

  OpenVXI本身只是VoiceXML平臺的一個組件[32],它只是提供了簡單的語音識別、語音提示和TTS(text-to-speech)功能。而對于電話功能,由于語音卡的種類繁多,同時VoIP(Voice over IP)技術(shù)的快速發(fā)展,就需要使用者自己提供實際的組件和函數(shù)進(jìn)行整合。既便如此,OpenVXI還是提供一個強(qiáng)大的基本框架讓使用者構(gòu)建自己的語音平臺。

4.4.1 OpenVXI的系統(tǒng)架構(gòu)

  根據(jù)圖2.3描述的VoiceXML平臺的基本體系結(jié)構(gòu)分析,OpenVXI符合基本架構(gòu),具體的系統(tǒng)架構(gòu)圖如圖4.3所示。整個平臺執(zhí)行VoiceXML頁面,并提供與電話網(wǎng)絡(luò)連接的服務(wù),平臺總共分4個部分:

  1.主進(jìn)程、操作管理和維護(hù)系統(tǒng):一個收集系統(tǒng)管理和錯誤報告的工具。這個核心組件通過創(chuàng)建線程的方式來喚醒VoiceXML瀏覽器。

  2.OpenVXI:負(fù)責(zé)解釋VoiceXML標(biāo)記語言和語音平臺返回的呼叫標(biāo)志信息(通過返回相應(yīng)的事件信息)。

  3.OpenSpeech Browser PIK:提供了為系統(tǒng)運行所必要的高層次(high-level)服務(wù),包括識別引擎、語音引導(dǎo)引擎、Internet fetch庫(提供通過URL對web服務(wù)器訪問的庫)、ECMA Script[32]引擎。OpenVXI通過系統(tǒng)提供的函數(shù)接口來訪問這些組件,這些接口不需要定義和實現(xiàn)各種機(jī)制來滿足與底層電話系統(tǒng)軟件系統(tǒng)之間的通訊,而是通過使用支持Client/Server模式的TCP/IP協(xié)議來實現(xiàn)。

  4.Telephony and base services:需要能接收到電話的基本操作系統(tǒng)服務(wù)和電話服務(wù)。


圖4.3 OpenVXI系統(tǒng)架構(gòu)圖

4.4.2 OpenSpeech Browser PIK組件結(jié)構(gòu)

  圖4.4描述了OpenSpeech Browser PIK 的架構(gòu)和組件構(gòu)成,包括為完成語音識別和TTS功能整合的產(chǎn)品SpeechWorks。 所有的組件都被設(shè)計成很容易的去訪問。這個語音瀏覽器(Speech Browser)包括:

  1.VXI:解析所有的VoiceXML標(biāo)記,并且擔(dān)當(dāng)程序中的主控作用。VXI實現(xiàn)了VoiceXML 1.0中所有必需(mandatory)的部分和大部分的可選功能。

  2.XML Parser Interface:提供對XML DOM解析器的訪問,現(xiàn)在的實現(xiàn)方式是通過直接調(diào)用開源的Apache Xerces SAX and DOM parse解析接口。

  3.Internet Interface:通過http://和file://的方式訪問應(yīng)用文檔(即URL的方式訪問Web頁面),同時也支持POST的方式給應(yīng)用服務(wù)器返回數(shù)據(jù)。這方面的實現(xiàn)是整合了開源W3C Libwww開發(fā)庫。

  4.ECMAScript(JavaScript) Interface :提供了對ECMAScript執(zhí)行服務(wù)的訪問。相關(guān)的實現(xiàn)整合了Mozilla SpiderMonkey開源引擎。

  5.Logging Interface:用來報告系統(tǒng)級別的錯誤、事件和診斷信息。它是將日志存儲成日志文件,并且可以選擇進(jìn)行標(biāo)準(zhǔn)的輸出。

核心瀏覽器中與語音平臺相關(guān)的API主要包括:

  1.Recognizer Interface:提供語法管理和由VoiceXML指定的識別服務(wù)(例如:收取DTMF碼),包括動態(tài)語法創(chuàng)建和語法構(gòu)建。它通過Telephony Service來獲取呼叫信息,并且已經(jīng)在OpenSpeech Browser中整合。

  2.Prompting Interface:提供完整的放音服務(wù),包括播放可變語音。它必須處理語音文件并且提供語音服務(wù)。OpenSpeech Browser PIK已經(jīng)整合了支持幾種語言的TTS。

  3.Telephony Interface:提供呼叫控制服務(wù),包括發(fā)送語音平臺的時間、轉(zhuǎn)接和掛斷電話。OpenSpeech Browser PIK已經(jīng)實現(xiàn)了與底層的語音平臺交互,并抽象了API來提供呼叫控制服務(wù)。

  4.Object Interface:提供了對對象的訪問。通過對象元素,平臺可以訪問定義的那些對VoiceXML語音的擴(kuò)展。對象可以很容易的被定義成適合語音平臺需要的呼叫控制擴(kuò)展、CTI系統(tǒng)的彈屏顯示或者其它一些需求。

圖4.4 OpenSpeech Browser PIK 組件構(gòu)成圖

  通過對OpenVXI的描述,可以看出:模塊化和分層次的設(shè)計使得在平臺里的各個組件之間即相對獨立,又相互聯(lián)系、互相協(xié)作來完成整個平臺的功能。使用者可以通過實現(xiàn)平臺提供的各種接口來實現(xiàn)對基于各種硬件或者軟件的語音系統(tǒng)的整合。本文設(shè)計的IVR系統(tǒng)所涉及到的是模擬語音卡,所以對與錄音、放音、取鍵都由語音卡所提供的API來完成即可。

4.4.3 接口實現(xiàn)(取鍵、錄音、放音、轉(zhuǎn)接)

  OpenSpeech Browser PIK自身就是支持標(biāo)準(zhǔn)的VoiceXML 2.0的標(biāo)準(zhǔn),同時對VoiceXML的解析能力比較強(qiáng)大,又同時整合了Apache的XML解析器、W3C的LIBWWW進(jìn)行Web訪問和Mozilla Spider Monkey作為ECMA Script的執(zhí)行器,本文主要是通過實現(xiàn)相應(yīng)的語音平臺接口來實現(xiàn)IVR系統(tǒng)的執(zhí)行引擎。沒有對VoiceXML解析功能做過多的修改。

Recognizer Interface(識別接口)的實現(xiàn)

  對應(yīng)Recognizer的接口,OpenVXI分別針對收取用戶按鍵(DTMF碼)和語音識別(speech recognize)的接口,但是由于現(xiàn)在語音識別的技術(shù)并不是很成熟,特別是對中文的識別率不是很高,本文設(shè)計的IVR系統(tǒng)就沒有涉及到該功能,只是留下接口等待以后實現(xiàn)。需要實現(xiàn)的具體接口函數(shù)有收取用戶按鍵和錄音。

收鍵接口,函數(shù)體描述如下:

VXIpromptResult Recognize (struct VXIrecInterface* pThis,
const VXIMap* properties,
VXIrecRecognitionResult** recogResult)

圖4.5描述了實現(xiàn)該接口的流程圖。


圖4.5 使用Recognize接口實現(xiàn)收DTMF碼流程圖

  1)獲取連接實例,其數(shù)據(jù)是從語音卡檢測到的信令,發(fā)送給語音平臺。通過GetImplementaionName來獲得實例名稱,進(jìn)入下一步;

  2)使用BeginSession來創(chuàng)建session,并且通過LoadGrammarURI來裝載語法。這時候開始啟動收鍵,進(jìn)入下一步;

  3)啟動計時器,等待事件觸發(fā);

  4)如果接收到SC_EVENT_DISCCONET事件,表示用戶主動放棄,返回REC_FAILURE,調(diào)用EndSession,流程結(jié)束;如果接收到SC_EVENT_TIMEOUT事件,表示用戶在計時器的時間內(nèi)沒有輸入,返回REC_NOINPUT,調(diào)用EndSession,流程結(jié)束;如果接收到SC_EVENT_DTMF_RECEIVED事件,表示用戶輸入完畢,進(jìn)入下一步;

  5)檢查語法的符合性,通過檢查是否滿足在.gram文件里設(shè)置的正則表達(dá)式來判斷,如果符合轉(zhuǎn)6,不符合轉(zhuǎn)7;

  6)符合語法,返回REC_SUCESS,調(diào)用EndSession,流程結(jié)束;

  7)不符合語法,返回REC_NOMATCH,調(diào)用EndSession,流程結(jié)束。

錄音接口,接口函數(shù)體描述如下:

VXIrecResult Record (struct VXIrecInterface* pThis,
const VXIMap* propertites,
VXIrecRecordResult** recordResult)

圖4.6描述了實現(xiàn)該接口的流程圖。


圖4.6使用Record接口實現(xiàn)錄音流程圖


  1)獲取連接實例,其數(shù)據(jù)是從語音卡檢測到的信令,發(fā)送給語音平臺。通過GetImplementaionName來獲得實例名稱,進(jìn)入下一步;

  2)創(chuàng)建錄音文件名,進(jìn)入下一步;

  3) 使用BeginSession來創(chuàng)建session,并且通過LoadGrammarURI來裝載語法。這時候開始啟動錄音功能,進(jìn)入下一步;

  4)啟動計時器,等待事件觸發(fā);

  5)如果接收到SC_EVENT_DISCCONET事件,表示用戶主動放棄,轉(zhuǎn)到步驟7;如果接收到SC_EVENT_TIMEOUT事件,表示用戶在計時器的時間內(nèi)沒有輸入,返回REC_NOINPUT,調(diào)用EndSession,流程結(jié)束;如果接收到SC_EVENT_RECORD_RECEIVED事件,表示用戶錄音完畢,進(jìn)入下一步;

  6)返回REC_SUCCESS,進(jìn)入下一步;

  7)檢查錄音文件是否有數(shù)據(jù)。如果錄音文件沒有數(shù)據(jù)不存在數(shù)據(jù),表示錄音不成功,返回REC_FAILURE,調(diào)用EndSession,流程結(jié)束;如果錄音文件有數(shù)據(jù),表示錄音成功,返回成功,調(diào)用EndSession,流程結(jié)束。

Prompting Interface(放音接口)的實現(xiàn)

  對于放音接口,所需要關(guān)注的是3個函數(shù)的實現(xiàn):Queue()接口、Play()接口和Wait()接口。

  Queue接口僅僅是將所要播放或者重復(fù)播放的語音文件放入隊列中,并不擔(dān)當(dāng)放音的功能, Play()接口才是啟動播放動作的。這個調(diào)用會一直阻塞直到放音數(shù)據(jù)返回以便于調(diào)用者可以確認(rèn)是否需要重播。接口函數(shù)體描述如下:

VXIpromptResult Queue (struct VXIproptInterface* pThis,
const VXIchar* type,
const VXIchar* content,
const VXIchar* text,
const VXIMap* properties)


  在實現(xiàn)過程中,本文設(shè)計的IVR系統(tǒng)只是涉及到語音文件的播放,所以只是需要通過調(diào)用語音卡API將語音文件放入播放隊列即可,而需要重復(fù)播放的語音文件,只要重復(fù)放入到語音隊列當(dāng)中便可實現(xiàn)。

  Play接口是完成放音動作的接口。實現(xiàn)非常簡單,只需要調(diào)用語音卡放音API去播放存在播放隊列里的語音文件。接口函數(shù)體描述如下:

VXIpromptResult Queue (struct VXIproptInterface* pThis)

  Wait接口是等待所有的放音文件都結(jié)束,去捕獲放音時間結(jié)束。接口函數(shù)體描述如下:

VXIpromptResult Wait (struct VXIproptInterface* pThis
VXIpromptResult* playResutl)


  圖4.7描述了這三個接口實現(xiàn)流程圖。

圖4.7 Queue、Play、Wait接口實現(xiàn)流程圖


Queue接口實現(xiàn)如下:

  1)獲取連接實例,其數(shù)據(jù)是從語音卡檢測到的信令,發(fā)送給語音平臺,進(jìn)入下一步;

  2)判斷語音文件是否合法,如果合法轉(zhuǎn)3,不合法返回PROMPT_FAILURE,流程結(jié)束;

  3)將要播放的文件名放入播放隊列中等待播放,返回PROMPT_SUCCESS,流程結(jié)束。

Play接口實現(xiàn)如下:

  1)獲取連接實例,其數(shù)據(jù)是從語音卡檢測到的信令,發(fā)送給語音平臺,進(jìn)入下一步;

  2)判斷播放隊列是否為空,如果為空返回PROMPT_SUCCESS,流程結(jié)束;如果不為空,轉(zhuǎn)3;

  3)調(diào)用語音卡放音API實現(xiàn)放音功能,轉(zhuǎn)2。

Wait接口實現(xiàn)如下:

  1)獲取連接實例,其數(shù)據(jù)是從語音卡檢測到的信令,發(fā)送給語音平臺,進(jìn)入下一步;

  2)啟動計時器,等待事件觸發(fā);

  3)如果收到SC_EVENT_DISCONNECT事件,表示話路斷開,返回PROMPT_FAILURE,流程結(jié)束;如果收到SC_EVENT_PROMPT_END,返回PROMPT_SUCCESS,流程結(jié)束。

Telephony Interface(轉(zhuǎn)接接口)的實現(xiàn)

  對于電話接口,需要實現(xiàn)的方法有GetStatus、Disconnect、TransferBlind,而TransferBridge指的是通過橋接的方式去轉(zhuǎn)接。首先,他需要平臺的支持,其次還要進(jìn)行大量的配置,同時占有很多的資源,非常的不實用。對于IVR系統(tǒng)來說,不需要這么復(fù)雜的操作。對于大型的呼叫中心,IVR系統(tǒng)只是前置于整個呼叫平臺,更多的話路操作還需要交給CTI系統(tǒng)去完成。

  下面給出每個接口實現(xiàn)的流程圖,如圖4.8所示。


圖4.8 GetStatus、Disconnect、TransferBlind接口流程圖

GetStatus函數(shù)體描述如下:

VXItelResult GetStatus(struct VXItelInterface* pThis,
VXItelStatus* status)

接口實現(xiàn)如下:

  1)獲取連接實例,其數(shù)據(jù)是從語音卡檢測到的信令,發(fā)送給語音平臺,進(jìn)入下一步;

  2)調(diào)用語音卡API去查看通道狀態(tài),進(jìn)入下一步;

  3)將獲得狀態(tài)返回,如果通道中有電話返回VXI_STATUS_ACTIVE;如果通道是空閑狀態(tài)則返回VXI_STATUS_INACTIVE流程結(jié)束。

Disconnect函數(shù)體描述如下

VXItelResult Disconnect(struct VXItelInterface* pThis)

接口實現(xiàn)如下:

  1)獲取連接實例,其數(shù)據(jù)是從語音卡檢測到的信令,發(fā)送給語音平臺,進(jìn)入下一步;

  2)調(diào)用語音卡API去檢查語音連接是否存在,如果存在,則進(jìn)入下一步;如果不存在,轉(zhuǎn)4;

  3)調(diào)用語音卡API去掛斷電話,進(jìn)入下一步;

  4) 調(diào)用語音卡API釋放所有資源,流程結(jié)束。

TransferBlind函數(shù)體描述如下

VXItelResult TransferBlind (struct VXItelInterface* pThis,
const VXIMap* properties,
const VXIChar* transferDestination,
VXIMap** resp)


接口實現(xiàn)如下:

  1)獲取連接實例,其數(shù)據(jù)是從語音卡檢測到的信令,發(fā)送給語音平臺,進(jìn)入下一步;

  2)調(diào)用語音卡API去檢查語音連接是否存在,如果存在,則進(jìn)入下一步;如果不存在,轉(zhuǎn)4;

  3)調(diào)用語音卡API去轉(zhuǎn)接電話(因為是采用的是“盲轉(zhuǎn)”方式轉(zhuǎn)接,IVR系統(tǒng)只要將電話轉(zhuǎn)移到話機(jī)上即可,不需要管理轉(zhuǎn)接后的狀態(tài)),返回成功,流程結(jié)束;

  4)返回失敗,流程結(jié)束。

4.3本章小結(jié)

  本章在基于整個IVR系統(tǒng)的詳細(xì)設(shè)計基礎(chǔ)上,基于MFC技術(shù)和OpenVXI的開源項目,實現(xiàn)了IVR系統(tǒng)可視化的過程定義工具和IVR系統(tǒng)的執(zhí)行引擎。

基于VoiceXML技術(shù)可視化IVR設(shè)計和實現(xiàn)(四)

作者獨家提供CTI論壇稿件,其它媒體謝絕轉(zhuǎn)載

CTI論壇報道



相關(guān)閱讀:
基于VoiceXML的可視化IVR系統(tǒng)設(shè)計和實現(xiàn)(一) 2009-09-22
上海易谷與Genesys達(dá)成大中華區(qū)長期合作伙伴關(guān)系 2009-04-17
聯(lián)絡(luò)中心與3G應(yīng)用 2009-04-09

熱點專題:  呼叫中心  
分類信息:  CTI文摘_與_IVR技術(shù)  IVR技術(shù)_與_VoiceXML技術(shù)  IVR技術(shù)_與_系統(tǒng)建設(shè)技術(shù)