笔者最近对基于Gan的神经网络Vocoder进行了一系列实验。 简单做一下总结并提出一些列疑问,一起与行业大佬探讨遇到的问题。

先来看melgan的模型结构,包括两部分: Generator(生成器) 和 Discriminator(判别器)。

Generator

输入为mel-spectrogram,输出为raw waveform. 从 mel-spectrogram到 audio的过程很显然是一个上采样的过程。

这里的上采样是由一维反卷积(transpose1d)实现的,上采样的倍数如何确定呢?

需要注意一下,上采样的倍数是由hop_size来决定的,为什么呢?

需要明白一点,mel帧数 * 帧移 = 音频长度(采样点个数,可换算为音频时长,具体怎么做不用说了吧)

因此,对于22050采样率, hopsize大小设置为256, 那么对应的mel-spectrogram需要上采样 256倍

如果是16000采样率呢? 使用帧长是50ms,帧移 12.5ms 那么hopsize就是200啦,所以上采样倍数就是200倍啦.

搞清楚了这些,那么Generator Upsampling层中的上采样倍数也就好理解了,22050的采样倍数为 8 X 8 X 2 X 2 = 256

图1 melgan模型结构

另外一点需要搞清楚的是反卷积是如何做上采样的?

如果有人不明白反卷积(上采样)是如何工作的,那就看一下这篇文章《Understanding transpose-convolutions》,里面通过卷积矩阵的方式来讲解了卷积运算和反卷积运算的过程。

上采样的方法有很多种,除了反卷积之外,还有最近邻、双线性插值等,这些方法在Wave net的实现里也都用到了。具体算法实现,自行研究。

每一层Upsampling Layer之后会接一层的RedidualStack(由三层的dilatend 一维卷积构成), ResidualStack层通过三层不同dilation系数(1,3,9)的空洞卷积获得了大小为27的感受野,来扩大时域上的感知能力,能够更好的建模时域上的长距离依赖关系。

Generator网络的最后一层是一个一维卷积层 + tanh函数,输出范围为-[1,1], 满足音频的数值点的取值范围。该层的输出通道数为1,这里的通道数对应的输出的是全波段音频(full band),这里就与后续要讲的multi-band melgan模型Generator的区别.

最后一点,棋盘效应(checkerboard artifacts). 具体什么是棋盘效应,及如何减弱棋盘效应导致的音频高频镜像问题(无法完全解决),请查看这篇博文. 如果选择的卷积核与stride大小不合适,会产生严重的棋盘效应,体现在音频频谱上就是高频横纹比较多,音质上滋滋的电流声(如有不对,欢迎讨论)。

讲完了Generator, 我们再来说说Discriminator.

Discriminator

论文提出了multi-scale的discriminator, 基于的假设是每个scale的discriminator可以学习到不同频率段的音频的特征。

每个discriminator的网络结构是由前后各一层1维卷积 和 4层分组卷积构成的downsampling layer构成. discriminator输入是由ground truth的音频和gererator生成的fake音频两部分构成的。 输入维度为[B, T, 1], 输出维度也是[B,T,1], 中间变换的只是通道数的变化, 最后一层的输出和倒数第二层卷积网络的输出被分别用来计算 featuremap 和 feature_score, 这两部分被用来计算 generator的feature_matching_loss(L1_loss) 和discriminator的mse_loss

.上面我们知道了Generator输入mel-spectrogram,生成音频audio, 这个音频可以表示为G (s), s为mel-spectrogram. 判别器要判断生成器生成音频的真假,这里就涉及到Gan模型的原理啦,

Generator输入mel-spectrogram生成音频(fake), Discriminator输入真(real)音频和假(fake)音频,学习一个二分类器(可以这么理解),这里使用的是mse损失来最小化real与1的差异,fake与0的差异。

通过对抗学习,使得generator生成的音频达到判别器无法判断真假的效果(loss接近0.5)。

这就是melgan学习训练的过程。

几点总结

1 生成音频的时候(推理),只用Generator。discriminator只在训练过程中辅助学习。

2 Gan模型的训练,generator 和 discriminator是交替训练的,先固定discriminator,训练generator一个step,然后固定generator,训练discriminator一个step.

3 训练过程会比较长,单卡V100 GPU,能跑半个月,这个后续如果替换featurematching_loss为multi-resolution stft loss会缩短收敛时间。

4 训练过程中间生成的音频最开始会有很严重的棋盘效用,随着迭代次数增加,这种效用会慢慢减弱。

5 melgan音频高频部分details不明显,会有发音抖动和沙沙的底噪,此问题比较严重。

给出一个采样率为16KHZ的样例,此样例为melgan ground truth训练中生成的音频频谱。

