论文阅读 - AUTOVC: Zero-Shot Voice Style Transfer with Only Autoencoder Loss

文章目录

    • 1 概述
    • 2 模型架构
    • 3 模块解析
      • 3.1 获取梅尔频谱
      • 3.2 speaker encoder
      • 3.3 AutoVC
      • 3.4 Vocoder
    • 4 关键部分
    • 参考资料

1 概述

voice conversion这个任务的目标是输入两个音频,其输入是两段音频,一段音频称为content_audio,另一段称为speaker_audio。模型将抽取content_audio中的说话内容特征和speaker_audio中的语者特征,将两者结合,输出用speaker_audio中的说话人的声音说content_audio中的内容的音频。

这个任务的模型一般会有两个问题:

  • 需要成对的数据,即需要多个人说同一句话的数据
  • 无法用在没有在训练数据中出现过的人声上

AutoVC成功解决了这两个问题,也就是它不需要成对的数据,同时也可以做到zero-shot conversion。

官方给出的demo可见https://auspicious3000.github.io/autovc-demo/。效果还是很不错的,但是在中文语音上的表现就很差了。要在中文上做,就需要在中文数据集上重新训练了。中文的训练数据还是比较好找的,只要是知道每一句话是谁说的数据集都可以,比如ASR的数据集就都是可以拿来用的。

2 模型架构

voice conversion的整体流程如下图2-1所示。

首先会对输入的content_wav和speaker_wav抽取梅尔频谱,接着将抽取得到的speaker_mel过一个speaker_embedding模型,抽取语者的特征,然后将语者特征和content_mel一起输入到AutoVC当中进行融合,得到融合之后的梅尔频谱merged_mel,最后把merge_mel过vocoder就得到了最终的输出音频。
voice conversion整体流程图

图2-1 voice conversion整体流程图

这里用紫色方框框出的是需要训练的部分,用土色方框框出的是可以更换的部分。

3 模块解析

3.1 获取梅尔频谱

这个模块的输入时声音信号,输出是声音信号的梅尔频谱,一般是80维的。

不同的模型在抽取梅尔频谱时,参数会有所不同,而这里的梅尔频谱也影响了输入vocoder的梅尔频谱。因此在使用不同的模型拼成整个流程时,需要对梅尔频谱的处理做统一,这个在实现的时候是很重要的一步。否则训练好的模型,和后面的模型接不上了,就挺麻烦的。

3.2 speaker encoder

这个部分是将音频中语者的特征给抽取出来,输入是梅尔频谱,输出是一个256维的特征。

所谓语者的特征也就是和内容无关,只和说话人有关的特征。这个模型训练时候的目标是使得同一个人说不同的话输出相同的256维的向量,使得不同的人说同一句话输出不同的256维的向量。

这个模型是可以使用预训练好的模型的,AutoVC中使用的是在VoxCeleb1和Librispeech上预训练好的Dvector,共3549个语者。

训练之前,把每个语者说的所有话,分别过一下speaker encoder,并把这些embedding取一个平均,作为这个语者的speaker embedding。

预测的时候,把输入的speaker_mel过一下speaker encoder,将输出的特征作为语者的speaker embedding。

这个speaker embedding是一个很重要的特征,如果这个特征不够好的话,会导致训练的AutoVC训练的也不够好。

我们也可以在中文的语料上重新训练一下这个模型。也可以拿别人在中文语料上预训练过的模型,比如MockingBird。

3.3 AutoVC

AutoVC这个模块才是这篇文章的重点,它由一个content encoder(EcE_cEc),一个speaker encoder(EsE_sEs)和decoder组成。这里的EsE_sEs就是3.2中的speaker encoder,是预训练好的,所以用灰色来表示。其推理时的示意图如下图3-1(a)所示,其训练时的示意图如下图3-1(b)所示。
AutoVC示意图

图3-1 AutoVC示意图

