热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【NLP】自然语言处理学习笔记(三)语音合成

前言本笔记参考的课程是李宏毅老师的自然语言处理课程Link:https:aistudio.baidu.comaistudioeducationlessonvideo
前言

本笔记参考的课程是李宏毅老师的自然语言处理
课程Link:https://aistudio.baidu.com/aistudio/education/lessonvideo/1000466

TTS

语音合成(TTS)指的是将文字信息转换成语音信息,这在各种自媒体工具上非常常见。
在这里插入图片描述

TTS before End-to-end

在端到端的模型出现之前,已经有人将深度学习应用在了语音合成之中。
下图中展示了Deep Voice初代结构,它用了四个模型。
首先,它将输入的文本信息(text)输入到Grapheme-to-phoneme转化成音位(phoneme),然后分成三部分,第一部分输入到Duration Prediction中,输出各音位的持续时间。第二部分输出到Fundamental Frequency Prediction中,输出各音位的频率,即模拟人发声时声带振动的频率,其中X表示不需要振动。最终,再将第三部分即原因素和前两部分一起输入到Audio Synthesis中,输出最终得到的语音(audio)。
在这里插入图片描述

Tacotron

Tacotron是17年提出的端到端的语音合成模型,其中Taco意思是墨西哥鸡肉卷,因为论文作者喜欢tacos,就这么命名。。
Tacotron的模型结构如下图所示:
在这里插入图片描述
Tacotron中包含经典的Encoder、Attention、Decoder,后续又添加了一个后处理的CBHG和Vocoder,输出语音信号。

Encoder

首先看第一部分Encoder。
首先,输入文本,通过embeddings编码成向量,经过一个Pre-net之后输入到CBHG结构,下图中左侧展示了CBHG的具体组成方式,即3个卷积层,1个池化层,1个残差结构,最后通过GRU输出。
不过这个CBHG结构也不是一成不变的,比如图中下侧展示了Tacotronv2版本的CBHG结构,只有3个卷积层和一个LSTM做输出。
在这里插入图片描述

Attention

Attention的机制大概和语音识别里的类似,这里只给了Attention效果的评估参考。纵轴是Encoder steps,横轴是Decoder steps,当Attention出现明显的对角线时,说明训练的效果好。个人觉得,也可以这样直观理解:Encoder和Decoder在相同的时间步中聚焦于同一个信号,说明注意力集中效果好,否则注意力涣散,效果不好。
在这里插入图片描述

Decoder

Encoder输出的context vector输入到Decoder,Decoder具有重复类似的结构,每个重复结构都包含一个Pre-net和两个RNN,每个结构输出是多个spectrogram(spectrogram是waveform的频谱图,在语音识别里有提到),其中,选取最后一个spectrogram作为下一层结构的输入。
注意,在第二个RNN结构中,还需要输出一个信号来判断句子是否结束,如果结束,则不再进行下一层的输出。
另外值得注意的是,在Pre-net中,必须有dropout的操作,如果没有dropout效果会很差,这里的dropout就相当于随机采样。

Post processing

在Decoder之后,进入到后处理(Post processing),后处理比较简单,将Decoder输出的spectrogram再经过一个CBHG结构输出spectrogram,为什么要再这样处理一下呢?这是因为RNN是根据前面的输入产生输出,是一个顺序结构,如果后面想要进行修改就没机会了。Post processing就是给模型在看过整个句子的情况下,再有一次修改输出的机会。
这里要计算两个Loss,在Post processing处理前后的向量都要和groundtruth做loss。
在这里插入图片描述

Vocoder

Vocoder就是将spectrogram转换成语音信号,这里具体结构不作细述。
第一代Tacotron使用的Vocoder是Griffin-Lim
第二代Tacotron使用的Vocoder是Wavnet
在这里插入图片描述

Work

下面通过具体的指标来看看Tacotron的效果。这里的指标采用的是mean opinion score,即让一群人听合成出的声音来进行评分,总分5分,然后取平均值作为MOS。
从下图数据中,可以发现Tacotron1代的评分为3.82,还不如其它方法,但在Tacotron2代,它的评分达到了4.526,基本接近了Ground truth的水平。
在这里插入图片描述

Beyond Tacotron

在这一节,将讨论Tacotron之外的一些问题。

Mispronunciation

通过前面对Tacotron的了解,大致知道Tacotron产生的语音是通过模型进行合成的,这就难免会造成一些发音错误(mispronunciation)。
一种解决方式是构造一个词典(lexicon),这样Tacotron就可以根据词典查询对应的发音。
在这里插入图片描述
如果出现了一些词典中没有的新词汇,Tacotron就根据自己的猜测进行发音,如果发音正确,将词典进行扩充。

More information for Encoder

关于Encoder也有优化的地方。比如,遇到下面这种语法比较复杂的句子,输入时可以对其进行语序划分。比如Syntactic information的方法,以及BERT embedding方法(这个后续会继续深入学习)。
在这里插入图片描述

Attention

关于Attention,也有优化的地方,这里简单描述三种优化方式。

Guided Attention

