謝秋菊,蘇中濱
(1.黑龍江八一農(nóng)墾大學(xué)信息技術(shù)學(xué)院,黑龍江 大慶 163319;2.東北農(nóng)業(yè)大學(xué)工程學(xué)院,哈爾濱 150030)
語音服務(wù)系統(tǒng)是利用通信網(wǎng)和計(jì)算機(jī)網(wǎng)絡(luò)技術(shù),為用戶提供多種服務(wù)的信息服務(wù)系統(tǒng)。廣泛應(yīng)用于電信、銀行、航空、鐵道、航運(yùn)、保險(xiǎn)、股票、房地產(chǎn)、旅游等各個(gè)行業(yè)中[1-2]。
國外電力客戶語音服務(wù)中心建設(shè)較早,功能比較完善[3]。目前,國內(nèi)客戶語音服務(wù)雖然在電力行業(yè)中有應(yīng)用,但大都集中在大的電力企業(yè)。而針對縣級的農(nóng)村電力企業(yè)來說客戶語音服務(wù)的應(yīng)用很少,且應(yīng)用技術(shù)不成熟,功能不完善,服務(wù)比較單一,不能滿足實(shí)際工作的要求。因此,本文結(jié)合縣級電力企業(yè)的實(shí)際,建立一個(gè)先進(jìn)的客戶語音服務(wù)系統(tǒng),實(shí)現(xiàn)縣級電力客戶服務(wù)的信息化管理。
本文基于縣級電業(yè)局的功能需求分析,設(shè)計(jì)了以下幾個(gè)功能模塊:查詢服務(wù)模塊、電費(fèi)催繳模塊、電費(fèi)充值模塊、報(bào)修服務(wù)塊、投訴與留言服務(wù)模塊、聽取留言模塊、人工服務(wù)模塊、綜合統(tǒng)計(jì)分析模塊。系統(tǒng)功能模塊如圖1所示。
用戶通過撥打客戶服務(wù)電話,根據(jù)語音提示選擇相應(yīng)按鍵進(jìn)入人工服務(wù)或自動服務(wù),完成電費(fèi)查詢,電費(fèi)充值,實(shí)現(xiàn)咨詢、查詢、用電報(bào)裝、報(bào)修、投訴、舉報(bào)、留言等服務(wù)。
電費(fèi)催繳功能可以根據(jù)工作人員設(shè)置的催費(fèi)條件,系統(tǒng)自動從指定的欠費(fèi)數(shù)據(jù)庫中提取用戶電話號碼和欠費(fèi)金額等數(shù)據(jù),并且自動地向各欠費(fèi)用戶撥號,撥通后自動播放催費(fèi)通知和欠費(fèi)金額。系統(tǒng)對催費(fèi)成功與否進(jìn)行記錄,同時(shí)記錄對方電話號碼、時(shí)間等。系統(tǒng)對未撥通用戶,可根據(jù)設(shè)置的撥叫時(shí)間及次數(shù)進(jìn)行自動重復(fù)撥叫,提醒用戶及時(shí)交納電費(fèi)。
投訴/留言服務(wù)是一種口頭訊息的服務(wù),每一個(gè)打來電話者都可以通過電話語音的引導(dǎo)進(jìn)行留言,系統(tǒng)可以記錄用戶的語音投訴、建議、故障報(bào)修、搶修留言、并將語音錄制成為Windows的標(biāo)準(zhǔn)語音文件以及對語音文件進(jìn)行存儲,管理部門可以根據(jù)電話號碼,留言日期等條件進(jìn)行篩選,選取錄音文件來收聽。