在图3-1(a)表示了推理时候的流程图,X1X_1X1为content_audio的mel-spectrogram,Z1Z_1Z1X1X_1X1中的内容特征,U1U_1U1X1X_1X1中的语者特征,EcE_cEc表示抽取内容特征的content encoder,C1C_1C1是抽取出来的内容特征;X2X_2X2为speaker_audio的mel-spectrogram,Z2Z_2Z2X2X_2X2中的内容特征,U2U_2U2X2X_2X2中的语者特征,表EsE_sEs示抽取语者特征的speaker encoder,S2S_2S2是抽取出来的语者特征;DDD表示融合特征的decoder,X^1→2\hat{X}_{1 \rightarrow 2}X^12表示最终转换后的mel-spectrogram。

在图3-1(b)表示了训练时候的流程图,训练时,我们没有成对的数据,也就是没有两个人说同一句话的数据,所以没有了S2S_2S2,只有S1S_1S1。这个S1S_1S1并不是单个X1X_1X1经过EsE_sEs得到的,而是说X1X_1X1这句话的这个人说的所有的话,分别经过EsE_sEs之后,取平均得到的,也就是在训练之前就已经确定了的。X^1→1\hat{X}_{1 \rightarrow 1}X^11表示自重建之后的梅尔频谱,我们希望它与X1X_1X1越接近越好。

作者在decoder(DDD)这里还加了一个postnetwork,这个网络起到一个修正的作用,其输入是X^1→2\hat{X}_{1 \rightarrow 2}X^12,输出是R^1→2\hat{R}_{1 \rightarrow 2}R^12,看这个用来表示的符号也可以猜出来,是残差的意思。有了残差之后,最终的结果为

X^final1→2=X^1→2+R^1→2(3-1)\hat{X}_{final \ 1 \rightarrow 2} = \hat{X}_{1 \rightarrow 2} + \hat{R}_{1 \rightarrow 2} \tag{3-1} X^final 12=X^12+R^12(3-1)

训练时的Loss由三部分构成

自重建损失其一:
Lrecon=E[∣∣X^1→1−X1∣∣22](3-2)L_{recon} = E[|| \hat{X}_{1 \rightarrow 1} - X_1 ||^2_2] \tag{3-2} Lrecon=E[X^11X122](3-2)

自重建损失其二:
Lrecon0=E[∣∣X^final1→1−X1∣∣22](3-3)L_{recon0} = E[|| \hat{X}_{final \ 1 \rightarrow 1} - X_1 ||^2_2] \tag{3-3} Lrecon0=E[X^final 11X122](3-3)

内容损失:
Lcontent=E[∣∣Ec(X^final1→1)−C1∣∣1](3-4)L_{content} = E[|| E_c(\hat{X}_{final \ 1 \rightarrow 1}) - C_1 ||_1] \tag{3-4} Lcontent=E[Ec(X^final 11)C11](3-4)

总的损失为
L=Lrecon+μLrecon0+λLcontent(3-5)L = L_{recon} + \mu L_{recon0} + \lambda L_{content} \tag{3-5} L=Lrecon+μLrecon0+λLcontent(3-5)

其中,μ\muμλ\lambdaλ时用来调整不同loss之间权重的超参数。这些loss都是保证了模型的自重建能力。

3.4 Vocoder

Vocoder的作用是将梅尔频谱还原回音频信号,正常情况下,这个模型不用替换。原文中使用的是wavenet,但是wavenet的速度太慢了,一个5秒的音频要15分钟才能跑出来,这根本没法用。

开源之后,作者又提供了训练好的hifi-gan作为vocoder,hifi-gan就比wavenet快很多了,效果也是不错的。只是会有一些电音。这个也可以自己finue-tune一下,不过要训练hifi-gan的话,get_mel这里也要注意一致性的问题。

4 关键部分

有人可能会质疑,为什么这样训练出来的C1C_1C1就是内容的特征,就算S1S_1S1是干净的语者的特征,C1C_1C1里就不会也参杂一点语者的特征吗?

原文中也对这个问题进行了说明,列了一些假设。大前提是S1S_1S1是干净的语者特征。

我这里不求甚解,只把直观的理解说明一下。要保证C1C_1C1只有内容特征,且是完整的内容特征的方法是,控制C1C_1C1的维度。开源代码中,这个维度是32维。
autovc关键部分说明图

图3-2 AutoVC关键部分说明图

如图3-2所示,如果C1C_1C1的维度太大的话,如(a),会把语者的特征也包括进去,这个时候对自重建能力是没有影响的,但是如果拿C1C_1C1去训练一个speaker classification模型的话,模型的准确率就会比较高;如果C1C_1C1的维度太小的话,如(b),最终自重建出来的误差会比较大;如果C1C_1C1的维度刚刚好的话,如©,是的自重建误差也比较小,用C1C_1C1去训练一个speaker classification模型的准确率也比较小。

作者就是按这种方式来确定,下表就是不同C1C_1C1维度下,得到的自重建误差和语者分类器准确率的表。
不同维度下自重建误差和语者分类准确率

参考资料

[1] AUTOVC: Zero-Shot Voice Style Transfer with Only Autoencoder Loss
[2] https://github.com/auspicious3000/autovc
[3] https://github.com/babysor/MockingBird
[4] https://github.com/jik876/hifi-gan

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

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

相关文章

二十五、PHP框架Laravel学习笔记——模型的一对一关联

一.关联概念 关联模型,即:两张或以上的表进行一定规则的绑定关联;比如:一个学生(学生表)对应一张个人信息卡(信息表),这种就是一对一;再比如:一篇博文(帖子表)对应多个评论(评论表)…

小工具:基于颜色的视频和图片切割

文章目录1 前言2 方案简述3 效果1 前言 最近做一个短视频相关的项目的时候,发现输入的视频有很多是有黑边的,有些可能是白边或者其他颜色的边。这对下游的模型处理有很大的影响。于是就写了一个自动判断填充边的颜色,并根据该颜色自动切割视…

二十六、PHP框架Laravel学习笔记——模型的一对多关联

二.一对多关联 一对多关联,本质上使用方法和一对一关联类似,内部实现略有不同; 创建另一个模型:book.php,我们看下这个表数据; PS:这里 user_id19 有三个,也就是蜡笔小…

论文阅读 - An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale

文章目录1 概述2 方法简述2.1 encoder之前2.2 encoder之后3 实验结果参考资料1 概述 这篇论文是一篇将tranformer引入到图像领域的里程碑式的文章。因为这是第一次在处理图像时,将所有的卷积模块统统抛弃,只使用attention。并且实验证明了只用attention…

python五子棋人机对战_Python:游戏:五子棋之人机对战

原标题:Python:游戏:五子棋之人机对战 开端 画棋盘 首先肯定是要画出棋盘来,用 pygame 画出一个 19 19 或 15 15 的棋盘并不是什么难事,这在之前的文章中已经多次用到,就不赘述了。 画棋子 需要说一下的是…

二十七、PHP框架Laravel学习笔记——模型的多对多关联

二.多对多关联 多对多关联,比前面两种要复杂一些,需要一张中间表,共三张; (1) .users:用户表; (2) .roles:权限表; (3) .role_user:中间表:默…

论文阅读 - Is Space-Time Attention All You Need for Video Understanding?

文章目录1 概述2 模型结构2.1 模型输入2.2 attention模块2.3 分类模块3 模型分析3.1 不同attention方式3.2 不同的输入3.3 不同的模型3.4 不同的预训练数据3.5 不同的数据量3.6 position embedding的影响3.7 长输入时长3.8 不同的transformer3.9 不同的patch size3.10 attentio…

iOS中常见的6种传值方式,UIPageViewController

