Chapter6_Vocoder

文章目录

  • 1 Introduction
  • 2 WaveNet
    • 2.1 WaveNet的架构
    • 2.2 Softmax Distribution
    • 2.3 Causal Convolution和Dilated Convolution
    • 2.4 Gated Activation Unit
    • 2.5 小结
  • 3 FFTNet
  • 4 WaveRNN
  • 4.1 Dual Softmax Layer
  • 4.2 Model Coarse
    • 4.3 Model Fine
    • 4.4 小结
  • 5 WaveGlow

本文为李弘毅老师【Vocoder】的课程笔记,这次课程由助教同学許博竣讲授,课程视频youtube地址,点这里👈(需翻墙)。

下文中用到的图片均来自于李宏毅老师的PPT,若有侵权,必定删除。

文章索引:

上篇 - 5 Speaker Verification

下篇 - 7-1 Overview of NLP Tasks

总目录

1 Introduction

我们在之前的课程中有讲过TTS(Text to Speech)模型和VC(Voice Conversion)模型。这两个模型一般吐出来的都是一个叫做Spectrogram的东西,Spectrogram不是语音,它是一个表示各个时间点各个频率的声音强度的图谱(下图的图谱中,横轴为时间,纵轴为声音频率,颜色深浅表示强度)。因此要转化为最终的语音,还需要一个叫做Vocoder的模型。总而言之,Vocoder就是把Spectrogram转化为语音的模型。
ch6-1

为什么我们必须要有一个Vocoder,而不是让我们的网络直接生成一段语音呢?假设我们有一段语音xxx,然后这段语音xxx经过短时傅里叶变换之后,可以得到一个与时间ttt和频率fff相关的复数,这个复数的幅值At,fA_{t,f}At,f就是我们刚才聊到的Spectrogram,而eiθt,fe^{i\theta _{t,f}}eiθt,f就是相位。TTS或者VC直接生成的结果都是At,fA_{t,f}At,f,没有相位。相位不同,产生的音质的差别是很大的,所以相位是必须要有的,这个相位就需要一个叫做Vocoder的模型去生成。
ch6-2

其实要把相位直接放到模型里去end-to-end的train也行,但是这一方面会加大模型的训练难度,另一方面Vocoder是TTS和VC这样的任务都需要的,单独拿出来train的话,既可以两边通用,又可以降低TTS和VC的训练难度。

2 WaveNet

我们的声音信号放大来看,就是一串点的序列,WaveNet借鉴了autogressive model的思想,泛一点来说就是输入前t−1t-1t1个点,输出第ttt个点,然后把新生成的点放到队列当中去,继续生成下一个点。WaveNet最重要的部分就是Causal Convolutions,说简单点就是一堆卷积。
ch6-3

2.1 WaveNet的架构

WaveNet的整体架构如下图所示。Input就是声音信号的前t−1t-1t1个点,然后Input会经过一个Causal Conv,经过Causal Conv之后,会经过k层layers,layers就是由dialated conv和1×11 \times 11×1卷积组成的残差网络,每层都会输出一个特征,利用skip-connection组合起来之后,再经过两个1×11 \times 11×1卷积和Softmax就得到了最终的结果。
ch6-4

2.2 Softmax Distribution

我们的输入和输出都是one-hot的向量,所以这里要用到softmax。我们的声音信号上每个点的数值是一个16-bit的int,范围在[-32768, 32767],如果直接把这个进行one-hot的话,我们softmax的layer将会有65536个类别,这太难了。所以这里用了一个叫做μ-law的方法,把[-32768, 32767] (16-bit int)的信号转变到了[0, 255] (8-bit int)。这个过程如下所示,先将信号数值转化到[-1, 1],然后用一个叫做μ-law的方法再转换一下,范围仍在[-1, 1],最后再转化到[0, 255]。之所以要用μ-law是因为μ-law可以减小量化误差。

[-32768, 32767] (16-bit int) -> [-1, 1] -> [-1, 1] (μ-law) -> [0, 255] (8-bit int)

μ-law就是下面这个公式,这里不做过多介绍。

ch6-5

2.3 Causal Convolution和Dilated Convolution

Causal Convolution(因果卷积)就是下图这个东西。它是专门针对时间序列设计的,所以它输出的时候,不会考虑未来的信息,而且隐藏层越多,考虑过去的时间越久远。比如下图是一个kernel size为2的Causal Convolution,最终的output会考虑前5个时间点的信息。
ch6-6
而Dilatied Convolution则是下图所示的这样,它的目的是在卷积中加入空洞来增加感受野。这样一来就不用像标准的CNN那样去pooling了。
ch6-7
而把这两者结合起来就是Dilated Causal Convolution了。这样一来模型就可以看到更长远的信息了,这在点非常密集的语音里是非常必要的。
ch6-8

2.4 Gated Activation Unit

