![e7b4d9438db4715a9a381029f77b4189.png](https://i-blog.csdnimg.cn/blog_migrate/64b1e58cee9b7f9e7c5308a7a9ba01b8.jpeg)
I Beyond Tacotron
那在有了 Tacotron 之后呢?是不是有了 Tacotron 所有的问题就统统被解决,没有什么好研究的了?其实不是, Tacotron 并没有解决所有的问题。
首先 Tacotron 会遇到的问题是有时候 合出来的发音会有错 (occasional mispronunciation),有时候会拼错字。产生这样的原因是在训练Tacotron 时,所使用的是 词 的方法,其训练包含的词汇量有效,当我们要合成的语音中包含训练中没有的词时,模型就只能靠猜导致最终发音错误,那有可能使用包含全部词汇的训练集么?当然没有,即使最大的英文语音数据集也仅有一本英文字典的一半的词汇。
1.1 Mispronunciation
![b4d44ac4489ad1f460e1cdeb2d97a7ac.png](https://i-blog.csdnimg.cn/blog_migrate/e0c5c719d8a7e6330a78cecd285481c8.jpeg)
语音合成任务并不需要像训练语音识别模型那样上万小时的有标注数据。 数据集平均一个人的声音有 20 多个小时,就能保证合成出来的声音品质非常高。但是,20多个小时的人声是无法保证词汇量的。VCTK 数据集词汇大概在 5000 左右。就算是 Nancy 词汇量也不到 2 万。目前最大的公开数据集像 LibriTTS 的词汇量也才不到 10 万。一般英文词典的数量,都是十万以上。模型虽然能猜测英文的单词的音素。但是它看过的词汇不够,没法准确估计出每个词应有的发音方式。所以它在看到生僻词或新词时,会念错。使用者会对此难以接受。我们要怎么办呢?
![3bf8423781e78c5c73aecccc92a073fd.png](https://i-blog.csdnimg.cn/blog_migrate/dce3279b31fb4772b94d72a131a05318.jpeg)
有一个解决的方法是,不要把character当作输入,找一个比较好的 lexicon 词典,lexicon里有 词汇word 和 音素phoneme的对应关系,将要输入给Tacotron的文字转为phoneme再输入,这样就不会有念错词汇的可能了。但用lexicon还会有一些问题的,举例来说
OOV问题:想要机器念词典中未出现的词,如 “nCoV”
有一个解决方法是 给Tacotron 同时输入 character 和 phoneme 混合起来的东西。比如在训练时,将某些词汇(即使词典里有)用character来表示。当出现有新词不会念的时候,可以将新词添加到lexicon字典中,从而使得机器学会念这个新词。而且,这样做的好处是,假设之后我们知道一些OOV词汇的phoneme后,我们可以通过更新词典来修正发音。
1.2 More information for Encoder
![d69ab61d3bc3addac13668c211858006.png](https://i-blog.csdnimg.cn/blog_migrate/f9dd8d44efda9e104fa6e563b0fe4aab.jpeg)
有时候,我们也会把句法资讯加到Tacotron的输入里,那为什么要把语法资讯加到输入里呢?
句法信息对一个句子的发音也有重要的贡献。比如它能决定一个句子的短句和语气。如图1所示例子,these two boys 可以是一个短语,eating apples 可以是一个短语。通常我们会把一个完整意义的短语连读,而在分隔的短语之间,留有气息。对于一些歧义比较多的语言而言,比如中文,句法信息对断句的影响可能会造成你对某句话完全不同的理解。这和中文分词中的歧义是一样的。比如「欢迎新老师生前来就餐」可以被划分为:
欢迎 / 新老师 / 生前 / 来就餐
欢迎 / 新老师生 / 前来 / 就餐
停顿的位置稍微不一样,意思就天差地别了。如果我们能把这些信息提前告诉给 Tacotron。
也有人把 BERT 的embedding当作是 Tacotron 的输入来做语音合成。其中的直觉是,BERT 利用自注意力机制,它的每一个字嵌入都融合了上下文信息,当然也融合了语义句法信息。这些信息对语音合成是有帮助的。