IVR为Interactive Voice Response的缩写,意为交互式语音应答(系统)。它可以应答客户的呼叫,然后为呼叫者提供语音导航或自助服务,呼叫者可通过按键输入或使用语音命令进行选择。随后,IVR可通过呼叫路由将呼叫转移到座席或自助服务应用程序。在金融领域,IVR应用系统也被银行称之为电话银行系统。

千行百业都离不开客服系统,IVR作为客服系统中话务接入的门户,是构成客户体验感的服务排头兵。在金融领域,电话银行系统是银行与客户建立和保持沟通的重要渠道,自下而上支撑着远程银行的构建和正常运转。

开发一个兼济天下的IVR框架,善莫大焉

一个完整的IVR应用系统由IVR平台(下文简称平台)和IVR业务系统(下文简称业务系统或业务)组成。

市面上现有的、主流与非主流厂商基于软交换技术推出的IVR平台可谓琳琅满目。这些平台有共同的特点——和自身的开发工具强绑定,因此开发过程及成果都只能应用在自身的闭环系统上。虽然VXML号称是IVR的通用国际建议(此处注意:国际建议和标准不同),但是各家厂商大都也是遵循“有利则用,不利则弃”这一不成文的规则,形成了多如牛毛的VXML开发过程,没有办法做到业务和平台特性的完全解耦。

这就造成一个让人头疼的问题:开发人员必须要掌握每种IVR的开发细节才行。由于开发人员对各家平台的理解程度有高有低,这些平台所使用的开发工具又多多少少地埋着各种不尽如人意的“坑”,最终导致开发出来的成品稳定性、鲁棒性各不相同,造成上线质量参差不齐且客户的业务受制于IVR平台。

综上所述,开发一个可适用于所有平台、并且基于目前最常用开发语言的、具备“兼济天下”能力的IVR框架,具有非常重要的实际意义。

框架设计思想:专业的“人”干专业的事

框架设计围绕这样的思想展开:平台只干平台的事,业务逻辑交给WebAPP来做,平台和WebAPP的交互通过目前流行的REST接口或HTTP接口。IVR平台实现基本功能:

■ 1. 来电时接起电话,作为被叫和主叫建立通话链路,也可以作为主叫呼出电话和被叫链接通话链路;

■ 2. 播放语音,可以是TTS和预录好的语音文件;

■ 3. 搜集客户的按键或客户的语音(如果有集成ASR);

■ 4. 侦测通话链路的状态(比如客户挂机等等);

■ 5. 挂断电话(可以主动挂断电话);

■ 6. 链接CTI(非基本功能,可以在服务端实现);

■ 7. 转接会议电话;

■ 8. 链接外部系统接口。

把这些基本的功能串接在一起成为一个完整的IVR应用系统(电话银行系统),由应用服务来实现。

总体交互逻辑

前文已经提到,一个完整的IVR应用系统分为IVR平台IVR业务系统两部分。

IVR平台根据具体产商不同而不同,其主要功能是接收客户来电,并在接收客户来电后搜集客户信息。执行具体的放音、按键搜集、语音识别、传真(现在很少使用)、菜单选择、转接、挂断话务层面的事情。如果平台支持IVVR则执行IVVR相关的功能,如播放视频。如果有类似UUI类的随路数据,则也由平台执行。其开发过程使用产商的开发工具,只做基本功能的开发及与平台的通讯开发。

IVR业务系统完成所有菜单匹配、流程处理、超时处理、错误判断、随路数据等等具体的业务过程,使用纯Java的开发。

其中业务系统作为服务端,IVR平台作为客户端,平台和业务系统之间采用Restful的通讯协议。

具体过程如下:

■ 1. 客户来电时,IVR平台搜集来电的基本信息,并向业务系统发起来电请求;

■ 2. 业务系统根据配置菜单来获取下一步操作,并把下一步要执行的动作返回给IVR平台,同时保留当前的业务流程上下文;

■ 3. IVR平台收到返回后执行响应的动作,并把操作的结果通过请求接口方式返回给业务系统;

■ 4. 业务系统收到请求后,根据请求结果结合当前的上下文判定后续动作,再次返回给平台;

■ 5. 重复步骤3和4。

详细交互过程

IVR平台总体逻辑架构 

基础通讯组件完成和业务系统的通讯,如果平台有现成的支持API则可以不用开发,如果没有就要根据产品平台提供的集成API来开发。

其过程如下图所示:

此处多了两个服务:一是利用平台本身开发工具提供组件调用DLL(或JAVA 通讯API)的便利性来调用C语言的DLL;二是利用JAVA解释JSON报文的有利工具来封装和解释报文。

框架说明

框架由两个部分组成:菜单和业务流程。

菜单采用XML结构来描述,一者XML文档的结构很适合用于描述菜单,二者XML的遍历开发比较成熟,对开发人员要求不算太高。

菜单的结构如下:

业务流程

所有的业务流程采用纯J2EE的服务方式开发,框架实现基本的功能,定制开发只实现具体的业务流程。主要包含:实现各类输入的属性、业务过程串接、后台交易的实现等。

业务开发步骤

■ 1. 流程开发的任务配置菜单文件;

■ 2. 开发所有输入项(比如输入开始日期、结束日期、币种等等);

■ 3. 开发业务流程,比如余额查询,首先输入卡号、然后输入密码、调交易、报读结果,最后回到上级菜单;

■ 4. 开发交易过程,配置交易提交接口、调交易、返回值封装等等,是开发的主要工作;

■ 5. 记录日志、埋点等运维及运营相关的功能。

所有业务流程都要从BusiBase类中派生出来。流程开发具体过程如下:

通过上图可以看出,一个业务流程的完成,需要和平台有多次交互才可以实现,每次交互流程类的对象都结束了,都需要保存和恢复上下文,这是一个需要特别注意的地方。