这里还有一个需要提一下的就是这个Gated Activation Unit,那其实就是经过了两个不同的激活函数,如下图所示。
ch6-8
如果我们要给模型加一些条件的话,就可以加载这个Gated Activation Unit的部分。如果一些全局的特征,比如说话人的一些条件,就像Global Condition那样加,如果是要加Spectrogram这样的随时间变化的条件,就可以像Local condition这样加。
ch6-9

2.5 小结

WaveNet可以直接使用waveform level的特征,利用到了Dilated Causal Convolution去增大感受野,同时也可以接受各种的条件输入,最终出来的结果也是比较不错的。但是,它有一个问题就是速度太慢了,这也可以想象,毕竟autogressive这种方法计算下一个时间点的输出时,是需要利用到之前输出的结果的,因此无法并行计算。所以之后提出的一些网络,基本都是为了解决速度的问题。

3 FFTNet

FFTNet和WaveNet一样都是autogressive model,它简化了WaveNet中的一些繁琐计算,同时提出了一种可以用到所有的autogressive model上的训练和合成技巧。

FFTNet的模型架构如下图所示,它会把输入xxx分为xLx_LxLxRx_RxR两个部分,然后分别经过一个卷积之后,加起来,再过一层卷积,使得总长度减半,这样运行两层,得到最终结果。这样得到的特征,也是考虑了一定范围的语音特征的,比如下图中输出的绿色部分就是考虑了xLx_LxL生成的。
ch6-10

FFTNet提出了四个技巧:

  • 在开头做zero-padding可以让训练结果更好
  • 最后取结果是,不是直接去最大概率的那个值,而是根据概率分布去做sample
  • 在训练时,给输入加上一些噪声
  • 加入去噪声的后处理

FFTNet最终可以达到和WaveNet差不多的效果,但速度却快上很多。

4 WaveRNN

WaveRNN是Google提出来的,说简单点就是用RNN去代替之前的CNN。

4.1 Dual Softmax Layer

WaveRNN没有用之前把16bit转成8bit的方法,而是把16bit转成了两个8bit,然后做两次softmax的操作。
ch6-11

4.2 Model Coarse

产生ctc_tct的部分如下图所示,中间这块我们可以把它看成一个GRU,它吃ct−1c_{t-1}ct1ft−1f_{t-1}ft1,以及上一个time step的hiddent state,输出ctc_tct
ch6-12

4.3 Model Fine

产生ftf_tft的部分如下图所示,中间这块我们可以把它看成一个GRU,它吃ct−1c_{t-1}ct1ft−1f_{t-1}ft1,以及上一个time step的hiddent state,除此之外,还有刚才产生的c+tc+tc+t,输出ftf_tft
ch6-13

4.4 小结

WaveRNN还有一些加速的技巧,最终可以达到在手机cpu上real time的效果,非常强~

5 WaveGlow

WaveGlow放弃了autogressive的方法,基于flow-based model去做的,这个模型非常难train,有兴趣的同学可以看一下视频或者相关资料学习,这里不做介绍了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470646.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

show一下自己的文档编写功底

以我为例,我绝对相信,“才华”和颜值成反比。“才华”二字加了引号了,自知跟优秀有孙大圣一个筋斗云的距离,不过某些细节方面表现得被认为还不错,这里我要秀一下我的文档编写能力。在我这十年的工作生涯里,…

mysql命令速查手册

数据准备 -- 创建数据库 create database qianduan_test charsetutf8;-- 使用数据库 use qianduan_test;-- students表 create table students(id int unsigned primary key auto_increment not null,name varchar(20) default ,age tinyint unsigned default 0,height decima…

Chapter7-1_Overview of NLP Tasks

文章目录1 Introduction2 Part-of-Speech(POS) Tagging3 Word Segmentation4 Parsing5 Coreference Resolution6 Summarization7 Machine Translation8 Grammar Error Correction9 Sentiment classification10 Stance Detection11 Natural Language Inference(NLI)12 Search En…

python制作文本编辑器_Python小实战:制作文本编辑器

学了半年了,该施展一下了🍺 做什么呢?做一个简单的文本编辑器吧 来,开始 知识点: 1)做窗体的知识 2)文件操作 窗体用的是tkinter简单模块,系统自带模块 有人说了:“哇&am…

OGNL 详解

Struts2 OGNL详解 1.概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整…

完善获取数据库数据的写法

