Speaker Verification
李宏毅老师2020新课深度学习与人类语言处理课程主页:
http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP20.html
视频链接地址:
https://www.bilibili.com/video/BV1RE411g7rQ
深度学习与人类语言处理 P16 系列文章目录
前言
在上两篇中(P14、15),我们讲解了 Text-to-Speech (TTS) Synthesis 语音合成,输入文字产生声音,我们从四个方面进行讲述的:P14讲解1 和 2,而P15讲解 3 和 4
1 TTS before End-to-End :在端到端技术之前TTS是怎么做的
2 Tacotron: End-to-end TTS :硬train一发的时代
3 Beyond Tacotron :硬train一发的后时代
4 Controllable TTS :怎么控制TTS合出我们要的声音
而在本篇中,我们将开始讲解 Speaker Verification 语者验证有关技术,输入语音,输出类别的模型。类似地,这样的模型可以用在很多不同的领域,如语音情绪判断、语音安全判断、语音关键词是否存在等等,而今天我们只关注 语者验证,其他的应用大同小异,模型一样,都是语音分类问题。 .Speaker Verification 语者验证我们将会从3个方面讲解:
1 Task Introduction
2 Speaker Embedding
3 End-to-end
I Task Introduction
今天我们要讲的任务仅是 .Speaker Verification 语者验证,但和语者有关的任务还有很多,如上图
那第一个要讲的任务是 Speaker Recognition / Identification ,语者识别。
1.1 Speaker Recognition / Identification
Speaker Recognition / Identification 语者识别,要做的就是判断一段语音是谁所说的,标准的多分类问题,老师没有细讲。
1.2 Speaker Verification
Speaker Verification 语者验证,要做的就是判断两段声音是不是同一个人讲的,输入两段声音讯号,输出一个数值scalar,如果这个scalar大于阈值threshold,就表示这两段声音讯号是一个人说的,反之不是一个人说的。通俗而言,这个模型做的就像是比对相似度,看看这两段声音的相似程度,如果相似程度很大就代表是同一个人讲的,如果很小就不是同一个人讲的。
那这样的 Speaker Verification 模型有什么用呢?它的用途很大,今天我们日常生活中的银行客服,很多的银行客服会问你,“要不要开启语者验证系统?”,接下来客服就会要求你念几句话,这几句话就会以某种形式存在银行客服端。下次再打电话的时候,客服端就会比对现在的声音和之前注册时存的声音的相似度,如果相似度大于阈值threshold就不需要再做额外的验证,如果小于阈值 ,就需要人力介入进行再次验证。当然,这个threshold是人为设定的,决定系统判别相似度要有多严苛。
那既然threshold是人为设定的,那我们该怎么判断评价两个语者验证系统哪一个更好呢?我们会用一个指标 Equal Error Rate (EER) 等错误率来进行判断。
Rate | Meaning |
---|---|
TP | 同一语者被判断为同一语者的可能性 |
TN | 不同语者被判断为不同语者的可能性 |
FN | 同一语者被判断成不同语者的可能性 |
FP | 不同语者被判断为同一语者的可能性 |
Equal Error Rate (EER) ,因为不同的threshold会导致系统有不同的行为,所以先把所有的threshold都穷举出来,如
当 threshold = 1.0 时,所有输入的两段语音都会被判断为 不是同一个人所说的 FN和FP均为100。接下来,不断降低threshold ,并计算FN和FP,并会经过FN=FP,直到 threshold = 0为止。
在此过程中,当FN=FP时,这个值就是 Equal Error Rate ,不同的Speaker Verification系统在评比的时候就会比较这个值。
1.3 Speaker Diarization
还有第三个和语者有关的任务,叫做 Speaker Diarization 语者分段标记。
输入一段语音,如会议的录音、电话对话等
首先,Speaker Diarization 会把声音 分段,每一段代表同一个语者说的话
然后,标记每一个段是哪个语者讲的。
通常, 对于电话对话,语者个数是确定的。但对于会议录音,语者个数不确定,如上图分成了四段并标号。但我们本篇只关注 Speaker Verification 上,本任务不细讲。
II Speaker Embedding
2.1 Definition
对于 Speaker Verification 内的模型而言,输入两段声音讯号,输出 scalar ,实际上就是在判断两段声音的相似度。比较传统的模型内部会有某些方法,可以将输入的声音讯号转成 vector,而这个vector就是 Speaker Embedding,并通过比较这个vector计算两段语音的相似度。
2.2 Framework
通常, Speaker Verification 会分成3个步骤,如下图
第一个步骤:Development,找出可以产生speaker embedding的模型,输入声音,输出speaker embedding的。
第二个步骤:Enrollment,注册。如银行客户端要求你念几句话进行注册。如果有很多句话,就把它们的speaker embedding平均起来。
第三个步骤:Evaluation,验证。判断新输入的语音和注册时的语音的相似度 Scalar。
注意,在第一步骤中使用的训练资料不会在第二三步骤中再使用。
2.3 Metric-based meta learning
其实,这整套 Speaker Verification 的想法就是 Metric-based meta learning,这里没讲,老师说可以参见链接。
2.4 Method
接下来我们就讲 怎么抽 Speaker Embedding
2.4.1 i-vector
早期最有用的方法就是 i-vector,吃一个声音讯号,输出一个400维的向量,就代表了这段声音讯号语者的特性,且无论这段声音讯号多长,都只抽400维的向量出来。i-vector的效果逐渐被后续的使用 deep learning 模型所打败。
2.4.2 d-vector
接下来,将进入deep learning 的模型,最早的用deep network抽 Speaker Embedding的模型叫做 d-vector。d就是deep learning的缩写。
那d-vector是怎么做的呢?有一段声音讯号 (whole utterance),然后从其中截下一小段(audio segment)出来,把这一小段丢到DNN,而截一小段也是因为这边用的是DNN不是RNN,只能给DNN输入固定长度的东西。而这个DNN的训练目标就是 Speaker Recognition 语者识别。
然后我们把这个模型最后一个layer 的输出抽出来,这个东西就是d-vector。
那为什么不使用模型最终的输出呢?最终的输出output layer是与语者数目有关的,如果语者有5000个,那这个最终输出就有5000维度,维度太大了,因此一般的d-vector都是抽出最后一个hidden layer 的输出,它可以不受语者数目限制。
但我们只使用了一小段语音,我们实际是要根据整段声音来得到 d-vector,那这该怎么办呢?
d-vector的解决方法也很简单,一整个语音就切成很多段,小段和小段之间可以有重叠没关系,每一个小段都可以抽一个vector出来,最终,把这些vector统统平均起来,就叫做d-vector,代表整个句子语者资讯的vector。
但其实d-vector的效果并不是很好,与i-vector相比还略逊一筹。后来就有了效果更好的x-vector,这个效果就比i-vector还好了。
2.4.3 x-vector
x-vector 与 d-vector最大不同是什么?刚才的d-vector,类似上图的每一个DNN是单独训练的。但在 x-vector 训练 Speaker Recognition 的时候,是直接使用了一整段语音来预测是哪个语者,一样和d-vector有很多DNN,但会把这些DNN的输出vector集合起来
那怎么将这些vector集合起来呢?有很多不同的方法,在x-vector原始论文中,将这些vector的mean算出来当作一个vector,variance算出来当作一个vector,把这两个vector连接起来丢给DNN,而这个DNN要做的是 Speaker Recognition,同样最后的一个layer的输出拿出就是x-vector。
2.4.4 Attention & NetVLAD
当然,这其中的DNN可以换为LSTM等。还有另外的进阶想法,比如说加个Attention。
用Attention Mechanism 训练一个权重,把这些vector做加权求和。
还有更进阶的方法,NetVLAD,这边不细讲,从影像那边借来的方法。
2.4.5 Summary
总之,我们如今有各式各样的方法可以把一整段声音讯号变成一个vector。当然,上述方法,都是先做Speaker Recognition,用 Speaker Recognition 训练完后得到Speaker Embedding,再把 Speaker Embedding 拿去做 Speaker Verification。
III End-to-end
在上面的讲述中,我们需要模型分别抽取Speaker Embedding和计算两个vector的相似度,那能不能把这两件事放在同一个模型里一起训练学习呢?
3.1 Data Set
首先,我们要准备相应的训练资料。具体而言,我们会先收集到很多的不同语者的声音讯号并带有语者标记,如上图的A B C三个语者的多段语音。
假设语者讲了K个句子当作注册的句子。那我们要怎么产生训练资料呢?
Positive Examples:随机选取语者i,并选出他的K个句子当作注册的句子,取另外一个他说的句子当作测试的句子,我们希望模型可以将这K个语音句,和 这一个语音句的相似度越大越好。
Negative Examples: 随机选取语者i,并选出他的K个句子当作注册的句子,取另外一个语者说的句子当作测试的句子,我们希望模型可以将这K个语音句,和 一个语音句的相似度越小越好。
当然,这只是一种准备训练资料的方法,还有很多方法,比如 GE2E,如今比较常用的方法留给大家研究。
3.2 Model
那端到端的 Speaker Verification 模型结构是什么样的呢?其实它完全仿照了传统的 Speaker Verification 模型结构。
首先将注册的K个语音句输给一个 Network里,从中输出代表每个将语音句的vector,将这个K个vector平均求和得到一个如上图,蓝色的vector。
之后,再将测试的语音句,同样输给这个Network里,从中输出代表这个测试语音句的vector,橙色的vector,并计算这个橙色vector与蓝色vector之间的相似度。如果测试语者与注册语者相同,则相似度越大越好;不同,则相似度越小越好。
其实这个Network就是传统方法里的Speaker Embedding,只不过,在端到端模型里,将这些都替换一个可以一起训练的神经网络,与传统的拆成多步骤的训练方法不同。
Text-dependent v.s. Text-independent
在做这种端到端 Speaker Verification 时,又会分成 Text-dependent 和 Text-independent 两种:
- Text-dependent :已经设计好 Enrollment 和 Evaluation 要说什么话,比如在 Enrollment 和 Evaluation 都说 “芝麻开门” 和 “芝麻关门”,不过它们没有做 Speaker Verification ,所以什么样的人都可以通过说 这样的话开门关门,所以他们需要这样的技术。
- Text-independent : Enrollment 和 Evaluation 随便讲。希望模型可以不受内容的影响。
同时,如果在做 Text-independent 的语者验证系统,还可以加一个 Discriminator,根据抽speaker embedding的Network的输出的vector去判断这个vector的文字内容是什么,而这个Network在训练时就要去骗过这个 Discriminator,也就做到了把文字信息滤掉只包含语者的资讯。
至此 ,Speaker Verification 语者验证系统课程结束。