31

声纹判断在电话系统中的应用

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzI1NDc5MzIxMw%3D%3D&%3Bmid=2247488202&%3Bidx=1&%3Bsn=acb7836ad3fea54ca7c27eb356b95d98
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

导语

本文介绍58二手车使用声纹技术骚扰电话甄别方面所做的一些探索、应用和实践,希望对大家有所帮助和启发。

背景

二手车作为主要车辆信息发布平台,线上看车是大家了解二手车行情的一个重要渠道。随着二手车在线帖子数量的不断增长和用户量不断增加,大量在线展示电话数据就成了泄露个人信息一个切口,为保护用户的隐私电话,二手车技术团队自研了一套电话转接系统,用转接号码替换用户真实电话。随着技术更新迭代,电销机器人的出现,为客服工作节省人力成本的同时,以为我们平台带来一些烦恼。这种利用机器合成或是人工录音方式,通过批量电话,低成本的获取用户真实号码,多数用户在不知情的情况下把信息泄露了。我们还发现同一个用户会在一段时间内连续接到这类电话,可能用户会使对我们平台产生不信任感,影响二手车平台的价值输出。为了应对这类问题,二手车技术团队自主研发声纹识别工具,对电销号码进行拦截,保护用户信息。

系统介绍

语音识别与声纹识别有相似的之处,都是对采集到的声音信号做处理,提取特征并建立模型,然后做出判断。不同的是声纹识别目的是识别出说话人的身份,是一种生物特征的识别。半固定文本,SV(Speaker Verification)判断,确认某段语音是否是指定的某个人所说的,是“一对一判别”问题。
人在讲话时使用的发声器官在尺寸和形态方面每个人的差异很大,所以任何两个人的声纹图谱都有差异,主要体现在:共鸣方式特征、嗓音纯度特征、平均音高特征和音域特征。
不同人的声音在语谱图中共振峰的分布情况不同,声纹识别正是通过比对两段语音的说话人在相同音素上的发声来判断是否为同一个人。

ZZFF3ii.jpg!web

图1(声谱图)

我们遇到的问题是,一批电销号码使用相同录音,接通电话后使用设定好的录音问题与用户进行对话,进而向用户索要个人电话号码,这时不知情的用户可能就会把电话暴露给对方了。这些主叫号码在话单中出现次数并无规律,使用统计较难找出多数的电销号码,也有一定的误判概率,统计结果的每一段录音需要人去听,完成这项工作的成本较高,也有较大时间滞后性。
我们使用人工加机器学习的方式提升拦截效率和拦截量,同时降低误判率。人工统计发现问题电话,用这种方式选取训练用的语料录音,用深度学习生成分类模型,用于判断电话录音是否是问题电话,如果符合问题电话特征,讲主叫号码放入黑名单,用于呼入拦截判断。目前的流程属于后置判断,通过对已有电话录音的分析,判断主叫电话是否应该被拦截。如果发现新录音,再循环上述流程。
我们研发的声纹识别工具有三部分组成:
模型文件系统,存储不同阶段获得的模型,进行模型训练。
API,对外提供识别能力的接口,识别结果作为人工标记部分的输入。
人工标记,把未识别(识别结果是-1)或识别错误(与统计结果不符)的数据进行人工标记。

E7niQbj.png!web

图2(系统构成图)

模型训练数据来源是电话录音。运营商提供的电话录音已经进行了左右声道分离,这里只使用主叫部分的语音,也就是右声道的音频数据。
音频数据处理过程:
格式转换,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维特征。有些声纹识别的场景,直接用这里获取的特征就能获取不错的效果,例如歌曲识别。
整个处理过程如下:

nmuqyiy.png!web

但是在说话人识别上,并不能满足需要。同一说话内容每次都可能有差别,不同说话人同一句话声波的能量采集点相似度可能比较高,正样本数量的增加也会带来计算量的激增,说话的音频数据中可能掺杂背景噪音,降低了特征的表征能力,所以需要进一步的处理。
下面两个图取自同一声音的不断两端录音生成的声谱图(同一人不同时序上的波形差异):

naiUr2Y.png!web

6fQzQ3F.png!web

图4(来自训练集声谱图)

