关于声纹识别的算法及知识层出不穷,一文带你了解声纹识别:
利用GMM高斯混合模型提取特征i-vector;克服训练数据不多的情况,引入UBM;将语音分为说话人空间和环境空间,解决环境带来的信道,PLDA实现信道补偿,将提取的i-vector更加纯粹。
当然,获取i-vector的方法不仅仅局限在高斯混合模型,利用一起其它的机器学习方法进行补充一样可以,甚至是DNN提取的特征。
DNN的引入极大的降低了识别错误率。这时候的算法,可以称为embedding算法,依然是提取特征,不过这时候提取的是神经网络最后隐藏层的激活单元了,作为embedding,代替i-vector来作为一段语音的特征表示。
这时候出现了d-vector(深度神经网络最后一个隐藏层作为embeddings特征)、x-vector(从TDNN网络中提取embeddings特征)、j-vector模型(适用于文本相关说话人确认)
无论是获得i-vector,还是DNN提取出的embedding,都是从语音中提取出特征再做分类或者确认。而端到端系统将这2段合到一个系统中,从输入到输出,一体化特征训练和分类打分。这和之前有了重大的不同。
声纹(Voiceprint )是用电声学仪器现实的携带言语信息的声波频谱, 是由波长频率以及强度等百余种特征维度组成的生物特征,具有稳定性、可测量性、唯一性等特点。
声纹不如图像那样直观展现,在实际分析中,可通过波形图和语谱图进行展现
人在讲话时使用的发声器官在尺寸和形态方面每个人的差异很大,所以任何两个人的声纹图谱都有差异,主要体现在如下方面:
不同人的声音在语谱图中共振峰的分布情况不同,声纹识别正是通过比对两段语音的说话人在相同音素上的发声来判断是否为同一个人,从而实现“闻声识人”的功能。
声纹识别在算法层面可通过如下基本的技术指标来判断其性能,除此之外还有其它的一些指标,如:信道鲁棒性、时变鲁棒性、假冒攻击鲁棒性、群体普适性等指标,这部分后续于详细展开讲解。
训练数据和算法是影响声纹识别水平的两个重要因素,在应用落地过程中,还会受很多因素的影响。
声纹识别(VPR) ,生物识别技术的一种,也称为说话人识别 ,是从说话人发出的语音信号中提取声纹信息,从应用上看,可分为:
声纹识别在应用中分注册和验证两个主流程,根据不同的应用中,部分处理流程会存在差异,一般的声纹识别应用流程如下图所示:
Speaker recognition以2012年为分水岭,由statistics-based machine learning,跨到了以deep learning为主线的算法。随后,bottleneck feature、d-vector、x-vector、j-vector等DNN-based的系统陆续出现,随后attention mechanism、Learning to rank等思想被用于改良训练过程。
对这些算法按照3类分别做简要阐述:
2011年,第十一届全国人机语音通讯学术会议(NCMMSC2011)上,大神邓力给伙计们开了小灶,分享了他在微软DNN-based speech recognition研究结果(30% relative improvement),群情激奋。就在前一年,ABC(Agnitio/BUT/CRIM)在NIST SRE 2010 workshop上分享了JFA(Joint Factor Analysis,联合因子分析)的改良版(即iVector[1][16]),群情激奋。
iVector中Total Variability的做法(M = m + Tw),将JFA复杂的训练过程以及对语料的复杂要求,瞬间降到了极致,尤其是将Length-Variable Speech映射到了一个fixed- and low-dimension的vector(identity vector,即iVector)上。于是,机器学习爱好者群情激奋,所有机器学习的算法都可以用来解决声纹识别的问题了。
PLDA(Probabilistic Linear Discriminant Analysis,概率形式的LDA[17])是生成型模型(generated model),被用于对iVector进行建模、分类,实验证明其效果最好。PLDA是一种信道补偿算法,因为iVector中,既包含说话人的信息,也包含信道信息,而我们只关心说话人信息,所以才需要做信道补偿。在声纹识别训练过程中,我们假设训练语音由I个说话人的语音组成,其中每个说话人有J段不一样的语音,并且我们定义第i个说话人的第j段语音为Xij。那么,我们定义Xij的生成模型为:
F、G是矩阵,包含了各自假想变量空间中的基本因子,这些因子可以看做是各自空间的基底(basis)。 F的每一列,相当于类间空间的特征向量;G的每一列,相当于类内空间的特征向量。而向量Hi和Wij可以看做是该语音分别在各自空间的特征表示。如果两条语音的hi特征相同的似然度越大,那么它们来自同一个说话人的可能性就越大。
PLDA的模型参数包括4个,mean、F和G、sigma,采用EM算法迭代训练而成。通常,我们采用简化版的PLDA模型,忽略类内特征空间矩阵的训练[18],只训练类间特征空间矩阵F。即:
打分过程可以参考文献[17]。
早期DNN-based Speaker Recognition,用DNN代替GMM去计算Posterior Statistics,延续了DNN-based Speech Recognition的研究成果。2014年,Google提出d-vector[3]后,一系列的DNN-based方法被提出,如x-vector、j-vector等[2][8][9]。下面分别介绍下此类算法的基本思路。
提取x-vector,LDA降维,然后以PLDA作为back-end,便可以做Verification。
开源代码:https://github.com/kaldi-asr/kaldi/tree/master/egs/sre16/v2
论文[8]中指出,相比于Cosine Similarity、Joint PLDA,使用Joint Gaussian Discriminant Function作为back-end时,实验效果最佳。
[1] Niko Brümmer, Doris Baum, Patrick Kenny, et al., “ABC System description for NIST SRE 2010”, NIST SRE 2010.
[2] David Snyder, Pegah Ghahremani, Daniel Povey, “Deep Neural Network-based Speaker Embeddings for END-TO-END Speaker Verification”, Spoken Language Technology Workshop , 2017 :165-170.
[3] Variani, Ehsan, et al. “Deep neural networks for small footprint text-dependent speaker verification.” Acoustics, Speech and Signal Processing (ICASSP), 2014 IEEE International Conference on. IEEE, 2014.
[4] Liu, Yuan, et al., “Deep feature for text-dependent speaker verification.” Speech Communication 73 (2015): 1-13.
[5] Heigold, Georg, et al., “End-to-end text-dependent speaker verification.” Acoustics, Speech and Signal Processing (ICASSP), 2016 IEEE International Conference on. IEEE, 2016.
[6] Zhang Chunlei, and Kazuhito Koishida. “End-to-End Text-Independent Speaker Verification with Triplet Loss on Short Utterances.” Proc. InterSpeech 2017 (2017): 1487-1491.
[7] Li Chao, et al., “Deep Speaker: an End-to-End Neural Speaker Embedding System.” arXiv preprint arXiv:1705.02304 (2017).
[8] Nanxin Chen, Yanmin Qian, and Kai Yu, “Multi-task learning for text-dependent speaker verificaion,” in INTERSPEECH, 2015.
[9] Ziqiang Shi, Mengjiao Wang, Liu Liu, et al., “A DOUBLE JOINT BAYESIAN APPROACH FOR J-VECTOR BASED TEXT-DEPENDENT SPEAKER VERIFICATION”,
[10] FARR Chowdhury,Q Wang, IL Moreno, L Wan“Attention-Based Models for Text-Dependent Speaker Verification”, Submitted to ICASSP 2018.
[11] C Zhang, K Koishida, “End-to-End Text-Independent Speaker Verification with Triplet Loss on Short Utterances”, Interspeech, 2017.
[12] Arsha Nagrani, “VoxCeleb: a large-scale speaker identification dataset”
[13] D Snyder, D Garcia-Romero, D Povey, S Khudanpur, “Deep Neural Network Embeddings for Text-Independent Speaker Verification”, Interspeech , 2017 :999-1003.
[14] T. Fu, Y. Qian, Y. Liu, and K. Yu, “Tandem deep features for textdependent speaker verification”, Proc. InterSpeech, 2014.
[15] Hervé Bredin, “TristouNet: Triplet Loss for Speaker Turn Embedding”, ICASSP 2017.
[16] Najim Dehak, Reda Dehak, et al., “Support Vector Machines versus Fast Scoring in the Low-Dimensional Total Variability Space for Speaker Verification”, InterSpeech, 2009.
[17] SJD Prince, JH Elder, “Probabilistic Linear Discriminant Analysis for Inferences About Identity”, Proceedings, 2007 :1-8.
[18] Y Jiang, AL Kong, L Wang, “PLDA in the i-supervector space for text-independent speaker verification”, Hindawi Publishing Corp. , 2014 , 2014 (1) :29.
最流行的语音技术研究平台,没有之一。代码运行鲁棒性强、架构良好,便于算法修改、定制。
源码地址:https://github.com/kaldi-asr/kaldi
语料集合:http://cn-mirror.openslr.org/
实现ResNet网络上的TE2E(Tuple-base end-to-end)Loss function训练方式。安装TensorFlow、Python3和FFMPEG(文件格式转换工具)后,准备好数据,即可一键训练。只可惜验证部分还没做,而且GRU没实现、tensor实现部分也不严谨,可详细阅读代码和论文,并贡献下您的代码。
源码地址:https://github.com/philipperemy/deep-speaker
论文地址:https://link.zhihu.com/?target=https%3A//arxiv.org/pdf/1705.02304.pdf
数据集合:http://www.robots.ox.ac.uk/~vgg/data/voxceleb/
基于百度论文[1],实现了ResNet + Triplet Loss。不过在 牛津大学的Voxceleb库上,EER比论文[2]所宣称的(7.8%)要高不少,看来实现还是有改进空间。Owner在求助了,大家帮帮忙contribute。
源码地址:https://github.com/qqueing/DeepSpeaker-pytorch
论文地址:https://arxiv.org/pdf/1705.02304.pdf
一个音频处理工具箱,包括Speech change detection, feature extraction, speaker embeddings extraction以及speech activity detection。其中speaker embeddings extraction部分,包括TristouNet的实现。
源码地址:https://github.com/pyannote/pyannote-audio
论文地址:https://arxiv.org/pdf/1609.04301.pdf
Convolutional Neural Networks(卷积神经网络)在声纹识别上的试验,一个不错的尝试,可以与TDNN/x-vector做下对比。
源码地址:https://github.com/astorfi/3D-convolutional-speaker-recognition
论文地址:https://arxiv.org/pdf/1705.09422.pdf
数据集合:https://biic.wvu.edu/data-sets/multimodal-dataset
2015年,谷歌的FaceNet[4]使用Triplet Loss在大规模人脸识别中取得了很大的成功。受此启发,在声纹识别领域,也有不少的文章使用Triplet loss,比如Zhang[3]、Baidu Deep Speaker[5]、Bredin[6]等 。它的优点是,直接使用embeddings之间的相似度作为优化的成本函数(Loss Function),最大化【anchor】和【positive】的相似度,同时最小化【anchor】和【negative】的相似度。这样,在提取了说话者的embedding之后,声纹验证和声纹识别任务就可以简单地通过相似度计算实现。
Triplet Loss基本思路是:构造一个三元组,由anchor(锚,可以理解为一个参考语音)、positive(相对anchor而言)和negative(相对anchor而言)组成。然后,用大量标注好的三元组作为网络输入,来学习DNN参数。其中,anchor和positive是来自于同一个人的不同声音,anchor和negative是来自不同的人的声音。通过DNN获取各自的embeddings后,计算anchor和positive的相似度,以及anchor和negative的相似度,然后最大化ap(anchor与positive)的相似度,最小化an(anchor与negative)的相似度。
计算相似度有两种方法,一种是cosine相似度,值越大,相似度越高,正如Baidu Deep Speaker所采用的;一种是使用欧几里得距离,和FaceNet所使用的一样,值越小,相似度越高。
cosine相似度的训练过程如图2所示:
其成本函数如下所示:
欧几里得距离相似度的训练过程如图3所示:
其成本函数如下所示:
End-to-End Speaker Recognition往往是data-driven的,需要海量标注数据才能取得预期效果。无论是Google d-vector,还是x-vector、Baidu Deep Speaker,其训练速度和有效利用data的程度,仍然有较大改进空间,文献[1], [2], [3]就是朝着这些方向所做的尝试。
Generalized end-to-end (GE2E) loss是谷歌在论文[4]中提出的新损失函数,还是比较有创意的。与TE2E loss和Triplet loss相比,它每次更新都和多个人相比,因此号称能使训练时间更短,说话人验证精度更高。
其基本思路如图1所示,挑选 N 个人,每人M句话,通过图示的顺序排列组成Batch,接着通过LSTM神经网络提取N*M句话的embeddings,然后求取每个embedding和每个人平均embedding的相似度,得到一个相似度矩阵。最后通过最小化GE2E loss使得相似矩阵中有颜色的相似度尽可能大,灰色的相似度尽可能小,即本人的embedding应该和本人每句话的embedding尽可能相近,和其他人的embedding尽可能远离,从而训练LSTM网络。
相似度矩阵的定义如下公式所示:
其eij中表示第人第句话对应的embedding,w和b是要训练的参数(约束 w>0 ), Ck是第 k 人的embedding,由M句话的embeddings求平均得到,即:
为了使得相似度矩阵中有颜色的相似度尽可能大,灰色的相似度尽可能小,有两种损失函数,第一种是softmax loss,即:
或者写成
上式中(和论文不一样,本人认为应该加个负号),最小化损失函数 Ls(eji) , Sji,j就要尽可能大,即优化使得本人和本人的每一句话都比较相似。
小白声纹识别(说话人识别)探索
声纹识别的应用实践
AI老司机带你认识声音黑科技:声纹识别
百度语音识别视频两节
知乎声纹识别大佬Leon晋
声纹识别训练营1+声纹识别训练营2
论文:
d-vector:
https://github.com/rajathkmp/speaker-verification
https://github.com/wangleiai/dVectorSpeakerRecognition
E2E,Deep Speaker:
tensorflow版本
pytorch版本