前面提到过Attention最好是一条清晰的对角线。
Guided Attention的思路是给这条对角线限定蓝色区域的范围,如果Attention进入到红色区域,就会收到相应惩罚。
在这里插入图片描述

Monotonic Attention

Monotonic Attention的思路是给Attention加了一个限制,即要求Attention必须要从左向右,如图所示,这样限制出来就近似会接近对角线的情况。
在这里插入图片描述

Location-aware attention

Location-aware attention的思路是计算attention是查看上一时刻附近的attention,比如下图中要计算a1,2,就会选取a0,1 a0,2 a0,3的attention参与计算。
在这里插入图片描述

Fast Speech

Fast Speech和DurlAN是同时期独立提出的模型,其结构如下图所示。
输入文本信息,将其Encoder之后,再计算Duration,这里的Duration表示持续时间,取的是整数。比如下图中,Duration取值为2,3,1,Add length就将红色复制为2,蓝色复制为3,黄色不变保持1,然后输入到Decoder中,输出spectrogram。
在这里插入图片描述
值得注意的是,由于Duration取值为整数,直接进行反向传播训练时,duration无法求微分,于是训练思路就是在Duration中引入groundtruth进行单独训练。这里的groundtruth比较难直接获取,可以通过其它模型计算得到。

在这里插入图片描述
下面看一下对于比较复杂的长难度句,Fast Speech的表现如何。
在这里插入图片描述
上图中是一些比较拗口的难句,可以看到Tacotron和Transformer的错误率都在30%左右,而Fast Speech做到了0错误!可见其效果很强。

Dual Learning: TTS v.s. ASR

上面在Fast Speech中提到,Duration的groundtruth可以由其它模型得到,这带来的一个启发就是,是否可以用不同的模型实现对抗竞争性的训练(Dual Learning)。
下图中就提到了一种设计思路,可以将文字转语音(TTS)和语音转文字(ASR)放到一起训练,这样起到了同时训练的效果。
在这里插入图片描述

Controllable TTS

下面将前面的语音合成(TTS)再做进一步拓展。之前的模型结构,基本实现了文字转语音的功能,但是对语音的情绪,包括语调,重音,韵律等没做过多的控制(Control),下面将考虑这些因素。

下图展示了一种训练思路。
在TTS模型中,除了输入需要转换的文本外,还输入一段语音,输出的语音将包含文本的内容和输入语音的特征。然后训练目标就是让输出语音和输入语音尽可能接近。
在这里插入图片描述
这和前面语音转换中的思路比较类似,直接这样做会带来的一个问题就是,输出的语音将无限接近输入的语音,最终相当于直接copy输入语音来输出,这样的损失一定最小,这样的话就会忽视了输入文本的内容,因为这样做无法准确地把输入语音的语音信息排除开来。
在这里插入图片描述

解决这一问题的思路也比较简单。在输入语音中,加一个特征提取器,我们只需要提取输入语音的特征,过滤掉输入语音的语义信息。
在这里插入图片描述

GST-Tacotron

GST-Tacotron方法提供了一个具体的处理方式。
它将输入语音(Reference audio)通过一个特征提取器只输出一个向量,将该向量复制多份和Encoder出的结果进行注意力计算,然后输入到Decoder后面输出,后续结构和Tacotron一样,下图中进行了省略。
在这里插入图片描述
下面将特征提取器的结构拆开看看。
为什么GST-Tacotron能够将Reference audio的语义信息隔离开呢?
这是因为,Feature Extractor提取的信息不是直接输入到下一层,而是将其变成了一个权重向量。里面有一个已经提前学习好的vector set,这个是真正代表语义风格的Tokens,比如下图中的A代表高音,B代表低音,C代表韵律等特征,attention weight就是调整它们的比例,使其接近输入语音的特征,最后将他们加权相加,输出一个融合的特征向量。
在这里插入图片描述

2nd stage training

当然,除了特征提取的思路外,还有另一种处理思路。 2nd stage training就是保持了训练场景和测试场景一样,即输入文本和参考语音。然而,因为这样没有groundtruth,无法直接训练。

在这里插入图片描述
于是2nd stage training就借鉴了前面Dual Learning的思想,再输出语音后面加上一个ASR,将输出语音重新转回文本,然后比较输入输出文本的差异,从而做损失进行训练。这样就可以自然地让TTS逐渐倾向于只提取reference audio的特征信息,过滤语义信息。
在这里插入图片描述


推荐阅读
  • 本博文基于《Amalgamationofproteinsequence,structureandtextualinformationforimprovingprote ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 人工智能推理能力与假设检验
    最近Google的Deepmind开始研究如何让AI做数学题。这个问题的提出非常有启发,逻辑推理,发现新知识的能力应该是强人工智能出现自我意识之前最需要发展的能力。深度学习目前可以 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 本文整理了Java中org.apache.pig.backend.executionengine.ExecException.<init>()方法的一些代码 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了10分钟了解Android的事件分发相关的知识,希望对你有一定的参考价值。什么是事件分发?大家 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • 项目需要实现弹幕,网上参考了各种方法,最后觉得transform+transition实现的效果在移动设备上性能最好,在iphone6和红米4上测试,看不到 ... [详细]
author-avatar
柏慧Bertha
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有