Chapter2-1_Voice Conversion(Feature Disentangle)

文章目录

    • 1 什么是Voice Conversion
    • 2 实际实现中的细节
    • 3 根据数据集分类
    • 4 Feature disentangle
    • 5 训练技巧

本文为李弘毅老师【Voice Conversion - Feature Disentangle】的课程笔记,课程视频youtube地址,点这里👈(需翻墙)。

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

文章索引:

上篇 - 1-7 Language Modeling

下篇 - 2-2 CycleGAN and StarGAN

总目录

1 什么是Voice Conversion

Voice Conversion指的就是输入一段声音,输出另一段声音。这两段声音的文字内容是一样的,但其他的某些方面是不一样的。
ch2-1-1
这个某些方面指的是什么呢?

(1)说话人(Speaker)的转变。就是让这段语音听起来像是另一个人在说一样。

  • 不同的人说同样一段话,会有不同的效果;
  • 可以用来诈骗(Deep fake);
  • 做个性化的语音转换,比如小孩一个人在家,别人敲门时,可以用大人的声音回答;
  • 保护个人隐私,从声音中可以获取一个人很多的信息。

(2)说话风格(Speaking Style)的转换。

  • 说话情绪的转变,有些人说话很温柔,想要严厉批评别人的时候,可以用这个;
  • Normal to Lombard。Normal是指正常环境下说话的声音,Lombard是指在酒吧这种嘈杂环境下说话的声音。做这个的原因是,也许有一天,我们的机器人需要在嘈杂的环境下说话,转成Lombard可以让别人听的更清楚。
  • Whisper to Normal。悄悄话转成正常人说话的声音。也许我们在图书馆或者哪里用很轻的声音打电话时,希望电话另一头的人听到的是正常的声音。
  • 唱歌技巧转换。比如加弹唇,加颤音。

(3)增强说人话的可理解性(Improving Intelligibility)。

  • 说话有障碍的人群说的话,可以被转化成更容易理解的声音。
  • 口音转换。比如让中国人说英文时,听不出中国人在说的感觉。

(4)数据增强(Data Augmentation)

  • 扩大数据集。

2 实际实现中的细节

在实际的实现中,我们往往会假定输入和输出的长度是一致的,这样会让我们的模型比较简单,一个encoder就够了。同时,输出的声音特征向量不能直接作为语音输出,还差个相位,转化为语音时,还需要一个vocoder。这个vocoder如果做的不好,就会让我们合成的声音听起来比较假,一听就听出来是合成的了。

这次不讲vocoder,只讲voicer conversion的部分。
ch2-1-2

3 根据数据集分类

用于语音转换的数据集可以是成对的(parallel data),也可以是不成对的(unparallel data)。

成对就是指,同样一段话,让不同的人念一遍。这样的数据往往成本比较高,很难找到很多。如果有这样的数据的话,硬train一发,就可以了。

不成对就是每个说话人说的话,甚至语言都是不一样的。这样的数据往往比较好找。这里就需要借助于图像中风格转换的一些技术。Feature Disentangle,顾名思义,就是说我们的声音信号中包含着各种各样的特征,有关于内容的特征,有关于说话人的特征,有背景噪音的特征等等。我们的目的就是把这些特征给分离开来,然后如果要做speaker的转换的话,就把speaker这部分的特征替换掉就可以了。
ch2-1-3

4 Feature disentangle

下面在描述时,以speaker的转换为例。同样的方法也可以用来转换其他的特征。

假设我们今天有一个content encoder可以提取出语音中的文字信息;又有一个speaker encoder可以无视文字信息,只提取出说话人的说话特征;还有一个decoder吃content encoder和speaker encoder的输出,然后可以吐出speaker encoder说话人说出content encoder内容的语音了。这就实现了voice conversion。
ch2-1-4
那么,要怎么训练这两个encoder加上一个decoder呢?训练的总体方法和auto-encoder非常相似,就是经过encoder之后,会有一个特征,然后再把这个特征放进decoder里之后,希望得到输入尽可能一致的声音信号。但是,如果完全按照auto-encoder的方法来训练的话,模型并不知道要把两个encoder分为content和speaker两部分,两个encoder学成一样的也是完全有可能的。如何让模型知道要学一个content的特征,一个speaker的特征就是voice conversion和auto-encoder的区别所在。
ch2-1-5
目前主要有以下几种方法:
(1)用one-hot向量来代替speaker encoder
一种做法就是,我们干脆不要这个speaker encoder了。我们用一个one-hot encoder的向量来表示是哪个说话人说的。这个做法的前提是,我们知道是哪个说话人说的,且这个说话人属于一个已知的有限集合,如果有一个新的说话人进来,就需要重train这个模型。这个做法的另一个缺点是,没有办法保证content encoder的输出中,不包含说话人相关的特征,不过这个可以通过控制encoder输出的维度来加以限制。此法虽然看似很简单,但却会有还不错的结果。
ch2-1-6
(2)Pretrained Encoder
另一种做法就是我们先事先train好一个speaker embedding的模型来当作这个speaker encoder,然后再训练的时候,只需要微调一下这个speaker encoder就可以了。至于content encoder的部分,我们也可以用一个事先train好的语音识别的模型来做这个encoder。一般的语音识别的模型都是输出的文字,不太好直接放上去,一个比较好的content encoder就是HMM中用来计算输入的acoustic feature属于哪个state的那个DNN。

