导语
背景
系统介绍
语音识别与声纹识别有相似的之处,都是对采集到的声音信号做处理,提取特征并建立模型,然后做出判断。不同的是声纹识别目的是识别出说话人的身份,是一种生物特征的识别。半固定文本,SV(Speaker Verification)判断,确认某段语音是否是指定的某个人所说的,是“一对一判别”问题。
人在讲话时使用的发声器官在尺寸和形态方面每个人的差异很大,所以任何两个人的声纹图谱都有差异,主要体现在:共鸣方式特征、嗓音纯度特征、平均音高特征和音域特征。
不同人的声音在语谱图中共振峰的分布情况不同,声纹识别正是通过比对两段语音的说话人在相同音素上的发声来判断是否为同一个人。
图1(声谱图)
我们遇到的问题是,一批电销号码使用相同录音,接通电话后使用设定好的录音问题与用户进行对话,进而向用户索要个人电话号码,这时不知情的用户可能就会把电话暴露给对方了。这些主叫号码在话单中出现次数并无规律,使用统计较难找出多数的电销号码,也有一定的误判概率,统计结果的每一段录音需要人去听,完成这项工作的成本较高,也有较大时间滞后性。
我们使用人工加机器学习的方式提升拦截效率和拦截量,同时降低误判率。人工统计发现问题电话,用这种方式选取训练用的语料录音,用深度学习生成分类模型,用于判断电话录音是否是问题电话,如果符合问题电话特征,讲主叫号码放入黑名单,用于呼入拦截判断。目前的流程属于后置判断,通过对已有电话录音的分析,判断主叫电话是否应该被拦截。如果发现新录音,再循环上述流程。
我们研发的声纹识别工具有三部分组成:
模型文件系统,存储不同阶段获得的模型,进行模型训练。
API,对外提供识别能力的接口,识别结果作为人工标记部分的输入。
人工标记,把未识别(识别结果是-1)或识别错误(与统计结果不符)的数据进行人工标记。
模型训练数据来源是电话录音。运营商提供的电话录音已经进行了左右声道分离,这里只使用主叫部分的语音,也就是右声道的音频数据。
音频数据处理过程:
格式转换,mp3转wav,方便声道提取等后续操作;
提取右声道;
音频分段,根据语音中的停顿部分,把一段较长语音分成多个小段,这里是为了减少每个batchsize的数据量,我们采用的阈值下限是700ms,小于这个下限的部分会合并的下一段中;
过滤静音部分,这里对上一步的小段音频做一次VAD操作,把音频中无声的部分过滤掉,因为这部分数据会影响模型判断精度,大概率造成过拟合。VAD效果如下图:
图3(VAD前后波形对比图)
右侧是原数据,左侧是VAD后。
最后输出的音频长度控制在15s内(经验值)。
预训练集数据规模:训练数据集1213条原始录音数据,分段后总时长约2300分钟;测试集1997条。
人工标记的新增训练数据处理方式与上述步骤一样。
预测数据的处理类似,不同的是只取一个段音频用于识别。因为一定电话录音开始和结束的话术很相近,例如:“喂,你好!”、“再见!”、“byebye.”等,这里选取顺序在中间位置的音频段,这样能进一步防止过拟合。
获取音频特征,我们选用MFCC(Mel Frequency Cepstrum Coefficient),计算量可接受的情况下较好的提取语音中的频率特征,尤其是MFCC的预加重处理能较好的保留高频信息和DCT在保证特征量的同时减少计算量。提取音频特性滤波组由26个滤波器组成(一组通常取20~40个三角滤波器组
),对音频能量信号信息滤波处理,对得到能量值取对数、进行DCT,得到26个倒谱系数,保留2~13这12个系数,其它系数都接近于0,这里就都忽略了,再把能量也加入到特征中,得到音频的13阶特征,抽取13阶特征的一阶差值和二阶差值,一共是39维特征。有些声纹识别的场景,直接用这里获取的特征就能获取不错的效果,例如歌曲识别。
整个处理过程如下:
但是在说话人识别上,并不能满足需要。同一说话内容每次都可能有差别,不同说话人同一句话声波的能量采集点相似度可能比较高,正样本数量的增加也会带来计算量的激增,说话的音频数据中可能掺杂背景噪音,降低了特征的表征能力,所以需要进一步的处理。
下面两个图取自同一声音的不断两端录音生成的声谱图(同一人不同时序上的波形差异):
图4(来自训练集声谱图)
不同时刻共振峰有着明显的差异,有足够的表征力,用其建立模型,应该能达到不错的拟合效果。
语音的前后发音具有较强关联性能,这能表征一个人的说话习惯;语音内容的上下文之间也有很强的相关性,这些特性与文本识别的场景相似。借鉴文本识别中用到的RNN模型,我们也使用了属于RNN模型的LSTM模型。LSTM对有时序性的数据有较好表征能力,同时利用LSTM中的Forget gate减少计算过程中噪声信息的传递,很适合利用LSTM的优势来提取特征。LSTM每次循环都会带有一定权重的上一级特征,契合了语音具有的特性。
有些时候预测可能需要由前面若干输入和后面若干输入共同决定,这样会更加准确。双向LSTM在Forward层从1时刻到t时刻正向计算一遍,得到并保存每个时刻向前隐含层的输出。在Backward层沿着时刻t到时刻1反向计算一遍,得到并保存每个时刻向后隐含层的输出。我们使用双向LSTM搭建了如下神经网络。
整体网络结构如下图:
图5(网络结构图)
本例中,只需要一个Component,K=1,公式简化成如下形式:
参数规模较小,只需要少量训练数据既能达到不错的拟合效果。
训练样本数量时长大约20分钟(只有正样本),训练时间2分钟左右(笔记本上训练),模型大小:68K,判断耗时:毫秒级,线上查准率提升至0.95~0.97。
使用LSTM和GMM混合方式,需要对两种模型的判断阈值最组合最优选择。阈值影响到查全率与查准率通过模拟不同的阈值计算出查全率与查准率,统计结果,如图下图:
图6(阈值对比图)
可以大约估计GMM的阈值为5的时候较好,但实验总是要严谨,为了得到更好的模型数据,我在此基础上通过自动修改阈值来发现全局最优的阈值组合。
GMM阈值设置为5,LSTM递减的查全率与查准率的变化图,从图7可以看出来当LSTM阈值设置为0.001的时候其查准率达到峰值。
图7(LSTM递减的查全率与查准率的变化图)
LSTM阈值设置为0.001,GMM阈值递减的查全率与查准率的变化图,从图8可以看出GMM于是越高,查准率越高,当GMM小于5.4时,查准率呈线性下降。
图8(GMM阈值递减的查全率与查准率的变化图)
从图7与图8可以看出,查全率跟查准率是一个矛盾的关系,如果要达到100%的准确率,就要承担漏掉一部分机器人的结果,要找到两者的平衡就得根据业务来定。看业务是偏向于哪个指标。以现有的数据来看,LSTM设置为0.001,GMM阈值设置为5.4的时候效果最佳。
效果统计,日均封堵100个主叫,从之前的400个话单,降为200以内。之前限制每个月投诉数量,导致没法投诉,在群里反馈问题较多。目前无限制,投诉率5%左右,线下投诉已转移至线上,比例未变 。问题解决明显,之前周均投诉量100左右,目前下降至10左右 。统计两个月数据,如图9 。
图9(话单统计图)
被拦截号码产生的话单数量(N)与被拦截号码量(M)比值(damage),该值越逼近1说明识别效果越好。
图10(damage变化趋势图)
图10看出,damage呈现下降趋势
如果有多个录音电话出现,这种方法就失效了,接下来进行了多人说话人识别方向探索。
多人声纹模型
输出相似度矩阵,流程如下图:
总结
说话人识别方法的整个探索过程中,从傅里叶变换到机器学习到神经网络,使用先标记再识别的方式,在业务系统中有不错的收效。接下来在多人声纹识别方面继续探索,用来减少人工标记的工作量,实现从单人识别->分组->建模->单人识别的闭环系统。
参考文献
1、A tutorial on MFCCs for Automatic Speech Recognition
2、漫谈 Clustering (3): Gaussian Mixture Model
3、Understanding LSTM Networks
4、GENERALIZED END-TO-END LOSS FOR SPEAKER VERIFICATION
作者简介
穆文斌 58同城ABG资深研发工程师,负责二手车电话声纹等NLP在二手车业务中的实践与应用。
吕龙云 58同城ABG资深研发工程师,负责二手车电话系统项目设计和研发。
END
阅读推荐
应用AST技术实现自动化升级React 15至React 16的解决方案