圖1 系統(tǒng)功能模塊Fig.1 Function module picture
本系統(tǒng)以GX08F PCI電話語音卡為硬件支持,基于多線程技術(shù),設(shè)計(jì)實(shí)現(xiàn)了電力語音服務(wù)系統(tǒng)。
GX08F PCI電話語音卡可以識別和產(chǎn)生DTMF(雙音多頻信號)。例如,公共電話網(wǎng)上的線路忙音、撥號音和回鈴音等狀態(tài),以及主叫識別信息傳送及顯示等。
GX08F PCI語音卡底層驅(qū)動使用事件通知的方式向上層應(yīng)用軟件告知語音卡的各種狀態(tài)變化,實(shí)現(xiàn)時(shí)應(yīng)用程序根據(jù)不同的事件,調(diào)用相關(guān)的函數(shù),實(shí)現(xiàn)相關(guān)的功能。系統(tǒng)實(shí)現(xiàn)中的主要接口事件有:
MESSAGE_HAVE_CID_FSK
有FSK方式的主叫事件
MESSAGE_HAVE_CID_DTMF
有DTMF方式的主叫事件驅(qū)動的開發(fā)方式。
MESSAGE_HAVE_DTMF 有DTMF按鍵事件
MESSAGE_PLAY_VOICE_END 放音結(jié)束事件
MESSAGE_PLAY_VOICE_EXI 放音中斷事件
MESSAGE_USER_HOOK_O用戶模塊掛機(jī)事件
MESSAGE_TRUNK_RING 外線振鈴事件
MESSAGE_HAVE_BUSY_TON 外線忙音事件
GX08F PCI電話語音卡的編程接口包括控件編程接口(GxPCI08F.ocx)和動態(tài)連接庫(GxVoice.DLL)編程接口兩部分。語音卡提供硬件基礎(chǔ),在它之上是語音卡驅(qū)動程序。動態(tài)連接庫(GxVoice.DLL)負(fù)責(zé)同底層設(shè)備驅(qū)動程序通訊,控件(GXPhonic.OCX)是對動態(tài)連接庫的封裝,它以事件、方法、屬性提供用戶調(diào)用接口。應(yīng)用程序所有對GX08F PCI電話語音卡的操作,最終都是通過動態(tài)連接庫(GxVoice.DLL)來完成的。開發(fā)平臺的軟件架構(gòu)如圖2所示。