不同时刻共振峰有着明显的差异,有足够的表征力,用其建立模型,应该能达到不错的拟合效果。
语音的前后发音具有较强关联性能,这能表征一个人的说话习惯;语音内容的上下文之间也有很强的相关性,这些特性与文本识别的场景相似。借鉴文本识别中用到的RNN模型,我们也使用了属于RNN模型的LSTM模型。LSTM对有时序性的数据有较好表征能力,同时利用LSTM中的Forget gate减少计算过程中噪声信息的传递,很适合利用LSTM的优势来提取特征。LSTM每次循环都会带有一定权重的上一级特征,契合了语音具有的特性。
有些时候预测可能需要由前面若干输入和后面若干输入共同决定,这样会更加准确。双向LSTM在Forward层从1时刻到t时刻正向计算一遍,得到并保存每个时刻向前隐含层的输出。在Backward层沿着时刻t到时刻1反向计算一遍,得到并保存每个时刻向后隐含层的输出。我们使用双向LSTM搭建了如下神经网络。
整体网络结构如下图:

3Mb2auB.png!web

图5(网络结构图)

几轮训练之后得到0.96的准确率,在测试集上也能有超过0.8的准确率。

两层双向LSTM模型,sigmoid激活函数,batch_size=16, epochs=1000,训练时长大约8小时(GPU RTX2070 8G),模型700M。

线上数据测试,查准率0.65~0.85(选取7天线上录音数据),识别率有较大波动。识别率不理想,查准率最坏的情况下与统计方式相当。原因分析,模型对正样本数据覆盖不全,有些具有明显特征的样本数并没有使用的训练集中;负样本数据量不够也会造成模型的鲁棒性下降。在后续的人工校对阶段会逐渐完善。考虑到后续对分类数量的扩展,以及模型训练的复杂度,我们很难大幅扩展对负样本数据的覆盖。

最差情有35%识别错误数据,假设识别集合有1000个录音(实际情况小于这个数量),也就是350个录音进行二次识别,这部分音频从频谱上看具有较高的相似度。

我们的设想是尽量保证接口的响应时间,所有在模型选择上尽量使用计算量较小的模型。

我们计划尝试使用聚类的机器学习模型做一次再判断。我们尝试了GMM、ivector、PLDA等模型。ivector是基于GMM,从GMM均值超矢量中提取一个更紧凑的矢量,除了包含说话人空间信息还有信道空间信息;PLDA是基于ivector,对ivector的信道特征补偿算法。从实验结果来看,三种方式的输出结果相差无几,因为识别场景简单,属于二分类,录音经过前面的音频处理后,因为是包含单人语音、较轻微的背景音,所以信道空间信息对应分类准确性的形象可忽略。

GMM模型本身的缺点是分类数量增加是,参数规模也会等比例的膨胀,需要更多的数据来驱动来提升通用(或称泛化)能力,容易过拟合。使用GMM训练获得的模型鲁棒性一般。

但是,针对我们的场景,GMM且是比较好的选择。GMM多个高斯概率密度函数的加权和来拟合,可以平滑地逼近任意形状的概率密度函数,是一种参数化的生成性模型,具备对实际数据极强的表征力。

这里只用做一种类型的判断,能规避GMM缺点。同时,相比k-means,GMM能给出一个分值,需要自定义阈值判断被归类到簇的概率,对应结果设定具有一定灵活性。

GMM 的概率密度函数:

eABb6nZ.png!web

nuyMBjV.png!web

NVRbEnU.png!web

本例中,只需要一个Component,K=1,公式简化成如下形式:

JJzaEjV.png!web

参数规模较小,只需要少量训练数据既能达到不错的拟合效果。
训练样本数量时长大约20分钟(只有正样本),训练时间2分钟左右(笔记本上训练),模型大小:68K,判断耗时:毫秒级,线上查准率提升至0.95~0.97。
使用LSTM和GMM混合方式,需要对两种模型的判断阈值最组合最优选择。阈值影响到查全率与查准率通过模拟不同的阈值计算出查全率与查准率,统计结果,如图下图:

Uvi63ym.png!web

图6(阈值对比图)

可以大约估计GMM的阈值为5的时候较好,但实验总是要严谨,为了得到更好的模型数据,我在此基础上通过自动修改阈值来发现全局最优的阈值组合。
GMM阈值设置为5,LSTM递减的查全率与查准率的变化图,从图7可以看出来当LSTM阈值设置为0.001的时候其查准率达到峰值。

Qb6VNfF.png!web

图7(LSTM递减的查全率与查准率的变化图)

LSTM阈值设置为0.001,GMM阈值递减的查全率与查准率的变化图,从图8可以看出GMM于是越高,查准率越高,当GMM小于5.4时,查准率呈线性下降。

VN3eEna.png!web

图8(GMM阈值递减的查全率与查准率的变化图)