MelGan原理与实践篇相关推荐

  1. 我用 Redis 干掉了一摞简历

    如果你是一位后端工程师,面试时八成会被问到 Redis,特别是那些大型互联网公司,不仅要求面试者能简单使用 Redis,还要深入理解其底层实现原理,具备解决常见问题的能力.可以说,熟练使用 Redis ...

  2. 死磕 Redis,我有这么几招

    如果你是一位后端工程师,面试时八成会被问到 Redis,特别是那些大型互联网公司,不仅要求面试者能简单使用 Redis,还要深入理解其底层实现原理,具备解决常见问题的能力.可以说,熟练使用 Redis ...

  3. K8s项目实战笔记 图文并茂带你深度解析Kubernetes

    一.前言 Kubernetes(简称K8S)是开源的容器集群管理系统,可以实现容器集群的自动化部署.自动扩缩容.维护等功能.它既是一款容器编排工具,也是全新的基于容器技术的分布式架构领先方案.在Doc ...

  4. 《Java并发编程之美》

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yAwEsYPZ-1661534116043)(img/\1625573175405.jpg)] [外链图片转存失败,源站 ...

  5. Redis有啥可牛的?

    如果你是一位后端工程师,面试时八成会被问到 Redis,特别是那些大型互联网公司,不仅要求面试者能简单使用 Redis,还要深入理解其底层实现原理,具备解决常见问题的能力.可以说,熟练使用 Redis ...

  6. 阿里P8架构师力荐K8s项目实战笔记 图文并茂带你深度解析Kubernetes

    一.前言 Kubernetes(简称K8S)是开源的容器集群管理系统,可以实现容器集群的自动化部署.自动扩缩容.维护等功能.它既是一款容器编排工具,也是全新的基于容器技术的分布式架构领先方案.在Doc ...

  7. AutoSAR系列讲解(实践篇)8.5-C/S原理进阶

    AutoSAR系列讲解(实践篇)8.5-C/S原理进阶 C/S原理进阶 一.同步调用 二.异步调用 1.带时限(Timeout) 2.循环等待(Polling) 3.触发(Trigger) C/S原理 ...

  8. SVM -支持向量机原理与实践之实践篇

    SVM -支持向量机原理与实践之实践篇 前言 最近太忙,这几天还是抽空完成实践篇,毕竟所有理论都是为实践服务的,上一篇花了很大篇幅从小白的角度详细的分析了SVM支持向量积的原理,当然还有很多内容没有涉 ...

  9. AutoSAR系列讲解(实践篇)7.5-OS原理进阶(上)

    AutoSAR系列讲解(实践篇)7.5-OS原理进阶(上) OS原理进阶(上) 一.Tasks 1.基础任务(Basic Task) 2.扩展任务(Extended Task) 二.Alarms 三. ...

最新文章

  1. 油管博主路透 3080Ti 参数、黄教主烤箱中拿出 DGX A100 预热发布会
  2. jittor和pytorch生成网络对比之unit
  3. 中间表增加额外字段_知识分享 I 这样显示报表筛选字段 你学会了吗
  4. 一个C#程序员学习微信小程序的笔记
  5. 遗传算法求最短路径(旅行商问题)python实现
  6. python文件字符串操作
  7. 麦克风设计指导与选型参考
  8. v html是双向绑定吗,vue自定v-model实现表单数据双向绑定问题
  9. tlwr886n发挥最大网速_路由器中的2.4G和5G有什么区别?用错了网速变“龟速”
  10. Hibernate关联关系映射-----单向一对一映射配置
  11. angular--Observable总结
  12. 数据库系统原理设计题和综合体
  13. 【转】使用C语言实现MD5消息摘要算法
  14. 我行我素购物管理系统(面向对象)
  15. Linux设备模型分析之bus(基于3.10.1内核)
  16. java学习笔记(8) 第8章(下)- 面向对象编程(中级部分) - 练习题
  17. domoticz添加和风天气,让domoticz显示天气信息
  18. c语言fgetc函数_C语言中的fgetc()函数与示例
  19. 中台战略-建中台与拆中台
  20. 三子棋游戏(支持多子棋)

热门文章

  1. java run_javarun
  2. 空间计量模型_Stata中的空间计量回归模型应用
  3. c位边上还有什么位_站c位是什么位置?众女星合影惠英红C位童瑶站边角,惠英红为何能站C位?...
  4. 在react next 中使用rem_CSS中的rem:了解和使用rem单位
  5. Mac OS 10.12使用U盘重装(转)
  6. 微信小程序之购物车功能
  7. 阿里巴巴B2B高效研发管理实践
  8. Git学习笔记一--创建版本库、添加文件、提交文件等
  9. Python(6)——Django之hello python模板视图
  10. Android进程级别