基于交互式语音应答的语音服务热线的研究
2012-09-17刘向宇
刘向宇
0 引言
当前社会已经从工业经济时代进入到“电子商务”时代,全球经济一体化进程不可逆转,企业市场竞争环境日趋激烈。各个企业都在寻找新的客户服务以及与此相关的营销解决方案。如何进一步提高客户服务水平,维系老客户,拓展新客户,不断提高客户满意度和忠诚度,保证业务成交量持续增长和市场份额的扩大,已成为所有企业的一项重要工作。放眼全球,无论世界500强的跨国企业巨头,还是国内名不见经传的小企业,对客户以及客户服务的重视,都达到了前所未有的高度。
交互式语音应答(IVR, Interactive Voice Respond)[1]系统允许在没有操作员的情况下,建立和管理完全自动的电话服务, 以计算机数字语音处理技术为基础, 将通信、语音处理技术和数据库服务,集成到一起来实现各种应用系统的需求[6]。IVR可以提高呼叫服务的质量、减轻服务员的工作强度并节省费用,是呼叫中心实现人机交互的重要门户。IVR是以普通电话机为用户界面, 为客户提供通过语音和电话按键进行交流的系统。客户通过电话的按键向系统提出问题或要求, IVR 系统则通过录音或合成语音来回复客户的要求。IVR不仅可以减少甚至取代业务代表的操作,达到改善客户服务质量、提高工作效率、节约人力、实现24小时服务的目的,同时也可方便用户,减少用户等候时间,增加呼叫数量,降低电话转接次数。并且,IVR是实现并发量大的交互式娱乐互动的最佳方式。同时,IVR也被认为是呼叫中心最大限度节省费用的有效途径。
1 系统体系的结构
1.1 IVR系统的结构
本系统将安装有语音卡的 IVR 服务器和公用电话网络相连,把计算机和电话机的优势有机地结合,以声音作为媒介,通过电话机来完成数据的传送和获取,由计算机来保存和处理这些数据,达到系统自动受理的目的[2]。系统的核心是电话语音卡,它是计算机与电话通信的枢纽,实现把电话输入转换成具体语音信息的功能。
1.2 电话语音自动应答流程控制
当程序对语音卡进行初始化之后,语音卡的4路通道处于电话待机状态。用户通过公用电话交换网络与安装了语音卡的服务器自动接通后,自动语音应答模块向用户提供菜单式语音选择提示。用户通过电话按键选择需要使用的功能。系统获得用户的电话按键之后,通过数据存取模块获取所需要的数据,最后将数据存取结果,通过文语转换通过电话播放给用户,其程序结构流程,如图1所示:
图1 交互语音应答流程
2 电话语音互动菜单
2.1 语音菜单数据结构
电话语音菜单采用树状结构,该树状结构有一个根节点、若干个子结点和若干个页结点。其中这个树的最大度数m,树的高度一般不超过3。因为电话机数字键从0到9,所以定义树的每个结点的度数m≤9。定义根结点的标号=0;如果根结点有9个子结点,则第一个子结点的标号=1,九个子结点的标号=9;结点标号=1的子结点的标号=11,结点标号=1的第 n个子结点的标号=1n(其中 n≤9)。树根结点为语音菜单的接入结点,树的每个内部结点为语音菜单功能分类,叶结点为语音菜单具体功能选择。
2.2 语音菜单访问流程和算法
当语音菜单进行初始化之后,菜单自动进入根结点,当前访问结点的标号为0。遍历当前结点的子结点并播放语音提示,根据语音卡获取的电话按键访问子结点。如果电话按键是‘*’键则访问当前结点的父结点;如果电话按键是数字键则访问当前结点的子结点,并修改当前结点值为访问结点。如果当前结点为叶结点则调用功能函数,如果不是叶结点则继续访问该结点的子结点。具体的流程,如图2所示:
图2 语音菜单访问流程
访问当前结点的子结点的算法为:如果当前结点不是叶结点,则访问结点标号=当前结点标号*10+第 n个子结点(n≤9)。访问当前结点的父结点的算法为:访问结点标号=当前结点标号整除以10。
3 系统的实现
Dialogic D/4PCI 4路语音卡与交互式语音应答语音服务热线实际需要的功能和业务规模相符,这套系统采用Dialogic D/4PCI 4路语音卡进行语音处理。Dialogic D/4PCI 4路语音卡,在一片卡上可接4 条模拟电话线。
3.1 编程模式
语音卡采用信号计算总线(SCbus, Signal Computing Bus),为第三代时分多路(TDM)资源分配总线, 允许在多个数据线路上的资源中的信息传送和接收[3]。为了能够同时处理多路电话的接入,语音开发库提供了异步和同步的编程模式。每个I/O 函数均能异步或同步运作。
本系统采用一片路语音卡并无扩展要求,所以采用“多线程同步编程模式”来控制 4条电话通道。通过函数AfxBeginThread(ThreadProc,&icnt,THREAD_PRIORITY_NORMAL)实现多线程监听4路通道。
3.2 事件响应的主控制程序
Dialogic封装了Dialogic SRL(Standard Runtime Library,标准运行时库)的 API函数库[4], 函数主要是为了对所有的Dialogic设备提供事件处理和其他功能通用接口。Dialogic D/4PCI 电话语音卡提供4 条语音处理通道,并可直接与模拟电话线路相连。板上独特的双处理器结构(Digital signal processor)和通用微处理器(CPU)组成,可帮助主机处理低层任务,极大地减轻主机任务处理的负担。因此,能实时、高效地控制多条线路上的多个任务。它能准确、可靠地收发双音频拨号(DTMF)及其它电话信令如用户挂机信号。使用 Dialogic 函数 int dx_open(char *device_name, int open_mode)[5]来打开 Dialogic 的设备。其中,device_name用来标识一个Dialogic 资源,资源的名字按照Dialogic 标准命名方法。模拟设备以 dxxxBxCx 来命名,模拟卡名字以”dxxx”为前缀,B(Board)后面的x 代表模拟卡的序号,C(Channel)后面的 x 代表该序号模拟卡上的通道号。在我们的计算机上,D/4PCI 卡有4 个语音资源和4 个模拟线路接口资源。则4个通道的名字名字分别是:dxxxB1C1、dxxxB1C2、dxxxB1C3、dxxxB1C4。首先,需要知道系统里面有多少块模拟语音卡存在,使用 Dialogic函数sr_getboardcnt(DEV_CLASS_VOICE,&BoardCnt)来检测,参数 DEV_CLASS_VOICE 表示要取回系统内的模拟语音卡的数。使用获取通道数函数 ATDV_SUBDEVS(int dev),获得通道名函数ATDX_CHNAMES(int dev),参数dev为合法的 Dialogic设备句柄, 由 dx_open()函数得到。使用函数int dx_wtring(int dev,int rings,int hstate,int timeout)来等待电话的呼叫。该函数在指定的电话通道上等待由rings 指定次数的震铃或等待超时后返回。其中,dev 是打开的设备的句柄,它表示在哪一个打开的电话通道上等待电话。rings是在函数返回前需要等待到的震铃次数,一般设置为 2 就可以。hstate是表示函数等待到指定次数的震铃后,将通道设置为什么状态。通道有两种状态分别对应电话的挂机和摘机,On-Hook 和 Off-Hook。Dialogic 定义了两个常量DX_ONHOOK 和DX_OFFHOOK 来代表这两种状态。
3.3 播放语音和接收按键的属性及终止条件设置
1) 输入/输出转移表DX_IOTT
DX_IOTT 数据结构包含输入/输出转移表的参数。DX_IOTT结构确定声音数据的一个来源或者目的地。它被用于dx_play()以及dx_rec()函数。DX_IOTT 结构描述单个的数据的传输, 到达或来自一个文件、内存块或者定制设备。如果异步运行,DX_IOTT 数据必须保持在函数持续期间的范围中。
2) DV_TPT 结构
DV_TPT 终止参数表用来设置多种 Dialogic 语音卡产品的输入/输出函数终止条件。输入/输出函数dx_clrtpt ()、dx_getdig()、dx_play ()、dx_rec ()和 dx_playtone ()使用这个结构。当设置在 DV_TPT 内的条件之一发生, 输入/输出函数将结束。如果你设置不止一个结束条件, 发生的第一个将结束该输入/输出函数。DV_TPT 结构可以配置为一个链表或者阵列, 每 DV_TPT 指定一种终止的条件。例如通过该参数表可以设定播放的终止条件:播到文件末端, 接收到一个或多个按键, 或接收到一个挂机音频等。
3) 播放语音的函数
IVR系统通过播放事先录制好的语音信息指导用户通过电话操作。函数dx_play() 在一个指定的信道上播放已记录的声音数据或者传输模拟展示服务接口(ADSI, Analog Display Services Interface)的数据。声音数据可以来自数据文件, 存储器或者定制设备的任何结合。该函数在 srllib.h、dxxxlib.h 声明为 int dx_play(int chdev, DX_IOTT *iottp,DV_TPT *tptp, unsigned short mode); 其中有四个参数。参数chdev 为合法的 Dialogic 通道设备句柄, 由 dx_open()函数得到。参数iottp 为指向输入输出传输表结构的指针。参数tptp 为指向终止参量表结构的指针。参数mode 为该播放任务的异步/同步播放模式的位标识。使用DV_ TPT 结构确定播放的结束条件。播放持续直到全部在 DX_ IOTT 里指定的数据已经被播放完毕, 或者直到在 DV_TPT 里指定的那些条件之一满足。
当 dx_play( )终止时, 当前信道的状态信息, 包括终止的原因, 可以使用扩展的属性函数来访问。异步的播放终止由 TDX_PLAY 事件来指示。dx_play()终止之后, 使用ATDX_TERMMSK()函数来确定终止的原因。如果握手和输送是成功的, 函数正常地结束, 伴随用ATDX_TERMMSK ()返回的终止标识TM_EOD(录音重放到达数据末端), 来表明操作已完成。使用标准运行库(SRL)的事件管理函数来处理终止事件。
4) 取得按键的函数
用户通过电话按键在服务系统进行菜单选择。dx_getdig()函数收集来自一个信道字符缓冲的字符。在函数的终止时, 收集成的字符以 ASCII 的格式被写进入如DV_DIGIT 结构安排的局部缓冲。该函数描述为:int dx_getdig(int chdev, DV_TPT *tptp, DV_DIGIT *digitp, unsigned short mode); 其中, chdev 为合法的Dialogic 通道设备句柄, 该句柄当使用dx_open()函数打开通道时获得。tptp为指向终止参量表结构的指针。digitp 为指向用户字符缓冲结构的指针。
4 仿真测试
基于以上设计思路建立系统软件,通过多门电话拨打4路电话,对系统自动应答功能和语音菜单功能选择进行测试。
4.1 测试环境
1)系统硬件环境:一块Dialogic D/4PCI 4路模拟语音卡和一台IBM服务器,双核2.4GHz,2G内存;4条同号码的电话线路。
2)系统平台环境:服务器操作系统 Microsoft Windows 2003 Server和Dialogic System Release 6.0驱动。
4.2 测试方法
1) 电话访问自动应答测试 多门电话同时拨打4路电话号码,检测语音卡接听响应时间以及 4路电话同步实现情况。
2)语音菜单功能选择测试 测试语音菜单按键访问响应时间已经语音播放延时和准确性。
4.3 测试结果
经测试证实,4路信号同时接通响应时间正常,多线程同步编程模式控制4路语音卡接听信号正常,没有出现控制混乱情况。电话按键信号接收和语音播放正常,使用情况良好, 通道没有发生因为忙音、无人接听以及关机, 也没有出现语音播放时间而出现死循环。 测试结果表明:采用多线程同步编程模式控制4路语音卡,通过电话按键能准确与语音卡服务器进行信息交互。
5 结束语
本文设计的系统能够提供自动应答和语音菜单访问2个主要功能,系统除具有一般IVR 程序自动语音应答功能外,通过语音菜单访问,能比较方便地实现一些语音服务的扩展功能,如语音点播,根据用户按键获取信息实现数据检索等等的服务项目。语音菜单播放录音文件进行提示,服务项目和菜单修改复杂,将菜单语音提示改进为通过文语转换播放是今后努力的方向。
[1]肖熙,王侠,王作英. 基于语音卡实时数据采集的电话语音识别系统. [J]计算机工程与应用 ,2003,17
[2]任淑霞,赵政. 基于多通道语音卡的招投标专家系统.[J]计算机工程 ,2010,3
[3]陈箫枫,潘保昌,郑胜林,赵全友.用语音卡实现电话与电脑的信息交互. [J]微计算机信息 2007,10-3
[4]谭保华, 吴坚,熊健民. Dialogic语音卡通道清空的分析与实现. [J]湖北工业大学学报, 2006, 2
[5]Intel Dialogic Corporation. Voice Software Reference:Standard Runtime Library for Windows. Intel Dialogic System Release 5.1.1 Feature Pack 1 for Windows Release Guide, 2002
[6]曹静. 开源交互语音应答系统的应用. [J]计算机与现代化 2010,10