圖2 GX08F PCI語音卡開發(fā)平臺的軟件架構(gòu)Fig.2 Software structure of the development platform based on GX08F PCI voice card
本系統(tǒng)是基于GX08F PCI語音卡的動態(tài)鏈接庫方式開發(fā)的應(yīng)用程序,所以在Delphi中需要首先對DLL中的函數(shù)進(jìn)行聲明,然后才能對該函數(shù)進(jìn)行調(diào)用。下面是一段在Delphi中實(shí)現(xiàn)語音操作的基本步驟的代碼。
①語音卡的初始化操作:
DriverOpenFlag:=GX_InitializeSystem();//語音卡驅(qū)動程序初始化
if DriverOpenFlag<>GX_OK then
begin
ShowMessage('初始化語音卡錯誤。');
exit;
end;
TotalVoiceLine:=GX_GetTotalVoiceChannel();//獲取語音通道的數(shù)目
for i:=0 to TotalVoiceLine-1 do
begin
GX_OpenChannel(i);//打開語音通道
GX_StartDetectDTMF(i,0);//DTMF按鍵檢測
GX_StartDetectCallerID(i);//主叫識別
end;
②語音卡事件檢測:
GetCode:=GX_GetMessageForWindows(50,@MessageBuffer);//獲取語音卡事件
if GetCode<>GX_OK then exit;
ChannelNo:=MessageBuffer.ChannelNo;//把獲取的事件的通道號賦給一個(gè)變量
MessageCode:=MessageBuffer.MessageCode;//把獲取的事件的代碼賦給一個(gè)變量
③根據(jù)具體的事件代碼進(jìn)行相應(yīng)的應(yīng)用程序設(shè)計(jì)
case MessageCode of
MESSAGE_HAVE_CID_DTMF://如果有 DTMF方式的主叫事件
begin
GX_GetDTMFCallerID(ChannelNo,CallerIDString);//獲取主叫號碼
GX_ClearDTMFBuffer(ChannelNo);//清除通道未被取走的DTMF碼
GX_StartDetectDTMF(ChannelNo,0);//檢測Channel No通道的DTMF按鍵
MESSAGE_TRUNK_RING://如果有外線振鈴事件Begin
GX_TrunkHookOff(ChannelNo);//外線模塊摘機(jī)
GX_StartPlayFile(ChannelNo,VoiceFile,0,$FFFF FFFF,chr(STOP_ANY_DTMF));//開始放音操作
Line[ChannelNo].status:=STATUS_CHOOSE;
end;
end;
④當(dāng)應(yīng)用程序結(jié)束時(shí)釋放語音卡驅(qū)動程序所申請的系統(tǒng)資源:
if GX_InitializeSystem=GX_OK then
begin
for i:=0 to TotalVoiceLine-1 do
begin
GX_StopAllOperate(i);//停止語音卡的所有操作
GX_CloseChannel(i);//關(guān)閉所有語音通道end;
GX_CloseSystem();//釋放語音卡驅(qū)動程序所申請的系統(tǒng)資源
end;
由于系統(tǒng)的高實(shí)時(shí)性要求和多路語音通道的并行性要求,通過深入研究發(fā)現(xiàn)Windows的多線程技術(shù),可以很好地解決多個(gè)語音通道的協(xié)調(diào)問題,并且可以更好地利用系統(tǒng)資源,改善系統(tǒng)性能。因此,本系統(tǒng)運(yùn)用多線程技術(shù)進(jìn)行設(shè)計(jì)[4-5]。
在本系統(tǒng)中,一共設(shè)計(jì)了5個(gè)線程,它們分別是主線程、檢測線程、查詢線程、充值線程[6-7]、錄音線程。由于主線程和其它線程在宏觀上是并行的,可以充分協(xié)調(diào)利用系統(tǒng)的CPU時(shí)間,實(shí)現(xiàn)各語音通道的獨(dú)立并行工作。
但是,當(dāng)多線程同時(shí)執(zhí)行時(shí),線程共享進(jìn)程中的一些數(shù)據(jù),將會引起對共享資源的訪問沖突。為避免共享沖突,需要用線程同步技術(shù)對共享資源進(jìn)行訪問。
本系統(tǒng)在設(shè)計(jì)過程中,將整個(gè)系統(tǒng)分解為若干個(gè)線程對象。由于這些對象之間存在對數(shù)據(jù)區(qū)的協(xié)調(diào)處理問題,因此它們的工作都不是單獨(dú)運(yùn)行的,都需要和其他對象進(jìn)行同步協(xié)調(diào)。本系統(tǒng)采用臨界區(qū)措施來避免共享數(shù)據(jù)的訪問沖突。當(dāng)一個(gè)線程進(jìn)入臨界區(qū)后,如果此時(shí)另一個(gè)線程也要訪問這個(gè)數(shù)據(jù),則它會在調(diào)用Enter時(shí),發(fā)現(xiàn)已經(jīng)有線程進(jìn)入臨界區(qū),然后此線程就會被掛起,等待當(dāng)前在臨界區(qū)的線程調(diào)用Leave離開臨界區(qū),當(dāng)另一個(gè)線程完成操作,調(diào)用Leave離開后,此線程就會被喚醒,并設(shè)置臨界區(qū)標(biāo)志,開始操作數(shù)據(jù),這樣就防止了訪問沖突。Delphi將臨界區(qū)對象封裝為TCriticalSection類,在程序?qū)崿F(xiàn)中采用TCritical-Section類的Aquire方法來鎖定數(shù)據(jù),用TCritical-Section類的Release方法來釋放數(shù)據(jù)。當(dāng)線程向TCriticalSection類對象提出訪問數(shù)據(jù)的請求時(shí),如果這個(gè)請求不被允許,線程處于掛起狀態(tài),直到TCriticalSection類對象釋放;如果向TCritical-Section類對象提出數(shù)據(jù)訪問的請求被允許,則所有這個(gè)線程要訪問的數(shù)據(jù)都會在保護(hù)范圍內(nèi)。
本文以縣級電業(yè)局為例,提出的以電話語音卡為硬件支持,通過多線程技術(shù)來解決多語音通道的協(xié)調(diào)、并行工作的方法,為縣級電力語音服務(wù)中心的實(shí)現(xiàn)提供了更為有效的方法。
經(jīng)過現(xiàn)場實(shí)際調(diào)試、運(yùn)行、應(yīng)用,本系統(tǒng)運(yùn)行穩(wěn)定,運(yùn)行成本低、效率高,完全適合縣級電力企業(yè)的應(yīng)用。
[1] 宋俊德,段云峰.呼叫中心CTI獨(dú)步電信、PC之間[J].中國計(jì)算機(jī)報(bào),1999(6):61.
[2] 番瑩玉.應(yīng)用廣泛的CTI技術(shù)[J].現(xiàn)代通信,2000(10):10.
[3] 胡延平,廖蕾,劉啟明,等.基于CTI的呼叫中心系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2003,24(3):37-39.
[4] 謝秋菊,蘇中濱.電力語音充值系統(tǒng)呼叫處理過程的多線程實(shí)現(xiàn)[J].黑龍江八一農(nóng)墾大學(xué)學(xué)報(bào),2008,20(1):82-84.
[5] 謝秋菊,蘇中濱.黑龍江省農(nóng)村電力遠(yuǎn)程繳費(fèi)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].農(nóng)機(jī)化研究,2010(12):215-218.
[6] 劉駿,馬榮盛,周亦瑾.淺析智能網(wǎng)充值卡查詢統(tǒng)計(jì)系統(tǒng)[J].天津通信技術(shù),2004(2):40-43.
[7] 楊路明,雷亞軍.基于Delphi的分布式充值系統(tǒng)的實(shí)現(xiàn)方法[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2003(6):73-76.