谢秋菊,苏中滨
(1.黑龙江八一农垦大学信息技术学院,黑龙江 大庆 163319;2.东北农业大学工程学院,哈尔滨 150030)
语音服务系统是利用通信网和计算机网络技术,为用户提供多种服务的信息服务系统。广泛应用于电信、银行、航空、铁道、航运、保险、股票、房地产、旅游等各个行业中[1-2]。
国外电力客户语音服务中心建设较早,功能比较完善[3]。目前,国内客户语音服务虽然在电力行业中有应用,但大都集中在大的电力企业。而针对县级的农村电力企业来说客户语音服务的应用很少,且应用技术不成熟,功能不完善,服务比较单一,不能满足实际工作的要求。因此,本文结合县级电力企业的实际,建立一个先进的客户语音服务系统,实现县级电力客户服务的信息化管理。
本文基于县级电业局的功能需求分析,设计了以下几个功能模块:查询服务模块、电费催缴模块、电费充值模块、报修服务块、投诉与留言服务模块、听取留言模块、人工服务模块、综合统计分析模块。系统功能模块如图1所示。
用户通过拨打客户服务电话,根据语音提示选择相应按键进入人工服务或自动服务,完成电费查询,电费充值,实现咨询、查询、用电报装、报修、投诉、举报、留言等服务。
电费催缴功能可以根据工作人员设置的催费条件,系统自动从指定的欠费数据库中提取用户电话号码和欠费金额等数据,并且自动地向各欠费用户拨号,拨通后自动播放催费通知和欠费金额。系统对催费成功与否进行记录,同时记录对方电话号码、时间等。系统对未拨通用户,可根据设置的拨叫时间及次数进行自动重复拨叫,提醒用户及时交纳电费。
投诉/留言服务是一种口头讯息的服务,每一个打来电话者都可以通过电话语音的引导进行留言,系统可以记录用户的语音投诉、建议、故障报修、抢修留言、并将语音录制成为Windows的标准语音文件以及对语音文件进行存储,管理部门可以根据电话号码,留言日期等条件进行筛选,选取录音文件来收听。
图1 系统功能模块Fig.1 Function module picture
本系统以GX08F PCI电话语音卡为硬件支持,基于多线程技术,设计实现了电力语音服务系统。
GX08F PCI电话语音卡可以识别和产生DTMF(双音多频信号)。例如,公共电话网上的线路忙音、拨号音和回铃音等状态,以及主叫识别信息传送及显示等。
GX08F PCI语音卡底层驱动使用事件通知的方式向上层应用软件告知语音卡的各种状态变化,实现时应用程序根据不同的事件,调用相关的函数,实现相关的功能。系统实现中的主要接口事件有:
MESSAGE_HAVE_CID_FSK
有FSK方式的主叫事件
MESSAGE_HAVE_CID_DTMF
有DTMF方式的主叫事件驱动的开发方式。
MESSAGE_HAVE_DTMF 有DTMF按键事件
MESSAGE_PLAY_VOICE_END 放音结束事件
MESSAGE_PLAY_VOICE_EXI 放音中断事件
MESSAGE_USER_HOOK_O用户模块挂机事件
MESSAGE_TRUNK_RING 外线振铃事件
MESSAGE_HAVE_BUSY_TON 外线忙音事件
GX08F PCI电话语音卡的编程接口包括控件编程接口(GxPCI08F.ocx)和动态连接库(GxVoice.DLL)编程接口两部分。语音卡提供硬件基础,在它之上是语音卡驱动程序。动态连接库(GxVoice.DLL)负责同底层设备驱动程序通讯,控件(GXPhonic.OCX)是对动态连接库的封装,它以事件、方法、属性提供用户调用接口。应用程序所有对GX08F PCI电话语音卡的操作,最终都是通过动态连接库(GxVoice.DLL)来完成的。开发平台的软件架构如图2所示。
图2 GX08F PCI语音卡开发平台的软件架构Fig.2 Software structure of the development platform based on GX08F PCI voice card
本系统是基于GX08F PCI语音卡的动态链接库方式开发的应用程序,所以在Delphi中需要首先对DLL中的函数进行声明,然后才能对该函数进行调用。下面是一段在Delphi中实现语音操作的基本步骤的代码。
①语音卡的初始化操作:
DriverOpenFlag:=GX_InitializeSystem();//语音卡驱动程序初始化
if DriverOpenFlag<>GX_OK then
begin
ShowMessage('初始化语音卡错误。');
exit;
end;
TotalVoiceLine:=GX_GetTotalVoiceChannel();//获取语音通道的数目
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;//把获取的事件的通道号赋给一个变量
MessageCode:=MessageBuffer.MessageCode;//把获取的事件的代码赋给一个变量
③根据具体的事件代码进行相应的应用程序设计
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);//外线模块摘机
GX_StartPlayFile(ChannelNo,VoiceFile,0,$FFFF FFFF,chr(STOP_ANY_DTMF));//开始放音操作
Line[ChannelNo].status:=STATUS_CHOOSE;
end;
end;
④当应用程序结束时释放语音卡驱动程序所申请的系统资源:
if GX_InitializeSystem=GX_OK then
begin
for i:=0 to TotalVoiceLine-1 do
begin
GX_StopAllOperate(i);//停止语音卡的所有操作
GX_CloseChannel(i);//关闭所有语音通道end;
GX_CloseSystem();//释放语音卡驱动程序所申请的系统资源
end;
由于系统的高实时性要求和多路语音通道的并行性要求,通过深入研究发现Windows的多线程技术,可以很好地解决多个语音通道的协调问题,并且可以更好地利用系统资源,改善系统性能。因此,本系统运用多线程技术进行设计[4-5]。
在本系统中,一共设计了5个线程,它们分别是主线程、检测线程、查询线程、充值线程[6-7]、录音线程。由于主线程和其它线程在宏观上是并行的,可以充分协调利用系统的CPU时间,实现各语音通道的独立并行工作。
但是,当多线程同时执行时,线程共享进程中的一些数据,将会引起对共享资源的访问冲突。为避免共享冲突,需要用线程同步技术对共享资源进行访问。
本系统在设计过程中,将整个系统分解为若干个线程对象。由于这些对象之间存在对数据区的协调处理问题,因此它们的工作都不是单独运行的,都需要和其他对象进行同步协调。本系统采用临界区措施来避免共享数据的访问冲突。当一个线程进入临界区后,如果此时另一个线程也要访问这个数据,则它会在调用Enter时,发现已经有线程进入临界区,然后此线程就会被挂起,等待当前在临界区的线程调用Leave离开临界区,当另一个线程完成操作,调用Leave离开后,此线程就会被唤醒,并设置临界区标志,开始操作数据,这样就防止了访问冲突。Delphi将临界区对象封装为TCriticalSection类,在程序实现中采用TCritical-Section类的Aquire方法来锁定数据,用TCritical-Section类的Release方法来释放数据。当线程向TCriticalSection类对象提出访问数据的请求时,如果这个请求不被允许,线程处于挂起状态,直到TCriticalSection类对象释放;如果向TCritical-Section类对象提出数据访问的请求被允许,则所有这个线程要访问的数据都会在保护范围内。
本文以县级电业局为例,提出的以电话语音卡为硬件支持,通过多线程技术来解决多语音通道的协调、并行工作的方法,为县级电力语音服务中心的实现提供了更为有效的方法。
经过现场实际调试、运行、应用,本系统运行稳定,运行成本低、效率高,完全适合县级电力企业的应用。
[1] 宋俊德,段云峰.呼叫中心CTI独步电信、PC之间[J].中国计算机报,1999(6):61.
[2] 番莹玉.应用广泛的CTI技术[J].现代通信,2000(10):10.
[3] 胡延平,廖蕾,刘启明,等.基于CTI的呼叫中心系统设计与实现[J].计算机工程与设计,2003,24(3):37-39.
[4] 谢秋菊,苏中滨.电力语音充值系统呼叫处理过程的多线程实现[J].黑龙江八一农垦大学学报,2008,20(1):82-84.
[5] 谢秋菊,苏中滨.黑龙江省农村电力远程缴费系统的设计与实现[J].农机化研究,2010(12):215-218.
[6] 刘骏,马荣盛,周亦瑾.浅析智能网充值卡查询统计系统[J].天津通信技术,2004(2):40-43.
[7] 杨路明,雷亚军.基于Delphi的分布式充值系统的实现方法[J].计算机系统应用,2003(6):73-76.