简介:
2017年初,Google 提出了一种新的端到端的语音合成系统——Tacotron,Tacotron打破了各个传统组件之间的壁垒,使得可以从<文本,声谱>配对的数据集上,完全随机从头开始训练。本文复现了一篇Tacotron系列的论文,使模型可以克隆人的声音,并且完成文本到声音的转换。
参考论文:
Transfer Learning from Speaker Verification to Multispeaker Text-To-Speech Synthesis 原文的github实现:link
论文概述:
这篇论文主要目的是克隆说话人的声音,并且将文本以说话人的声音转成音频。
模型结构:
模型分为3个模块构成,encoder模块,systhesis模块,vocoder模块。
encoder模块将说话人的声音转换成speaker embedding,synthesis模块将文本转换成mel-spectrogram,vocoder模块将mel-spectrogram转换成waveform。Github上已经有英文是实践,这里主要记录下中文的实践及各模块的结果。
Encoder
Encoder模型可以选择pretrained的,这里为了实践操作整个模型我用了data_aishell的400人的中文数据重新训练,结果如下:
这个是用visdom可视化看到的图。
这个是encoder自动生成的降维之后的图。
可以看到55000步的时候已经有了比较不错的结果,模型能将不同人的embedding投影到向量空间的不同地方,当然可能由于数据相对于原文实现的数据比较少,所以在同样维度的向量空间效果会更加明显一些,不过和刚开始对比已经有了很大的进步:
Synthesis
这里数据选用了清华的data_thchs30,选用该数据集的目的是因为只有这个数据集有拼音,方便处理。
在这里为了方便,把数据集处理成libspeech的格式,其中有一步需要对每一条transcript进行处理,得到alignment(对齐),这一步很耗费时间。
这个是处理好的中文数据的第一条:
第一部分是文件名,第二部分是拼音,第三部分是alignment。
然后跑synthesis模型,这里可以选择在给的pretrained模型的基础上做fine-tuning,也可以直接从头训。作者给的观点是如果你有300h左右的语料库最好重新训。所以这里我直接fine-tuning,设定20W步,训练过程分为pre-processing和train。
pre_processing使用audio产生这三个文件:
每一个文件夹中的文件都是npy格式,代表各个部分的向量表示。
下面是train的结果:
先是训练中loss的图:
mel-spectrogram:
然后是eval中loss的图:
这里每一次eval都会生成一个wav文件:
可以看到alignment已经能看到了,但是有的对齐也不是很好,eval的loss也比训练的loss多一些。
这里听声音的话,已经能合成人声,但是由于synthesis这一步合成时采用的是Griffin-Lim,所以会有杂音,这里只需要听韵律就行了。
Vocoder
最后一块了,这里输入采用synthesis训好的模型产生的mel-spectrogram。
训练过程:
这里同样采用fine-tuning,由于采用了wavenet所以这里loss不会像之前synthesis一样降到0.几。
训练出来的结果只包括一个模型的pt文件和一堆合成的样本。
整体测试
这样这个模型就算训练完成了。整体测试一下:
选取人声:
输入一段文本:
合成声音:
听了一下,说话人声音很像,但是合成的声音会有杂音。拿出来WaveNet单独发声发现是WaveNet训练的不够好,之后准备重新训WaveNet看一看效果会不会有进步。
(从开始看tacotron1,2,WaveNet的论文和复现,到SV2TTS的论文与复现,到自己做出来结果,陆陆续续花了一个多月的时间,记录一下方便以后复习。)