最近公司接手到了一个有挑战的项目,很有意思,拿出来和大家分享下,交流下开发过程中的一些收获和感悟。
智能电话机器人
原委是这样的,有一个大佬,手里有好多好多,总之就是好多手机充x卡,他想把这些充x卡充值到不同的用户手机号里。有的朋友接触过的,会说“可以和移动去谈,然后搞到移动的接口,根据接口开发程序,然后把充x卡密码都弄进数据库里,用程序读取,之后调用移动接口完成充值。” 说得好,漂亮!而且充x卡密码存到数据库里面这件事,大佬已经找人没日没夜加班干活全都录入到数据库里了。
但是事实很悲催,由于各种原因,不能通过移动的接口来做。只能通过1xx86语音电话来做。于是有了这个项目需求。
需求也不复杂,就是需要一个电话机器人,来模拟人工,拨打电话,根据对方说的内容,按对应按键进入指定菜单或者输入一些数据(例如:手机号码、充x卡密码),最后也是最关键的,需要识别出对方说的提示,是成功还是失败来确定操作是否成功,并将操作结果记录在数据库中。
需要做到以下目标:
- 通过编程控制设备完成摘机,拨号等操作,直到拨通某服务电话(例如:1xx86)
- 能够进行语音识别,识别出电话中对方所说的关键词(例如:普通话请按1)
- 根据关键词(例如:普通话)执行不同的拨号操作,例如:按1
- 正确输入所需数据,例如:手机号,和充x卡密码
- 根据对方所说的语音,识别出操作是否成功(例如:充值成功)
- 操作所需数据,以及操作产生的记录信息均存放在数据库中
- 程序要健壮,能应对各种异常情况。例如:语音识别不出,或者不准确,有误判,电话线路质量不好,电话拨不通等等。
实现方案
根据上述的需求,我发现有两个问题是比较重要的:
- 采用什么设备来完成拨号,按键等等与1xx86的交互?
- 用什么技术来实现语音识别1xx86那边所说的语音?
针对这两个技术问题,我做了一下技术调查,问题1,用什么设备与1xx86交互?
最开始想到的是语音IVR,做了一些调查,但是发现这个东西不是我们需要的。IVR的主要功能是作为一个语音电话的"Server",也就是被叫方,用户拨号进来,IVR播放语音给用户听,然后根据用户的按键实现不同的操作。
也就是说IVR是作为被叫方,做应答的。这显然不是我们需要的,我们需要的是作为"Client",也就是主叫方,去主动拨打1xx86的,然后按键选择不同菜单,或者输入手机号等等信息,不需要播放语音,也不需要识别按键。我们需要的是能够拨号,能够进行按键操作。
综上所述,IVR被PASS。
之后,又想到了一种方案,那就是Modem!!!
什么?你想到了那个会吱吱乱叫的老式拨号56k猫?没错,不过我需要的是一个支持AT命令的可编程Modem.去网上搜了一下,还真有卖这种设备的,他们称之为 工业Modem.
说做就做,果断找到销售,购买了一个工业Modem。东西很不起眼,一个铁盒子,上面插口不少:电源AC,串口RS232,话筒MIC,喇叭SPK,电话机PHONE,电话线LINE。
我需要的有串口RS232,喇叭SPK,电话线LINE.
用一根音频线连接Modem的喇叭SPK口和PC机的声卡线路输入LINE IN接口,(这里注意,一定是线路输入LINE IN,不能使用麦克风MIC接口,麦克风接口由于阻抗不匹配,导致接受到的音质非常差,不能使用)
用串口线连接Modem的串口和PC机的串口.
把电话线插在Modem的LINE口上.
接下来打开Modem的电源,用SecureCRT连接串口,敲入些AT命令,看看Modem能否执行.
好,做到这里硬件上的准备工作就算做完了.
PS:未完待续
智能电话机器人,使用Microsoft语音识别技术(Speech sdk)