简介:

2017年初,Google 提出了一种新的端到端的语音合成系统——Tacotron,Tacotron打破了各个传统组件之间的壁垒,使得可以从<文本,声谱>配对的数据集上,完全随机从头开始训练。本文复现了一篇Tacotron系列的论文,使模型可以克隆人的声音,并且完成文本到声音的转换。

参考论文:
Transfer Learning from Speaker Verification to Multispeaker Text-To-Speech Synthesis 原文的github实现:link

论文概述:

这篇论文主要目的是克隆说话人的声音,并且将文本以说话人的声音转成音频。
模型结构:

pytts 语音克隆 实时语音克隆_语音合成


模型分为3个模块构成,encoder模块,systhesis模块,vocoder模块。

encoder模块将说话人的声音转换成speaker embedding,synthesis模块将文本转换成mel-spectrogram,vocoder模块将mel-spectrogram转换成waveform。Github上已经有英文是实践,这里主要记录下中文的实践及各模块的结果。

Encoder

Encoder模型可以选择pretrained的,这里为了实践操作整个模型我用了data_aishell的400人的中文数据重新训练,结果如下:

这个是用visdom可视化看到的图。

pytts 语音克隆 实时语音克隆_Tacotron_02

这个是encoder自动生成的降维之后的图。

pytts 语音克隆 实时语音克隆_TTS_03


可以看到55000步的时候已经有了比较不错的结果,模型能将不同人的embedding投影到向量空间的不同地方,当然可能由于数据相对于原文实现的数据比较少,所以在同样维度的向量空间效果会更加明显一些,不过和刚开始对比已经有了很大的进步:

pytts 语音克隆 实时语音克隆_pytts 语音克隆_04

Synthesis

这里数据选用了清华的data_thchs30,选用该数据集的目的是因为只有这个数据集有拼音,方便处理。

在这里为了方便,把数据集处理成libspeech的格式,其中有一步需要对每一条transcript进行处理,得到alignment(对齐),这一步很耗费时间。

这个是处理好的中文数据的第一条:

pytts 语音克隆 实时语音克隆_pytts 语音克隆_05

第一部分是文件名,第二部分是拼音,第三部分是alignment。

然后跑synthesis模型,这里可以选择在给的pretrained模型的基础上做fine-tuning,也可以直接从头训。作者给的观点是如果你有300h左右的语料库最好重新训。所以这里我直接fine-tuning,设定20W步,训练过程分为pre-processing和train。

pre_processing使用audio产生这三个文件:

pytts 语音克隆 实时语音克隆_人工智能_06


每一个文件夹中的文件都是npy格式,代表各个部分的向量表示。

下面是train的结果:

pytts 语音克隆 实时语音克隆_Tacotron_07


先是训练中loss的图:

pytts 语音克隆 实时语音克隆_TTS_08


mel-spectrogram:

pytts 语音克隆 实时语音克隆_人工智能_09


然后是eval中loss的图:

pytts 语音克隆 实时语音克隆_Tacotron_10


这里每一次eval都会生成一个wav文件:

pytts 语音克隆 实时语音克隆_Tacotron_11

可以看到alignment已经能看到了,但是有的对齐也不是很好,eval的loss也比训练的loss多一些。
这里听声音的话,已经能合成人声,但是由于synthesis这一步合成时采用的是Griffin-Lim,所以会有杂音,这里只需要听韵律就行了。

Vocoder

最后一块了,这里输入采用synthesis训好的模型产生的mel-spectrogram。

训练过程:

pytts 语音克隆 实时语音克隆_pytts 语音克隆_12


这里同样采用fine-tuning,由于采用了wavenet所以这里loss不会像之前synthesis一样降到0.几。

训练出来的结果只包括一个模型的pt文件和一堆合成的样本。

整体测试

这样这个模型就算训练完成了。整体测试一下:

选取人声:

pytts 语音克隆 实时语音克隆_TTS_13


输入一段文本:

pytts 语音克隆 实时语音克隆_TTS_14


合成声音:

pytts 语音克隆 实时语音克隆_Tacotron_15


听了一下,说话人声音很像,但是合成的声音会有杂音。拿出来WaveNet单独发声发现是WaveNet训练的不够好,之后准备重新训WaveNet看一看效果会不会有进步。

(从开始看tacotron1,2,WaveNet的论文和复现,到SV2TTS的论文与复现,到自己做出来结果,陆陆续续花了一个多月的时间,记录一下方便以后复习。)