这个方案是工业界比较常用的方案。
ch2-1-7
(3)Adversarial Training
还有一种思路就是在训练content encoder的时候引入对抗学习。我们会添加一个speaker classifier作为discriminator,用来区分这句或是哪个说话人说的,而content encoder就要做到让speaker classifier区别不了这句话是哪个人说的,这样就可以尽可能地保证content encoder中不包含说话人的特征。
ch2-1-8
(4)设计网络
这里借用了image style transfer中的思想来实现feature dsentangle。首先,会在content encoder这里加上Instance Normalization来去除说人话的相关特征。然后会在decoder上加入一个Adaptive Instance Normalization来加入说话人的特征。
ch2-1-9
IN(Instance Normalization)就是对输出特征的每一个channel做normalization,因为每一个channel其实代表了模型捕捉到的声音信号中的某一个特征,将这些特征normalize之后,就可以把全局的特征抹去了,也就抹去了说话人的特征。
ch2-1-10
AdaIN(Adaptive Instance Normalization)是会先对decoder输出的特征加上一个IN,消除说话人的信息,然后再结合speaker encoder的输出,把说话人的信息,也就是全局信息给加上。
ch2-1-11

5 训练技巧

由于受到训练数据的限制,我们在类似auto-encoder这样traning的时候,从content这一路过来的声音和speaker这一路过来的都是同一个,而我们在testing的时候,却希望content这一路的声音,和speaker这一路过来的不是同一个人。这样我们的模型在testing的时候,表现就会不太好。

事实上,我们在训练的时候没法得到不同speaker从两路过来输出结果的ground truth,所以也只能这样训练。
ch2-1-12
为了解决这个问题,我们可以做2nd stage的training。这次训练时,两路过来的speaker时不同的,然后我们会把最终的输出放到一个discriminator里去判断这句话是否真实,我们希望输出越真实越好。同时,也会把输出放到一个speaker classifier当中去,来对进行speaker的判断。不过,这样直接train的话,很难train,我们还需要在另外加一个pather作为补偿器,这个patcher和decoder吃一样的输入,然后把输出加到decoder的输出上去。相当于给输出打了一个打补丁。这个补丁在1st stage training的时候是不需要的。

这样的做法可以让模型的效果提升很多。
ch2-1-13

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

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

相关文章

1 0.99999的悖论_无限小数与芝诺悖论

问题昨天晚上,小学6年级的外甥女从数学课外辅导班补习回来,兴冲冲的对家里人说,哎,我发现了一个数学的大bug啊。你说1/3不是一个无限循环小数0.33333...,那么三个1/3加起来,不就是0.99999...吗?…

Mongoose 中使用 populate 实现关联查询

一、Mongoose populate 官方文档 https://mongoosejs.com/docs/populate.html 二、Mongoose populate 关联查询 1、定义 ref var ArticleSchema new Schema({ title:{type: String, unique: true},cid : {type: Schema.Types.ObjectId, ref:ArticleCate //model 的名称 }, …

FPGA开发全攻略——概念篇

原文链接: FPGA开发全攻略连载之一:FPGA为什么这么热? FPGA开发全攻略连载之二:为什么工程师要掌握FPGA开发知识? FPGA开发全攻略连载之三:FPGA基本知识与发展趋势(part1) FPGA开发全…

vue @input带参数_Vue 全家桶开发的一些小技巧和注意事项

前言用 vue 全家桶开发一年多了,踩过不少坑,也解决了很多的问题,把其中的一些点记录下来,希望能帮到大家。以下内容基于最新版的 vue vuex vue-router axios less elementUI,vue 脚手架是 vue-cli3。css 的 scope…

Chapter2-2_Voice Conversion(CycleGAN and StarGAN)

文章目录1 内容简述2 CycleGAN3 StarGAN本文为李弘毅老师【Voice Conversion - CycleGAN and StarGAN】的课程笔记,课程视频youtube地址,点这里👈(需翻墙)。 下文中用到的图片均来自于李宏毅老师的PPT,若有侵权,必定删…

cookie与session原理详解

一、 Cookie cookie:浏览器在电脑硬盘中开辟的一块空间,主要供服务器端存储数据。 cookie中的数据是以域名的形式进行区分的。cookie中的数据是有过期时间的,超过时间数据会被浏览器自动删除。cookie中的数据会随着请求被自动发送到服务器端。…

eclipse的servlet默认不执行index_MySQL之索引及执行计划分析

mysql官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构。索引的本质:索引是数据结构。索引就是排好序的快速查找数据结构一般来说索引本身也很大不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上平时所说的…

Chapter3-1_Speech Separation(Deep Clustering, PIT)

文章目录1 内容简述2 评价指标2.1 Signal-to-noise ratio (SNR)2.2 Scale invariant signal-to-distortion ratio (SI-SDR)2.3 其他的评价指标3 Permutation Issue4 Deep Clustering5 PIT本文为李弘毅老师【Speech Separation - Deep Clustering, PIT】的课程笔记,课…

Joi验证模块的使用

1. 安装 官网中文文档:https://joi.dev/api/?v12.1.0#validatevalue-schema-options-callback //下载14.3.1 npm install 14.3.1注意:下载14.3.1,在npm install joi的时候默认下载的是最新版本 joi17.1.1,对于一些API高版本会舍弃从而出现…

Chapter3-2_Speech Separation(TasNet)

文章目录1 TasNet总体架构2 Encoder和Decoder3 Separator4 TasNet回顾5 More5.1 Unknown number of speakers5.2 Multiple microphones5.3 Visual information本文为李弘毅老师【Speech Separation - TasNet】的课程笔记,课程视频youtube地址,点这里&…

Node 中的开发环境与生产环境 和 使用Morgan打印请求信息

一、什么是开发环境与生产环境 环境,就是指项目运行的地方,当项目处于开发阶段,项目运行在开发人员的电脑上,项目所处的环境就是开发环境。当项目开发完成以后,要将项目放到真实的网站服务器电脑中运行,项…

Chapter4-1_Speech_Synthesis(Tacotron)

文章目录1 TTS before End-to-end2 Tacotron2.1 Encoder2.2 Attention2.3 Decoder2.4 Post processing3 How good is Tacotron?本文为李弘毅老师【Speech Synthesis - Tacotron】的课程笔记,课程视频youtube地址,点这里👈(需翻墙)。 下文中…

第三方模块config的使用

作用:允许开发人员将不同运行环境下的应用配置信息抽离到单独的文件中,模块内部自动判断当前应用的运行环境, 并读取对应的配置信息,极大提供应用配置信息的维护成本,避免了当运行环境重复的多次切换时,手动…

Chapter4-2_Speech_Synthesis(More than Tacotron)

文章目录1 Mispronunciation2 More information for Encoder3 Attention4 Fast Speech and DurIAN5 Dual Learning5 Controllable TTSSpeaker EmbeddingGST-TacotronTwo-stage Training本文为李弘毅老师【Speech Synthesis - More than Tacotron】的课程笔记,课程视…

【代码笔记】iOS-清除图片缓存UIActionSheet

一,效果图。 二,代码。 RootViewController.m //点击任何处出现sheet -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {UIActionSheet * sheet [[UIActionSheet alloc] initWithTitle:"确定要清空图片缓存?" d…

Chapter5_Speaker_Verification

文章目录1 Task Introduction2 模型架构3 模型介绍3.1 i-vector3.2 d-vector3.3 x-vector3.4 more4 End to End本文为李弘毅老师【Speaker Verification】的课程笔记,课程视频youtube地址,点这里👈(需翻墙)。 下文中用到的图片均来自于李宏毅…

python如何读取字典的关键字_python提取字典key列表的方法

python提取字典key列表的方法 更新时间:2015年07月11日 12:04:48 作者:企鹅不笨 这篇文章主要介绍了python提取字典key列表的方法,涉及Python中keys方法的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了python提取字典key列表的方法…

使用express搭建服务器获取MySQL数据库数据

一、原始的mysql查询方法 先安装mysql cnpm install mysql --save 引入这个db.js之后,才能对数据库进行查询 进行查询 查询结果如下: 二、ORM 介绍 ORM 全拼Object-Relation Mapping. 中文意为 对象-关系映射. 主要实现模型对象到关系数据库…

Chapter6_Vocoder

文章目录1 Introduction2 WaveNet2.1 WaveNet的架构2.2 Softmax Distribution2.3 Causal Convolution和Dilated Convolution2.4 Gated Activation Unit2.5 小结3 FFTNet4 WaveRNN4.1 Dual Softmax Layer4.2 Model Coarse4.3 Model Fine4.4 小结5 WaveGlow本文为李弘毅老师【Voc…

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

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