主要包含三部分:
1.语音表示学习(Speech representation learning)
2.语音大型语言模型(Speech large language models)
3.其他语音基石模型
下面一一讲述。
学习内容:
就是将一段语音喂给自监督学习模型(SSL model),去抽一些好用的特征表示representation,这些特征再喂给Downstream models,就可以做语音识别或说话人识别任务。
为什么要做语音表示学习?
以前我们做的都是完全监督学习,比如之前做一个情感识别任务,需要对每条语音人工标注其对应的标签label,喂给一个end2end的模型去训练,比如再做个说话人识别任务,又需要标注label。
所以完全监督学习的主要缺点就是:
所以人们就想到了自监督学习SSL。用一堆未带标签的数据训一个SSL模型,得到好的表示特征,开发不同的任务时只需要在输入表示特征训一个小的模型(下游任务)。
目前有哪些SSL模型呢?
这是2022年一篇文章Self-supervised speech representation learning: A reiew.的综述里的图,可以看到SSL模型有很多,我们可以学习6个典型的模型如下。可以分为两类,对比学习模型和预测模型。它们的差别就是训练过程和目标函数不同。
对比学习
一张图直观理解,就是你现在有一张猫图,再找一张猫(Positive pair)和一张狗(Negative pair)的图片,把它们分别输入三个encoder,对于输出的向量,我们希望两张猫图的向量越接近越好,而我的猫图和狗图的向量值差距越大越好。
这样我就训练得到一个好的表示特征representation,然后做一些下游任务的时候,比如猫狗分类任务,就只需要训一个线性模型就可以很容易把它们分开。
用来做音素分类和说话人识别任务。
比如有一段语音信号,采样率16000Hz。通过5层卷积CNN,每层的步长为5,4,2,2,2,通过这五层,相当于信号被采样了5×4×2×2×2=160。所以最后输出的信号为每秒16000/160=100点。
把这100点的输出再喂给循环神经网络GRU。
Positive的pair就是未来的一些输出向量vector,就是同一个句子里面,用当前的向量去预测未来。
Negative的pair有不同的设计方式,最简单的设计就是用另外一段语音或另一个人的语音的vector,就是说不同的Speaker的语音的向量越远越好。这就是说话人分类。
CPC这篇论文做了两个任务:音素分类和说话人分类。
可以看到结果所示,CPC和自监督学习都比传统的MFCC特征好。还有个好玩的地方是,同一个CPC模型,通过一个线性模型就可以完成不同的任务,甚至是两个目的完全不相干的任务。
将语音输入几层的CNN后,得到向量(蓝色)先做量化quantize后,得到图中绿色向量。
再做掩蔽Masking。比如掩蔽掉其一部分(黑色)
然后输入Transformer,得到context vector(红色)。
意思就是如果讲不同的内容,希望向量相似度越远愈好,讲同一句话就越近越好。
框架基本和Wav2vec 2.0一样。只是XLS-R是在超大的数据上训练的。包含400000小时,107种语言。
下面的结果是把这两个模型预训练pretrain后,在LibriSpeech的数据上进行微调finetune,只要10分钟的数据,就可以做语音识别。
当参数量都是0.3Billion时,XLS-R微落后于wav2vec,可能是因为XLS-R训练数据种类太多,让它有点混乱了。
但当XLS-R参数量增加到1Billion,性能直接起飞,得到非常好的结果。
上面的是只针对英文ASR,下面是多语种上的结果,只要10小时的数据,就可以比之前上万小时的结果差不多好。
预测模型
有一张狗图,喂给一个encoder,得到一个向量,希望做一些预测任务。如果是监督学习,那目标标签target lable就是“狗”,现在我们是SSL模型,没有标签,要怎么办呢?
那就做伪标签Pseudo labeling。先让狗图片经过一个聚类器clustering,假设的到的是class 2(不一定是狗),假设聚类器性能很强,那大概率输出的就是狗的分类。这个架构就像studeng-teacher模型,互相进化,互相变得更好。
我们介绍第一个模型HuBERT,名字里有个BERT,肯定和它相关,还记得什么是BERT吗?
BERT:
如图,输入“台湾大学”,BERT会把某个字,如把“湾”字mask掉,输入Transformer encoder,输出一排向量,让被mask掉的那个的输出再输入一个线性模型,再经过softmax,得到一个分布,这个分布就是在预先定义好的词表上的机率分布,预测最可能出现的字的概率(比如中国方块字,这个词表大概有一万多个字)
在监督学习种,就把“湾”这个字当作比如one-hot的向量,去最小化输出和它之间的距离,让预测出来的输出“湾”的机率越大越好。
HuBERT:
和上面类似,输入的语音信号,先经过几层CNN,得到的向量mask掉其中的一部分,输入Transformer encoder(和上面的BERT一样),不一样的地方是,Hubert没有预先定义和的词表。怎么办呢?
所以,需要自己造一个词表。怎么造呢?
对这一堆语音数据提取MFCC特征,然后进行K-means聚类,就可以得到一堆码本codebook,作为伪标签,也就是刚才所说的词表。
有了词表,接下来就可以做BERT做的事情。
把输入的这段语音,提取MFCC特征,经过K-means,看和码本里的哪段最接近,比如:第一帧输出的特征vector和c2比较接近,第二帧和c1接近,第三帧和c6接近…然后把mask掉的那个的输出,和目标的码本,去最小化它们之间的距离。
.
对HuBERT训完400000次后,接下来要怎么继续更新聚类模型呢?
很简单,把Hubert反过来当成teacher model,用来继续训练这边的聚类模型就好了。比如,把第一次训好的HuBERT叫作Hubert-1。
这样就会得到新的码本。然后又可以作为伪标签,训练第二轮的HuBERT-2。重复以上过程,就可以得到一个好的HuBERT模型。
做说话人分类任务。
这个模型和HuBERT差不多。唯一的区别就是,它的输入是混合的语音作为噪音Noisy speech(比如是两个人讲话的语音),但做伪标签的语音还是用的干净语音。
论文结果:
WavLM和HuBERT明明架构一样,数据一样,loss函数一样,但只引入了denosing,它的效果就比HuBERT要好。
这个模型比较神奇,它的teacher聚类模型更简单,只进行随机初始化,在预训练过程中,它的Projection层和码本都不做更新,一开始是什么就是什么,然后这样也可以做的起来。
还有值得注意一点,它的输入是梅尔谱图。
论文结果:
和其他模型的性能相当,这就是BEST-RQ神奇的地方,也不知道为什么会这样。
上面介绍了很多SSL模型,那我们怎么知道它的表示特征好不好呢?
接下来介绍SUPERB 这个benchmark。
假设现在有个预训练好的SSL模型,就先固定住,输入语音信号,输出一排向量。现在就可以把这些向量拿去做各式各样的下游任务,比如语音识别ASR(它的下游模型为两层LSTM),说话人识别SID(这个相对简单因为只是个分类任务,下游模型只需要一个Linear层)等任务。
然后可以换不同的SSL模型,看看这不同的任务上能做到多好。
SUPERB
后面人们又发现,SSL的不同层里包含有不同的信息,比如HuBERT有12层Transformer,第1层可能包含有更多的说话人Speaker信息,第12层可能包含更多的语音内容content信息。所以下游任务抽哪些层的特征representation更好呢?
SUPERB做的事情就是,把每次的表示特征都抽出来,给他们权重并相加,权重也是可以学习的,通过权重的分配,我们就知道什么任务最需要哪几层的信息。
SUPERB做了很多各式各样不同的任务,比如针对说话人的任务,针对内容的任务(keyword spotting就是对语音进行关键字检测),针对语义的任务(直接从语音抽出这段话表达的意义,需要模型理解想要表达大的意思),针对副语言信息的任务,如下图。
SUPRB的官网上有很多模型及他们的比较:SUPERB
https://superbbenchmark.org/leaderboard
也有一些规律的发现:
1.同样的模型,越大越强。(雷达的每个角代表不同的任务,大模型面积包含了小模型)
2.越强的模型,基本上在所有任务上都表现很好。很少看到在一个任务上表现很好,另一个任务上表现变差的现象。
.
下面是在WavLM模型声的实验结果:
横轴是不同的层,纵轴是不同的任务,说话人相关的任务信息第4和5层多谢(颜色深),内容相关的任务信息在8,9,10层更多一些。
语音表示学习总结:
学习内容:
有了SSL model抽出的特征后,我们是否能用这些特征表示上做一些大型的语言模型,比如像GPT,然后做一些如语音翻译的任务。
Meta在2021年发布的一个项目。它的目的就是想把语音任务都转成NLP的任务的模型。
比如今天我们想做一个语音翻译的任务。
之前的做法就需要ASR、TTS、MT三个系统的级联,这种系统存在的问题:
Textless MT 的输入和输出都为伪文本,也就是机器自己学习出来的类似文本的东西。
Textless MT 也就是一个语言模型Language model(LM),用不同的LM,就可以实现不同的任务,比如LM为如下及对应的功能:
那怎么生成伪文本呢?
就是用之前讲到的SSL模型,比如先用HuBERT对一段语音抽一排特征,然后进行K-means,再进行量化,得到伪文本。
Encoder:可以是HuBERT,也可以是其他模型。
LM上画了一只独角兽(GPT标志),代表它是很像GPT的模型。
两种方式,一种是过语言模型LM,一种是不过,直接再合成resynthesis。
Generative Spoken Language Modeling(GSLM)
这篇论文就是语音版的GPT
首先还是这些套路,一段语音信号,先用HuBERT生成伪文本表示(包括K-means 、quantize)
然后用这些为文本表示再训一个Deceoder only 的unit语言模型,就可以让它像GPT 一样,一直去生成后面的discrete unit,然后再只需经过一个unit to speech Decoder,就可以继续合成之后的语音信号。
当然,这个unit to speech Decoder的模型也是需要训练的,怎么训练呢?可以拿一堆语音数据,把它抽成unit,这样就有speech和unit的pair data,模型可以用之前的vocoder(比如hifigan,wavernn等等)。
这个unit to speech Decoder和Decoder-only uLM没有联合训练,只要单独训好就行。整个模型没有任何文字信息。
这个GSLM模型和GPT一样,可以做条件生成,或非条件生成任务。区别就是条件的需要先输入一段预测好的语音,让模型接着这个话讲;而非条件的不需要输入语音,只给一个begin of sentences(BOS)的token,它输出就是随机的语音。生成模型本来就具有一定的随机性。
这篇文章还探讨了一个东西,叫作Temperature。就是GSLM输入 < BOS >,输出不是3,而是一个机率分布(就是3的机率最高)。GSLM是一个自回归的模型,把预测出的3会再喂给自己,产生下一个unit,这样循环。
temperature就是去调整预测出来的机率。。temperature的值设很低的话,比如把3的机率调大,其他调小(大的越来越大,小的越来越小),生成的语音会stuttering(结巴),比如重复说一句话。temperature的值设很高的话,比如把3的机率调小,其他调大(大的调小,小的调大,均匀一点),生成的语音就会babble(胡言乱语)。
一般temperature=1。
这个模型有个缺点就是局部关联“Locally” coherent,就是局部分几个字之间看着蛮合理的,但整个一句话就不太合理。比如生成如下的话,也不太懂什么意思,让chatGPT翻译一下,还是很混乱。该缺点可能是模型大小,或训练资料的局限导致的。
Speech Resynthesis
这篇文章Deocoder的输入除了SSL模型输出的表示特征(变成伪文本)以外,还输入了韵律和说话人特征。
但发现伪文本特征中说话人信息很少,基本只有内容信息。这是另一篇文章,可以看到做说话人识别任务,只要做量化,准确率就会立马下降,所以现在的共识就是,SSL表示特征经过k-means的量化quantized后,会把说话人信息给去掉。
所以需要额外把韵律和说话人信息补上,这也是为什么上面模型分成三个流。这个模型可以做Voice conversion任务。
就是通过特征解耦后,只要替换speaker信息(把speaker embedding抽换掉),就可以做语音转换。可以看到还是HuBERT的模型性能好。
除了做语音转换,Speech Resythesis模型还可以做Speech codec任务。就相当于是语音压缩表示。比如把语音从A端传输到B端,先对语音做量化,得到更细致的表示,通过很少的数据就可以传输,最后可用vocoder返回语音。
下面结果,横轴是传输语音资料的大小,纵轴是合回声音的品质。可以看到在保证语音质量的前提下,HuBERT可以把它压缩的很小。
LM换成不同的模型,就可以实现不同的人物,比如换成BART,就可以实现语音翻译人物。
比如,把英文,西班牙文的语音,输入一个多语言HuBERT模型,得到一排特征表示,再经过量化quantize,得到伪文本,然后就可以用来做BART的预训练(Encoder+Decoder的架构),BART任务就是把mask掉的再重建回来。训练好后,BART就是一个看得懂英文&西班牙文unit的模型。
S2UT
那具体怎么做语音翻译任务呢?
这篇文章把训好的BART的Decoder拿出来,接上一个Wav2vec 2.0的Encoder,有英文和对应的西班牙文的语音成对数据。把英文语音喂给Wav2vec 2.0,得到一排表示,再喂给Decoder。
那为什么不用刚才的多语言mHuBERT呢?然后用BART
其实这样做也行,但是这篇论文就额外接了一个Wav2vec 2.0的encoder。我猜在做finetune的时候,因为额外接了一个Wav2vec 2.0的encoder就可以和Decoder联合训练,而做BART的时候,因为要做quantazition,mHuBERT就不能联合训练。
论文结果,就是这种做法和之前用的AST+LM+TTS的模型性能相当,且不需要任何文本输入。
但Mos值确实有所下降。
可以输入各种类型的数据,来辅助模型训的更好。
有了文字资料,确实性能也比S2UT好。
为什么讲这个UnitY 模型呢,因为去年这两位先生对话的翻译系统就是用的这个。
但存在一个问题,就是翻译过来的话,不是原来人的声音(No Speaker information)
那有解决办法吗?有的,看下面模型。
有以下功能:
除了伪文本(semantic tokens,不同文章给起的名字还不一样),还有另外一个模型生成声学特征Aoustic tokens,包含说话人信息,甚至录音环境信息。
刚才讲的Textless NLP模型是生成Semantic tokens,现在LM的另一个输入是Acoustic tokens,是由一个说话人转换的模型做Codec Encoder,保证生成语音是同一个说话人和同样的环境下的。
现在大部分都用Codec Model,但它们的原理都是一样的。整体流程如下图,一段语音输入Encoder(可能是CNN组成),经过一串的残差矢量量化(residual vector quantilization),得到一堆code,喂给Decoder。
具体的细节可分解为:
一段语音信号,输入Encoder,得到一排向量,首先与第一个码书1号中寻找最相似的向量,比如输出为3个向量(蓝色),在码书中找到A3、A2、A6(红色)与它最相近,然后蓝减去红(残差,越减信息量越少,画图中颜色越来越淡),得到另一串向量(淡蓝),接着同样的操作,从码本2号中寻找与之相似的向量…假设共有8个码数,最后把这些discrete tokens都放在一起,就是量化后单元Quantized units,这个就叫作Acoustic tokens,然后输入一个Decoder,就能合回语音。
如果模型很好的话,输入和合回的语音应该完全一模一样的。
输出的code信息量越来越少,所以第一个code的信息量最大,如果我们只能选择传输有限量的code,就选择第一或几层code。
现在有了Semantic tokens和Acoustic tokens,一起输入给unit LM,怎么训练呢?
AudioLM训练了三个类似GPT的模型,第一个输入过去的Semantic tokens,让模型预测未来的Samentic tokens;第二个模型输入生成的Samentic tokens,以及刚才讲的最重要的一些声学特征,这里叫作coarse acoustic tokens,让模型预测未来的coarse acoustic tokens;第三个模型输入生成的coarse acoustic tokens,去预测不太重音的声学特征,叫作fine acoustic tokens。最后,把重音的和不重要的放一起,输入Decoder,就能合回原来的声音信号(说话人和录音环境等不变)
这个模型可以做Speech Continuation(比如让一段语音继续编下去,说一些有意义的话)和Music Continuation(比如一段钢琴声,它就可以继续把音乐编下去)。
Valle是一个TTS(Text-to-speech)模型,是今年微软推出的一个模型。
输入一个3秒的语音信号,当作Acoustic prompt,就可以生成同样的声音。
具体做法:
首先是一个自回归模型AR(产生高品质的code),输入文本,产生最重要的Acoustic tokens。还要输入3秒的语音prompt,让模型生成和它声音听起来一样的声音。
后面不重要的tokens,就用非自回归模型NAR,比如还是按上面例子有8层tokens,第一层token重音,就用AR,后面7层一般重音就用NAR。
论文实验结果,都比之前的模型好。甚至比如你那3秒的语音是在厕所录的,生成的声音也会有厕所的一些声音。
2022年9月OpenAI提出来的模型。前面提到很多自监督学习模型SSL,OpenAI不玩这套,谁让他财大气粗,他们收集了68万小时的语音带标签数据,包括比如中&英文句子对,还有其他语言(估计上百种),倒给一个Transformer模型。
训练模型:
就是一个Transformer模型,左边Encoder,右边Decoder,输入log梅尔谱。
输出的时候它有一连串的tokens帮它做多任务学习。那这些tokens是什么呢?
比如一句语音“这是一本书”,把它的log梅尔谱输给Whisper模型。第一个任务,模型首先判断这是不是一句语音(Voice activity detection),不是的话就直接END了;是语音的话,第二个任务,模型再判断是什么语言(Language identification),是中文英文还是其他?比如我们现在输入的是中文“这是一本书”,模型就会预测中文的language toekns;第三个任务,可以做语音识别(Transcribe)或语音翻译(Translation)任务。
下面是它用的训练数据的统计。左边绿色是多语言识别任务,有中文德文西班牙文等等,共12万小时的pair data。右边紫色是做不同语言到英文的翻译,共12万小时pair data。44万小时都是做英文的语音识别。一共68万小时。
现在这个模型是开源的哦,去github上下载下来,只需要几行代码调用。比如你现在想要做一个语音识别模型,都可以从Whisper finetune起。
谷歌公司也财大气粗啊,又用一千两百万12M小时的语音,包含300种语言。
它希望把能用到的资料都应用尽用。第一个就是输入语音,shared encoder就是多模态融合;第二个就是语音和文本;第三个就是输入文本。把几种类型的数据都用上了。
和Whisper的对比:
比whisper性能好,finetune时用的数据比whisper还要少。
1.这些大型的SSL模型,可以作为特征提取器,抽出好的特征表示,帮助下游任务。
2.基于这些SSL模型,又可以把它做quantize,做大型的语言模型,通过这些大型模型,又可以做成Generative 的模型。
3.有了这些语音基础模型,把NLP中的技术拿过来,做成语音版本的prompting和adapters,来使得模型更高效。