通过属性传值、方法传值、代理传值、Block传值、单例传值、通知传值6种方式进行不同视图之间的传值。不同方式只需要在AppDelegate中更改下UINavigationController的根控制器即可。使用很简单的实例让你很快理解不同的传值方式。 UIPageViewController(上传者:JoneJ…

websocket 获取ip_Spark+Kafka+WebSocket+eCharts实时分析-完全记录(1)

本系列内容:Kafka环境搭建与测试Python生产者/消费者测试Spark接收Kafka消息处理,然后回传到KafkaFlask引入消费者WebSocket实时显示版本:spark-2.4.3-bin-hadoop2.7.tgzkafka_2.11-2.1.0.tgz------------------------第1小节:Kaf…

二十八、PHP框架Laravel学习笔记——模型的关联查询

二.关联查询 前几篇博文,了解了三种基础的关联模型,并简单的进行查询;本节课,我们详细的了解更多的查询方案; //下面两种查询是一样的; $books User::find(19)->book; $books User::fin…

搞懂CRF

文章目录1 前言2 Log-linear model3 MEMM3.1 模型概述3.2 label bias问题4 CRF4.1 模型概述4.2 模型训练4.3 模型解码4.4 小结参考资料1 前言 条件随机场(conditional random field, CRF)是在建立序列模型时的常用模块,它的本质就是描述观测到的序列xˉ\bar{x}xˉ对…

skywalking 安装_SkyWalking全链路追踪利器

随着目前系统架构的复杂度越来越高(中台、微服务),并且线上应用的多级监控覆盖到了通讯、应用处理过程监控并且实现端到端的应用监测,线上性能故障的快速定位修复;而传统的监控分析方式已经无法满足我们的需求,因此许多强大的APM工…

二十九、PHP框架Laravel学习笔记——Debugbar 调试器

二.安装使用 通过 composer 在项目中安装 Debugbar,命令如下: composer require barryvdh/laravel-debugbar 生成一个配置文件,给用户配置,可以根据需求进行配置; php artisan vendor:publish --provider…

论文阅读 - Video Swin Transformer

文章目录1 概述2 模型介绍2.1 整体架构2.1.1 backbone2.1.2 head2.2 模块详述2.2.1 Patch Partition2.2.2 3D Patch Merging2.2.3 W-MSA2.2.4 SW-MSA2.2.5 Relative Position Bias3 模型效果参考资料1 概述 Vision Transformer是transformer应用到图像领域的一个里程碑&#x…

rocketmq queue_RocketMQ 实战(三) - 消息的有序性

■ RocketMQ有序消息的使用1 为什么需要消息的有序性比如用户张三终于挣了一百存在在银行卡里存取款,对应两个异步的短信消息,肯定要保证先存后取吧,不然都没钱怎么发了取钱的消息呢! M1 - 存钱 M2 - 取钱而mq默认发消息到不同q显然是行不通的,会乱序 需要发往同一个q,先进先出…

三十、PHP框架Laravel学习笔记——模型的预加载

一.预加载 预加载,就是解决关联查询中产生的 N1 次查询带来的资源消耗我们要获取所有书籍的作者(或拥有者),普通查询方案如下: //获取所有书籍列表 $books Book::all(); //遍历每一本书 foreach ($books as $book) { //每一本…

论文阅读:Spatial Transformer Networks

文章目录1 概述2 模型说明2.1 Localisation Network2.2 Parameterised Sampling Grid3 模型效果参考资料1 概述 CNN的机理使得CNN在处理图像时可以做到transition invariant,却没法做到scaling invariant和rotation invariant。即使是现在火热的transformer搭建的图…

dataframe 排序_疯狂Spark之DataFrame创建方式详解一(九)

创建DataFrame的几种方式1、读取json格式的文件创建DataFrame注意:1. json文件中的json数据不能嵌套json格式数据。2. DataFrame是一个一个Row类型的RDD,df.rdd()/df.javaRdd()。3. 可以两种方式读取json格式的文件。4. df.show()默认显示前20行数据。5.…

【原】npm 常用命令详解

今年上半年在学习gulp的使用,对npm的掌握是必不可少的,经常到npm官网查询文档让我感到不爽,还不如整理了一些常用的命令到自己博客上,于是根据自己的理解简单翻译过来,终于有点输出,想学习npm这块的朋友不可…