从图7与图8可以看出,查全率跟查准率是一个矛盾的关系,如果要达到100%的准确率,就要承担漏掉一部分机器人的结果,要找到两者的平衡就得根据业务来定。看业务是偏向于哪个指标。以现有的数据来看,LSTM设置为0.001,GMM阈值设置为5.4的时候效果最佳。
效果统计,日均封堵100个主叫,从之前的400个话单,降为200以内。之前限制每个月投诉数量,导致没法投诉,在群里反馈问题较多。目前无限制,投诉率5%左右,线下投诉已转移至线上,比例未变 。问题解决明显,之前周均投诉量100左右,目前下降至10左右 。统计两个月数据,如图9 。

Fve2ei7.png!web

图9(话单统计图)

被拦截号码产生的话单数量(N)与被拦截号码量(M)比值(damage),该值越逼近1说明识别效果越好。

fimAriq.png!web

图10(damage变化趋势图)

图10看出,damage呈现下降趋势
如果有多个录音电话出现,这种方法就失效了,接下来进行了多人说话人识别方向探索。

多人声纹模型

实际场景中,新分类的发现仍然使用传统的统计加人工筛选的方式。解决这个问题需要实现对未标记的音频进行分类,对属于同一声纹类型数据聚合,是我们现在探索的方向。

使用与单人声纹识别类似的Embedding方式,过滤后的音频文件通过MFCC输入到LSTM网络中,输出embedding vectors。因为是聚类,输入的batch size有两个维度组成说话人(speakers)和音频(utterances),假设speakers是M、utterances是N,每个speaker都对应N个utterances,即batchsize=M*N。输出的embedding vector使用L2 范数:

3UfuQfb.png!web

这里表示第j个speaker的第i个utterance,所有第j个speaker的embedding vectors就可以写成,使用来表示第j个speaker:

nquM7nJ.png!web

对输入数据进行分类也就是求输入数据与的相似度:

输出相似度矩阵,流程如下图:

veqQRzZ.png!web

图11(GE2E系统架构,不同的颜色表示不同的说话者-图源自论文《GENERALIZED END-TO-END LOSS FOR SPEAKER VERIFICATION》)

用一天全量有效数据做训练集,训练时间达9小时,收敛效果也不好。如下图:

bUjMRrr.png!web

图12-1(loss收敛曲线)

对初始学习率(learning rate)和均匀降低的系数进行调整,收效明显,训练时间缩短至5小时。调整batch size,获得较好的loss收敛,如下图:

faa63yF.png!web

图12-2(loss收敛曲线)

测试中发现模型过拟合情况较为严重,

例如,实验输入:

enroll_list= ['speaker1.npy', 'speaker2.npy', 'speaker1.npy', 'speaker3.npy']

verif_list= ['speaker3.npy', 'speaker1.npy', 'speaker2.npy', 'speaker4.npy']

实验结果如下:

similarity matrix:

V3UJ3ab.png!web

最外层表示每个verif speaker,内部矩阵每列表示一个enroll speaker,每列中的一个元素值表示verif speaker中顺序位的utterance与这个enroll speaker相似度。只看第一个矩阵,预期的输出应该只有最后一列是,单从输出结果来看,第二列也可能被定为相似,第一列相似度也较高,这显然是不对的。

原因可能是属于每个说话人的音频时长不够,使用单人声纹模型中的音频过滤方式,属于每个人的音频时长平均3分钟,如图下图:

aAN3yqQ.png!web

图13(向量示意图)

蓝色、黄色和绿色三组点阵的centriol分别是cj、ck和ck’,计算与各个centriol的距离,由于各个点阵数据比较稀疏,可能造成与、相等而导致过拟合。

dvector直接用于多人识别,没有达到可用层度,初略的分析原因可能有:

1、语料规模不够。

2、一定量语料中有噪声数据(彩铃声、语音提示音、静音段等)。

接下来会在去除噪声数据和模型选择上做些尝试。对比不同模型在实际业务场景中的识别率表现。

总结

说话人识别方法的整个探索过程中,从傅里叶变换到机器学习到神经网络,使用先标记再识别的方式,在业务系统中有不错的收效。接下来在多人声纹识别方面继续探索,用来减少人工标记的工作量,实现从单人识别->分组->建模->单人识别的闭环系统。

参考文献

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资深研发工程师,负责二手车电话系统项目设计和研发。

阅读推荐

SFF一站式node服务管理平台实践

ZLog数据服务实践

分布式场景下基于重试机制的一致性解决方案

房产基于Swoole的PHP RPC框架设计

应用AST技术实现自动化升级React 15至React 16的解决方案

深度文本表征与深度文本聚类在小样本场景中的探索与实践

Nb2iMvQ.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK