我的《号码状态识别》之路

今天,经过我18个月开发的,号码状态识别2.0测试版本正式完成,在这个特殊的日子里,先回顾一下我的号码状态识别之路吧。

大约2008年的时候,有一天老板问我:“我们外呼很多都是无法接通的号码,需要大约1分钟才会挂断,这样即浪费线路资源(那个时候每E1大约需要3000月租费用),又导致坐席很久才可以接通一个电话。有没有办法把无法接通的立即挂断了呢?”。

我想了想说:“虽然7号信令协议里有一个挂断原因,但是大部分时候不管空号,关机,还是通话中,挂断原因码都是一样的,而且都需要大约60s才会返回呼叫失败,应该没办法实现这个功能的。”

老板说:“用语音识别呢?”

我:“这个我得研究研究。”

我的号码状态识别(简称空号检测)研究就这样开始了。

插曲:大约这个时候蓝星际公司的老总朱东宁先生成功开发出了一个声音模式匹配的识别引擎。我有向老板推荐直接购买,大家都懂老板需要的是免费的,我只能自己慢慢摸索了。

刚开始我尝试用 XP系统自带的《Microsoft Speech SDK》的命令识别,做了一个demo,录制了一些声音,设置了‘关机’,‘空号’,‘通话中’等命令,识别率实在太差,没法实用。那个时候除了微软的SDK,能知道的就是 IBM也有一个识别系统,可是根本没地方下载。朱总的模式识别是怎么个原理我又不懂,我只能另辟蹊径,到处搜索波形比较算法。功夫不负有心人。经过长达2个星期的到处搜索和分析后,终于找到一个感觉靠谱的波形比较算法,于是我按照那个算法写了一个代码,然后把1个声音文件稍微修改一点和原文件比较,奇迹发生了,返回的文件相识度和文件实际差异是一致的,但美中不足的是这个算法要求2个波形长度必须一样。经过我一个晚上的苦思冥想后,这个问题也想到了解决办法,号码状态识别的第一个雏形就这样产生了。

雏形版本上线运行后发现的主要问题 声音文件听上去感觉一样的,但是不同设备的录音文件用cooledit打开,波形却有些变化,算法比较的结果是相识度低于阈值,导致无法识别。

后面,公司停止运营呼叫中心了,我没事的时候,还在继续想着怎么提高号码状态识别的准确性,后来看了很多资料,语音识别等等都是对频域的数据进行分析,而不是时域的数据。也就是FFT后的数据。

FFT后的数据到底什么含义,好吧继续研究,看了大部分文章还是一头雾水,终于在看过《FFT结果的物理意义》这个文章后5遍之后,我大彻大悟,明白了FFT后数据的含义。很多年前我研究过一个图像相识度比较算法,我把那个算法套用到FFT后的数据,号码状态识别1.0 就这样诞生了。

插曲 任何识别算法都需要对声音进行VAD,也就是端点检测,没有一种可靠的VAD算法,相识度比较算法是没法在实际环境中使用的,我花了大量时间写出可靠的VAD算法 号码状态识别1.0才开始具备商用条件

电话回铃声音 一般可能是 忙音信号,回铃音信号,彩铃声音,空号、关机等提示音。号码状态识别1.0 对彩铃的检测原理是如果持续大声超过一定时间认为是彩铃,彩铃歌曲千变万化,1.0检测原理过于单一,对彩铃的识别率不高,为了解决这个问题,乐器识别,鸟声识别,哼唱识别的等等代码和算法我都下载来测试和研究,这样没头绪的折腾了好几个月,终于我写出了一个比较可靠的伴奏识别算法,可以 1-2秒内识别出是否是音乐。 号码状态识别 1.1,就这样诞生了。

随着用户的增加,号码状态识别 1.1的缺陷也暴露出来,每个用户都要花费时间去收集样本库,G729,GSM等转码后的声音识别率会下降,于是我决定重新设计一个新的算法来解决这些问题。2.0就这样开始了。

插曲 在研究彩铃识别的时候发现python的dejavu项目(音乐指纹算法), https://github.com/worldveil/dejavu http://willdrevo.com/fingerprinting-and-audio-recognition-with-python/ 我一度准备使用这个算法作为 号码状态识别2.0算法。花费了3个月时间把这个算法改成C++代码,经过测试效果太差,只能用于音乐声音检索,不能用于人说话声检索。

号码状态识别2.0开发过程也是非常曲折,先是花费大量时间把《Audio Fingerprinting with Python and Numpy》这个改成c++,然后是研究梅尔频率倒谱系数(MFCC),(MFCC用于号码状态检测也不是很靠谱,主要问题1不同编码声音MFCC后比较差异太大,2速度慢)等中间为了维持生活,也得不断接些外包项目中断一下,每每是刚有点眉目,中间接一个外包项目,然后重新开始思路又乱了。有一次躺在床上想到一个新算法,其他项目忙几天这个思路就再也想不起来了,不过幸运是今天,号码状态识别2.0终于可以发布了。

** 号码状态识别2.0 的主要特点

  • 1是快,非常的快,识别一次,理想的情况不需要1ms,只需要100us 左右。
  • 2支持云识别,现在不都流行云吗,一台识别服务器,可以服务很多软交换系统。
  • 3自动处理收集样本,再也不需要每个客户去手动添加样本了。
  • 4支持gsm,g729编码后的声音检测
  • 其他更多等我写使用手侧的时候再慢慢描述吧。