上一篇:使用express搭建服务器获取MySQL数据库数据 一、完善获取数据库数据的写法 asyncawait版本: const express require(express) const db require(./db/nodejs-orm/index.js)const app express()app.get("/get_data", (req, res) …

Chapter7-2_BERT and its family - Introduction and Fine-tune

文章目录1 What is pre-train model2 How to fine-tune2.1 Input2.2 Output2.3 Fine-tune2.4 Weighted Features3 Why fine-tune本文为李弘毅老师【BERT and its family - Introduction and Fine-tune】的课程笔记,课程视频youtube地址,点这里&#x1f4…

python数据分析基础教程 numpy_Python数据分析基础教程:NumPy学习指南(第2版)

Python数据分析基础教程:NumPy学习指南(第2版) Ivan Idris (作者) 张驭宇 (译者) NumPy是一个优秀的科学计算库,提供了很多实用的数学函数、强大的多维数组对象和优异的计算性能,不仅可以取代Matlab和Mathematica的许多…

【BZOJ-2435】道路修建 (树形DP?)DFS

2435: [Noi2011]道路修建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3115 Solved: 1002[Submit][Status][Discuss]Description 在 W 星球上有 n 个国家。为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通。但是每个国家的国王都…

CSRF跨站请求伪造

一、CSRF跨站请求伪造 CSRF全拼为Cross Site Request Forgery,译为跨站请求伪造。 CSRF指攻击者盗用了你的身份,以你的名义发送恶意请求。 包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品&a…

升级 ubuntu_Ubuntu 19.04 已经到期!现有用户必须升级到 Ubuntu 19.10

Ubuntu 19.04 已在 2020 年 1 月 23 日到期,这意味着运行 Ubuntu 19.04 的系统将不再会接收到安全和维护更新,因此将使其容易受到攻击。-- Abhishek Prakash(作者)Ubuntu 19.04 发布于 2019 年 4 月 18 日。由于它不是长期支持(LTS)版本,因此…

Chapter7-3_BERT and its family - ELMo, BERT, GPT, XLNet, MASS, BART, UniLM, ELECTRA, and more

文章目录1 How to pre-train2 Predict next token3 Mask Input4 seq2seq的pre-train model5 ELECTRA6 Sentence Embedding本文为李弘毅老师【BERT and its family - ELMo, BERT, GPT, XLNet, MASS, BART, UniLM, ELECTRA, and more】的课程笔记,课程视频youtube地址…

JavaScript调试工具

JavaScript代码看起来总是要比Java、C#乱的多,可能是自己还不熟悉JavaScript编程,因此一款优秀的JavaScript调试器就显得格外重要。目前在网络和书上见到最多的有: 第一个:Microsoft Script Debugger: 集成在IE中的一款很原始的调…

python中split函数_python strip()函数和Split函数的用法总结

strip函数原型 声明:s为字符串,rm为要删除的字符序列. 只能删除开头或是结尾的字符或是字符串。不能删除中间的字符或是字符串。 s.strip(rm) 删除s字符串中开头、结尾处,位于 rm删除序列的字符 s.lstrip(rm) 删除s字符串中开头处&#xff0c…

express项目搭建 初始化详细步骤

案例 一、对每一个POST请求都设置CSRF防护 实际上,不仅仅转账需要CSRF防护,每一个post请求都需要做csrf的防护措施。 webA项目中的app.js: const router express.Router();router.all("/register",(res,req)>{.... })funct…

Chapter7-4_來自獵人暗黑大陸的模型 GPT-3

文章目录1 为何来自暗黑大陆2 GPT-3的野心3 GPT-3的效果4 Beyond GPT-3本文为李弘毅老师【來自獵人暗黑大陸的模型 GPT-3】的课程笔记,课程视频youtube地址,点这里👈(需翻墙)。 下文中用到的图片均来自于李宏毅老师的PPT,若有侵权…

SetConsoleCtrlHandler() -- 设置控制台信号处理函数

http://www.groad.net/bbs/thread-8253-1-1.html 当你在命令行里工作时,经常会输入 Ctrl-C 这个组合键以停止程序的运行。SetConsoleCtrlHandler() 函数可以让一个或多个特定函数在接收到 Ctrl-C, Ctrl-break 这些与控制台有关的信号时得到执行。 BOOL WINAPI SetCo…

python提取txt中的字符串数据_python 从字符串中提取数值

python中用re.findall函数,里面写正则表达式 rootvdirectva:/home/lic_auto_scale# cat re.py import re test[10Mbps,100bps,6.7Gbps,0.8bps,10.562Kbps] for union in test : _sizere.findall(r\d\.*\d*,union) xusage re.findall(r\D*bps,union) print("si…

二、PHP框架Laravel学习笔记——路由的定义和控制器

一.路由的定义 什么是路由?路由就是提供接受 HTTP 请求的路径,并和程序交互的功能; 简单点理解,就是为了提供访问程序的 URL 地址,所做的一些设置工作; phpstorm 支持 cmd 操作,左…

Chapter7-5_Multilingual BERT

文章目录1 什么是Multilingual BERT2 Zero-shot Reading Comprehension3 Cross-lingual Alignment4 How alignment happens本文为李弘毅老师【Multilingual BERT】的课程笔记,课程视频youtube地址,点这里👈(需翻墙)。 下文中用到的图片均来自…