本文选自《交易技术前沿》总第四十三期文章(2021年3月)
肖钢、尹序鑫、潘建东、刘国杨、王赵鹏 / 中信建投证券股份有限公司
李稀敏、叶志坚 / 厦门快商通科技股份有限公司
在本篇论文当中,我们提出了一个基于有监督学习训练的说话人分割与聚类方法,该方法基于声纹向量D-Vector,对未分离的原始音频进行切分处理,得到各个等长的音频片段,然后通过预训练的声纹识别模型当中的声纹向量提取模块,提取音频片段的声纹向量D-Vector信息,然后通过人工标注的方式对所有的音频片段标注对应的身份信息,然后通过建立RNN循环神经网络模型, 通过人工标注后的数据进行模型的训练,得到基于有监督训练的神经网络模型, 在模型在测试集的结果为DER 19%,结果比传统的无监督学习的说话人分割与聚类好。
1.引 言
随着现代科学技术的不断发展,电话成为人们日常生活中必不可少的通信工具,人们通过电话能够很方便的进行交流沟通,电话通话所产生的音频数据也在不断的增加,由于传统电话产生的音频数据是单声道的,也就是通话双方的语音是混合在同一个音频当中的,从而无法单独对其中一个人的语音进行处理,近些年来,研究人员开始研究关于电话音频的说话人分割与聚类,电话音频的说话人分割与聚类就是将一段含有两个说话人声音的电话音频,切分成多个小的音频片段,然后通过深度学习技术提取该片段的说话人声纹特征信息,然后将同一类说话人的音频片段聚合在一起,从而实现将同一个音频当中的多个说话人语音分离。
在本文当中,我们提出了一个基于声纹向量D-Vector的说话人分割与聚类方法,使用从语音片段中提取说话人的声纹向量信息D-Vector,然后通过一个RNN深度学习模型来对所有的语音片段的声纹向量D-Vector进行分类并标注说话人的标签。
2.介 绍
在最近几年,语音相关技术有很大的进步,越来越多的关于语音交互方式的技术,例如语音识别,语音合成,声纹识别等,声纹识别技术是通过音频中的说话人的声音,来判断当前说话人的身份,在电话客服应用场景当中,当获得一条客服与客户对话的语音音频时,先通过使用说话人分割与聚类技术将客服的声音和客户的声音分离开,然后使用声纹识别技术识别该客户的身份信息, 其中说话人分割与聚类技术是当前语音技术的中的一个难解决的问题,说话人分割与聚类是将语音音频进行切分,然后对所有的音频片段依据语音的声纹信息进行分类,将声纹信息同类的音频片段拼合在一起,从而实现音频中的说话人分离。具体实现流程如下:
图1 说话人分割与聚类流程图
2.1说话人分割与聚类主要分为以下几个步骤 :
1. 有效语音检测
2. 语音分割为音频片段
3. 语音片段提取声纹特征
4. 通过聚类算法将同一说话人的语音片段聚合
5. 语音识别音频身份为客服还是客户
6. 注册客户音频声纹到数据库当中
在这6个过程当中,有效语音检测,提取语音当中的声纹特征,以及语音片段的聚类算法是比较复杂的.
其中有效语音检测需要有效判断中音频中的人声所在的部分,去除音频中的非人声部分,该步骤的难点在于准确的判断语音当中人声的起始位置和结束位置。
语音片段提取声纹特征是通过声纹识别模型中的声纹提取模块,提取语音中的声纹信息,该声纹信息将会用于指代该语音所属的说话人。
语音片段聚类算法是将所有的语音片段进行按说话人类别进行分类,属于同一说话人的语音片段聚集为一类,该步骤的难点在于说话人类别的数量,以及如何精确的进行所有的语音片段的分类, 减少并尽量避免错误的分类。
在声纹向量信息提取模块当中,近年来的说话人分割与聚类通常使用D-Vector向量来作为语音的声纹向量,对比原来使用i-Vector作为声纹向量信息的系统,新方式的准确率有很大的提高,D-Vector声纹向量信息通过训练大量的带有标签的说话人音频数据来进行建模该模型可以用于识别音频中的说话人身份,我们将提取声纹向量D-Vector的模块单独取出,用于该说话人分割与聚类系统的声纹向量信息提取模块。
在该系统当中,语音片段聚类算法也是一个非常重要的模块,在过去, 聚类算法通常使用例如:高斯混合模型,K-Means,谱聚类等方法。
由于语言片段的说话人标签是有聚类算法模型来得出所以聚类算法的质量将会对最终的分离准确率结果有重要的影响,在过去,通常大部分的聚类算法是无监督的聚类方法,现在我们通过有监督的方式来建立聚类模型,在有大量带有说话人标签的语音片段音频的情况下,我们可以通过这些数据来训练一个根据说话人身份来进行语音片段分离的模型。
在这篇文章当中,我们通过有监督的语音片段分类方法来代替以前的无监督分类方式,通过该方式训练出来的分类模型具有以下特点
(1)所有的说话人声纹向量都通过一个RNN模型来进行建模,并且各个说话人的声纹向量模型共享该RNN模型的参数
(2)该RNN模型不限制输入音频时长
(3)所有的RNN模型单元,都与不同的说话人有关,并且该模型建立在时域的单位上。
通过使用有监督的聚类方法,我们可以解决复杂的说话人分割与聚类的问题,他可以自动学习当前音频当中说话人的数量,并且对所有的音频片段进行分类并标注说话人身份信息,从而实现将电话音频当中客户和客服的语音分离开来。
当我们完成将电话音频中的客户和客服的音频分离开来之后,我们就需要判断哪个音频是客户的音频,哪个音频时客服的音频这里我们使用语音识别的方式来进行判断,我们通过识别各个音频当中文字,然后根据文字中包含的关键词,从而判断出哪个音频是客户的音频,然后将客户的音频取出。
当我们得到客户的音频之后,我们需要提取客户音频中的客户的声纹向量信息, 然后将该声纹向量注册到数据库当中,用于后续的比对工作。
2.1.1 有效语音检测
有效语音检测(speech activity detection)是指检测出音频中包含有人声语音的音频区域,非人声语音区域音频可能是静音,环境噪音,音乐等类型语音,有效语音检测是说话人分割与聚类系统中非常重要的一个部分,如果在聚类过程中包含过多的非人声语音,将对说话人语音的聚类产生很大的影响。
有效语音检测一般可以分为以下3类:
⑴ 基于能量/频谱的语音检测。
⑵ 基于模型的语音/非语音检测
⑶ 混合语音/非语音检测。
(1)基于能量/频谱的语音检测
在电话语音的有效语音检测中,我们通常采用的是基于能力/频谱的有语音检测,该方法通过滑动指定大小的窗口的方式,计算窗口当中的语音平均能量大小,判断该窗口的语音平均能量大小是否超过设定的阈值,如果超过特定的阈值,那幺我们就判断该窗口内的语音为有效语音。
基于能量/频谱的有效语音检测的优点在于判断的算法简单,计算速度快, 损耗小,适用于大规模的计算场景。
基于能量/频谱的有效语音检测的局限性在于该方法无法分辨该语音是人声语音,还是音乐,还是环境噪声。
(2)基于模型的语音/非语音检测
基于模型的有效语音检测是对语音进行分类建模,例如建立一个3分类模型, 将语音分为3类,人声,非人声,静音,通过深度学习监督训练的方式, 人工标注数据进行训练,训练完成后的模型可以识别语音属于这三个类别中的哪一类。
该方法的优点在于识别准确,能够精准的区别出人声与非人声。
该方法的局限性在于需要单独训练模型,并且模型的计算量较大,会有时间上的较多的消耗,且模型会占用一定的内存空间。
(3)混合语音/非语音检测
混合有效音检测是将基于能量的有效音检测和基于模型的有效音检测相结合,该方法首先会进行简单的基于能量的检测,然后基于模型的检测,该模型直接使用测试数据进行训练,所以不需要额外使用其他的训练数据,从而使得模型体积小,识别速度快。
2.1.2 语音分割
当完成语音的有效音检测之后,我们将得到去除所有非人声区域后的语音音频,此时我们对整段语音音频进行等长切分,这里我们将每个切分区域长度设定为240ms,两个相邻的切分区域的重叠部分为50%,然后将整段音频切分为无数个等长的音频片段。
2.1.3 声纹特征提取
当完成音频片段的切分之后,我们需要提取语音片段当中的声纹特征信息,我们通过预训练的声纹识别模型中的Embedding编码网络来提取语音片段的声纹信息,声纹识别模型是通过对语音波形数据进行编码为声纹信息向量,然后再对声纹信息向量进行分类,所以这里我们单独将预训练的声纹识别模型中的Embedding编码网络取出,用于将语音音频片段转为声纹信息向量,这里使用的声纹信息编码网络的结构为3层LSTM网络,先将片段音频波形文件转为MFCC特征,然后将MFCC特征传入网络当中,得到的声纹向量称为D-Vector向量,这个向量的维度为256维,这些音频片段转为D-Vector声纹向量之后,将会被我们用来进行音频片段的分类。
我们使用的预训练声纹识别模型是使用30万条语音音频,其中包含有1万5千个说话人,我们对模型进行进一步的增量数据训练,使用50万条语音音频,其中包含有1万个说话人。
2.1.4 语音片段聚合
(1)语音聚类算法
当我们将一段音频当中所有的语音音频片段转为声纹向量D-Vector之后,假设我们用T个语音片段,那幺我们得到所有声纹向量 X = (x1,x2, . . .,xT ),x1…T表示的就是每个语音片段对应的声纹向量D-Vector,然后我们将会为每个声纹向量D-Vector信息标注标签信息Y,用于标注该声纹向量D-Vector属于几号说话人,假设3个音频片段分别属于2,3,1号说话人,那幺标签Y = (y1 = 2,y2=3,y3=1),例如如果Y = (1,1,2,3,2,2),那幺说明当前整段音频分为6个片段 ,共属于三个说话人,y1 = 2表示第一个音频片段属于第2个说话人。
我们将整个模型的预测函数归纳为该公式,就是判断声纹向量xt属于几号说话人的概率计算式子,每个音频片段所属的说话人将会基于前面的音频片段所属说话人概率。
由于多个音频片段之间可能存在说话人的转换,所以我们需要加入一个说话人转换的信息Z = (Z2, . . .,Zt ),当Zt = 1是,即出现说话人的转变,即Yt 不等于 Yt-1,Zt 属于 {0,1}
举例来说 Y = (1,1,2,3,2,2), 那幺 Z = (0,1,1,1,0),所以我们概率计算公式定义为:
以上为说话人标 签预测的标准公式,我们将创建一个RNN循环神经网络,这里我们使用的RNN循环神经网络的神经元为GRU(gated recurrent unit),该RNN循环神经网络可以记忆长时的信息,我们假设RNN网络当中的参数为θ,然后网络中的音频片段的声纹向量D-Vector在RNN网络当中的表示为Ht,RNN网络的输出向量为Mt,Mt将会用于计算说话人标签Yt的概率,其中f表示RNN网络的运算过程。
这里我们计算ht的时候,我们需要使用到的是xt’和ht’信息,其中θ为GRU神经元的参数。
该图为整个RNN循环神经网络通过音频片段的声纹向量X0….Xt预测说话人标签Y0….Yt的过程,其中一列为一个语音片段,同样颜色的语音片段代表两个语音片段为同一个说话人。
图2 RNN示意图
这里Xt是通过X[t-1]和Y[t]来进行计算:
(2)模型优化算法
当我们训练的数据中包含有N个语音片段,我们将会有(X1, X2, . . .,XN ) N个音频片段的声纹信息向量,以及(Y1, Y2, . . .,YN ) N个音频片段的说话人标签,我们对模型参数进行优化,使输入X1到模型时候,模型输出的预测标签结果最接近Y1正确标签。
以下为模型的参数估计公司,Xn,Yn,Zn 为模型的输入数据,右侧4个参数为模型需要进行计算优化的参数。
模型的整体优化可以总结为该公式,即输入音频片段Xtest声纹向量,Y说话人标签,得到的预测说话人标签Y*将会与Y真实说话人标签一致。
(3)模型网络结构
我们搭建的RNN循环神经网络结构为1层512个GRU单元,该层网络后面连接一个tanh激活函数,该tanh激活函数后面连接着两层全连接层,每个全连接层中有512个节点,每层最后使用ReLU激活函数。
(4)实验
A 数据集
这里我们使用的数据集为100K条音频数据,这些音频数据为真实电话场景下的客户与客服的对话音频,音频为电话信道的音频数据,音频采样率为8000,平均每条音频的时长为2分钟左右,每条音频都包含客服和客户的对话。
B 模型准确率评估
我们使用Diarization Error Rate (DER) 指标进行模型的准确率评估,使用60条单通道的电话通话音频,人工标记各个音频当中各个说话人说话的起始结束时间,模型预测的结果将于人工标记的各个标签进行对比,计算出模型的DER指标。
C 实验结果
我们使用60条实际电话客服中心的电话录音音频进行测试,在对所有语音的两个说话人重叠部分去除,得到的DER结果为19%。
2.1.5 音频身份语音识别
当我们完成将客户和客服的语音从电话语音当中分离开来后,我们需要识别其中哪个音频是客服的语音,哪个音频是客户的语音,这里我们使用语音识别来实现。
(1)语音音频特征提取
首先我们需要将所有的音频转为频谱图特征,这里我们使用Python的Librosa工具进行频谱图特征的提取,这里我们设置提取的频谱图的窗口大小为1024个样本点,每个窗口之间的重叠区域为0.5s,将频谱图的维度设置为512,通过将所有的音频转为频谱图特征,然后这些频谱图特征将会作为语音识别模型输入的特征。
(2)语音识别模型搭建
这里我们使用Encoder-Attention-Decoder结构的模型作为语音识别模型的网络结构,语音音频的频谱图特征首先输入到Encoder当中进行特征编码, 然后使用Attention注意力机制模块对编码后的特征进行处理,得到处理后的特征向量,再将该特征向量通过Decoder模块转为文字,从而实现语音识别的过程。
Encoder模块的结构讲解 :该模块的输入为音频的频谱图特征, 输出为该频谱图特征所对应的高维特征向量,这里记为H(encoder),这里我们使用3层一维卷积网络,通过卷积网络,可以将频谱图特征进行维度的转换,将频谱图的512维特征转为高维特征向量。
Attention模块的结构讲解 :该模块的输入为Encoder模块的输出结果特征,其中,Attention模块由3层双向LSTM网络构成,每层LSTM层由512个神经元组成,该层结构通过将Encoder模块的输出特征向量进行处理, 得到的特征结果将会传入Decoder模块当中进行解码操作。
Decoder模块的结构讲解 :该模块的输入为Attention模块的输出结果特征,其中,Decoder模块由一层全连接网络构成,该全连接网络的作用在于将Attention模块的输出结果转为能够代表文字结果的特征向量,该特征向量将会作为整个模型最终的输出向量。
模型损失函数的讲解 :该模型使用CTC损失函数作为模型训练的损失函数,每个音频数据有频谱图和对应的文本两个数据,频谱图作为模型的输入,对应的文本数据作为模型结果的比对数据,将音频的频谱图作为模型的输入,然后模型的输出结果将会与该音频的对应文本进行计算CTC损失值,然后使用Adam算法进行模型的迭代优化。
(3)语音识别模型识别语音文字并判断说话人身份
我们将说话人分割聚类分离后的两条语音输入到语音识别模型当中进行识别, 并且我们对得到的文字结果进行判断, 如果文字结果中包含有关键词 : “您好”,“我是…公司…客服..”,“请问您是…..”,“跟您进行个简短的电话回访”等,则我们判断当前语音属于客服的语音,并且判断另一条语音为客户的语音。
2.1.6 音频声纹注册
(1)提取客户音频的声纹向量信息
当我们分离得到所有的客户语音音频之后,我们需要提取出客户的声纹向量信息,这里我们需要使用预训练的声纹识别模型,将声纹识别模型当中声纹提取模块单独取出,用于提取客户语音的声纹向量信息。
(2)声纹向量信息提取模块
这里我们使用预训练的声纹识别模型中的Embedding编码网络来作为声纹向量信息的提取模块,这里的Embedding编码网络的结构为3层的LSTM网络,我们将客户语音音频先转为MFCC特征,然后将MFCC特征传入编码网络当中,编码网络的输出结果就是声纹向量,我们称为D-Vector向量,该向量的维度为256维,该向量将会用来表示客户的声纹信息。
(3)将客户声纹向量信息保存到数据库中
当我们完成客户声纹向量信息的提取之后,我们需要将客户的声纹向量信息保存到声纹数据库当中,用于后续的客户信息比对。
(4)实验
这里我们使用中信建投证券电话客服中心7000条回访音频,进行说话人分割与聚类后,使用语音识别判断出其中的客户语音音频,使用声纹信息提取模块提取这7000条客户音频的声纹信息向量,并将这7000条客户音频的声纹向量注册到声纹数据库当中
3.结 论
在这篇论文当中,我们提出了一个电话音频说话人分割与聚类的方法,并对提取出来的客户语音音频提取声纹向量信息,保存到数据库当中,该方法首先对整个电话音频进行有效音检测,通过有效音检测,去除音频当中的非人声语音部分,然后将整段电话音频进行切分,切分为多个小的音频片段,接下来通过预训练的声纹识别模型,取出声纹识别模型中的声纹向量提取模块,然后用该声纹向量提取模块提取所有语音片段当中的声纹向量信息,然后通过搭建深度学习分类网络,对整段音频当中的各个音频片段的声纹向量进行说话人分类标注,从而实现将音频当中的各个说话人的语音分离开来,当我们得到分离之后的语音之后,我们通过语音识别的方式,判断哪条语音是客户的语音,哪条语音是客服的语音,将客户的语音取出,并提取客户语音的声纹向量信息,并将客户的声纹向量保存到数据库当中。
我们在这篇论文中介绍了有效音检测方法,声纹向量提取模块,有监督的说话人分割与聚类系统,语音识别系统,声纹识别系统,这里们使用到的模型都是基于序列到序列的循环神经网络模型,相比于无监督的说话人分割与聚类方法,该方法自DER指标上有了很大的提升。
该方法通过有监督学习训练模型的方式,可以通过相关的场景数据,训练一个使用于该场景下的说话人分割与聚类模型,从而可以实现在该场景下效果更好。
参考文档
[1] Aonan Zhang, Quan Wang, Zhenyao Zhu, John Paisley, Chong Wang, “Fully supervised speaker diarization” arXiv:1810.04719v1 [eess.AS] 10 Oct 2018
[2] Laurent El Shafey, Hagen Soltau, Izhak Shafran, “Joint Speech Recognition and Speaker Diarization via Sequence Transduction” arXiv:1907.05337v1 [cs.CL] 9 Jul 2019
[3] 李稀敏,洪青阳,黄晓丹, “基于说话人的音频分割与聚类”
[4] Yi Luo, Nima Mesgarani, “Conv-TasNet: Surpassing Ideal Time-Frequency Magnitude Masking for Speech Separation” arXiv:1809.07454v3 [cs.SD] 15 May 2019
Be First to Comment