接口说明

平台和业务系统之间通过接口实现,这个接口适合于所有的平台。接口的具体内容如下:

技术漫谈|IVR通用开发框架简说的更多相关文章

  1. 客户端软件GUI开发技术漫谈:原生与跨平台解决方案分析

    原生开发应用开发 Microsoft阵营的 Winform WinForm是·Net开发平台中对Windows Form的一种称谓. 如果你想深入的美化UI,需要耗费很大的力气,对于目前主流的CSS样 ...

  2. .NET通用开发框架

    在开源中国社区,简单整理了下比较好的.NET通用开发框架.一个好的通用框架大概包括:开源.扩展性好.灵活性好.复用性好.维护性好.易测试.易发布.易部署.快速业务搭建(或业务集成).通用性强.参考资料 ...

  3. 【原创】Java内存攻击技术漫谈

    前言 Java技术栈漏洞目前业已是web安全领域的主流战场,随着IPS.RASP等防御系统的更新迭代,Java攻防交战阵地已经从磁盘升级到了内存里面. 在今年7月份上海银针安全沙龙上,我分享了< ...

  4. 射频识别技术漫谈(10)——识别号的格式变化【worldsing笔记】

    从事RDID行业的朋友经常会遇到这样的情况,同一张ID卡,在不同厂家生产的读卡器上读出的识别号完全不一样,有时甚至差之千里.ID卡的识别号一般是在出厂时被固化在卡片的ROM里,本身是不会改变的,问题出 ...

  5. 技术漫谈 | 远程访问和控制云端K8S服务器的方法

    对于部署在云端的K8S容器编排系统,可以先通过SSH远程登录到K8S所在主机,然后运行kubectl命令工具来控制K8S服务系统.然而,先SSH登录才能远程访问的二阶段方式,对于使用Linux桌面或者 ...

  6. OpenStack 实现技术分解 (7) 通用库 — oslo_config

    目录 目录 前文列表 扩展阅读 osloconfig argparse cfgpy class Opt class ConfigOpts CONF 对象的单例模式 前文列表 OpenStack 实现技 ...

  7. OpenStack 实现技术分解 (6) 通用库 — oslo_log

    目录 目录 前文列表 扩展阅读 日志级别 oslolog 初始化设置 DEMO oslolog 的相关配置项 oslolog 的日志级别 oslolog 的使用技巧 推荐使用 LOGdebug 的地方 ...

  8. 议题解析与复现--《Java内存攻击技术漫谈》(一)

    解析与复现议题 Java内存攻击技术漫谈 https://mp.weixin.qq.com/s/JIjBjULjFnKDjEhzVAtxhw allowAttachSelf绕过 在Java9及以后的版 ...

  9. 走进JavaWeb技术世界16:极简配置的SpringBoot

    一位阿里 Java 工程师的技术小站.作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔讲点Docker.ELK,同时 ...

  10. 射频识别技术漫谈(1)——概念、分类

    现代社会智能卡已经渗透到生活的方方面面,公交卡.考勤卡.身份证.手机卡等等数不胜数.    智能卡按使用时是否和读卡器接触可分为接触式智能卡和非接触式智能卡,接触式智能卡上有6-8个触点,使用时插在卡 ...

随机推荐

  1. CMake 属性之全局属性

    [写在前面] CMake 的全局属性是指在 CMake 配置过程中,对整个项目范围生效的设置. 这些属性不同于目标 ( Target ) 属性或目录 ( Directory ) 属性,后者仅对特定的目 ...

  2. Nuxt.js 应用中的 page:transition:finish 钩子详解

    title: Nuxt.js 应用中的 page:transition:finish 钩子详解 date: 2024/10/10 updated: 2024/10/10 author: cmdrago ...

  3. watch 监视搜索关键词的变化不断发送请求返回建议

    watch: { keywords: { // yarn add lodash 下载lodash包 // import { debounce } from "lodash"; 引入 ...

  4. input 的hidden 属性

    hidden 会隐藏input 标签内容显示,不占位置 : <input type="file" name="" id="" ref= ...

  5. Gitlab私有存储库支持SourceLink 调试之使用proxy方式

    前情概要 在 让你发布的nuget包支持源代码调试#为gitlab的私有源代码项目提供支持 小节中有介绍到如何让gitlab的私有存储库支持SourceLink. 其中有一个方法是说在vs中打开web ...

  6. 云原生周刊:Gateway API v1.1 发布 | 2024.6.3

    开源项目推荐 Grafana Tanka Tanka 是 Grafana 开发的一款用于 Kubernetes 的灵活.可重用和简洁的配置工具,是使用 YAML 进行 Kubernetes 配置的一种 ...

  7. KubeSphere 社区双周报 | OpenFunction 集成 WasmEdge | 2023.02.03-02.16

    KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...

  8. 【2024有效】WordPress忘记密码找回登录密码的最简单有效的方法

    这个找回Wordpress后台密码密的方法,前提是,可以操作数据. 最近忘记了极客侠网站登陆密码,还是按照以前的方法,进入数据库直接修改数据库, 但是现在wordpress密码的加密不是简单的MD5所 ...

  9. QT creator中cmake管理项目,如何引入外部库(引入Eigen库为例)

    在Eigen的官网下载压缩包[点我进入] 解压到当前项目的根目录(当然你也可以自己选择目录) 在当前项目的CMakeLists.txt任意位置加入这句话include_directories(${CM ...

  10. 怎样替换 rhel 7.3 的 yum

    [背景] 想在自己安装的虚拟机上搭建一套 git+gitee+vscode 环境(欢迎看下期文章),发现python版本是2.7,这个版本太老 想通过yum进行更新,结果提示需要注册,索性就查查替换y ...