空号识别介绍

什么是空号识别

全称应该是拨号音分析或者号码状态识别,大家都叫空号检测,或者空号识别。原理就是通过分析拨打电话接通之前的声音,一般有这几种类型,长嘟的回铃音,短嘟嘟的忙音,彩铃,通话中,空号,关机等交换机给出的各种提示。分析程序通过分析声音的频率和特征,可以识别出现回铃音、忙音、彩铃,通过语音识别或者样本库比较可以识别出通话中,空号,关机,无人接听等交换机给出的被叫状态。

空号识别的用处

主要用户自动外呼系统准确的获取呼叫失败原因,执行各种业务操作比如电话会议,电话通知,呼叫转接可以快速返回呼叫失败,不需要等60秒后电路主动挂断才知道呼叫失败。也可以用于外呼系统节省线路资源,提高线路使用率和加快外呼速度,提高坐席接通率。

可以识别出多少状态

回铃,忙音,彩铃等信号音以及下面的da2的状态列表

id name alias description
2 关机 power off 关机
3 空号 does not exis 空号
4 停机 out of service 停机
5 正在通话中 hold on 正在通话中
6 用户拒接 not convenient 用户拒接
7 无法接通 is not reachable 无法接通
8 暂停服务 not in service 暂停服务
9 用户正忙 busy now 用户正忙
10 拨号方式不正确 not a local number 拨号方式不正确
11 呼入限制 barring of incoming 呼入限制
12 来电提醒 call reminder 各类秘书服务
13 呼叫转移失败 forwarded 呼叫转移失败
14 网络忙 line is busy 网络忙
15 无人接听 not answer 无人接听
16 欠费 defaulting 欠费
17 无法接听 cannot be connected 无法接听
18 改号 number change 改号
19 线路故障 line fault 线路不能呼出,比如SIM卡欠费
20 稍后再拨 redial later 各种稍后再拨提示

怎么使用它

  • FreeSWITCH
    有为FreeSWITCH开发专用模块,mod_da2。
  • Asterisk
    使用SIP抓包识别接口,SIP抓包识别接口。
  • 录音文件
    使用文件识别接口,录音文件识别接口。
  • VOS GOIP 语音网关
    使用直接外呼识别,直接外呼识别。
  • 其他
    使用二次开发接口,二次开发接口。

开发过程

大约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终于可以发布了。

你可能感兴趣的:(空号识别)