您的位置 首页 PyTorch 项目

PyTorch 实现 Wavenet

PyTorch入门实战教程

WaveNet: A Generative Model for Raw Audio 是 DeepMind 所提出的一种用于声音的生成模型,例如最近发布的CLOUD TEXT-TO-SPEECH用的模型架构就是以这个为基础,还有Making a Neural Synthesizer Instrument里面都有用上类似 WaveNet 的结构。

Autoregressive model

统计上常用来处理时间序列的方法,用过去历史资料 \(1:t-1\) 来预测现在\(t\) ,可以看成过去的自己对现在的自己做回归,所以被称为自回归模型。

本模型也是用过去的声音讯号来预测现在的讯号点,这样的缺点是要生成新样本的时候效率很差,因为资料有序列关系,总是要等待前面产生,才可以依序产生新的点,算是这类模型的问题。

Fully observed model

本模型没有任何的Latent variable,没有需要估计或是近似的未知变量,任何资讯都是完全可见的,都是从过去历史资料来的,这样的模型架构上更为直接简单,不需要处理隐变量问题,用上繁琐的近似演算法等等,而可以直接做MLE训练。

Implement and Tricks

我的实现版本,以Pytorch实现,仅有针对单一人语音训练,没有做多人训练或是TTS等,但实作上相对透明简单,可以比较深入看看实现过程。

Causal & Dilated Conv1d


图片来源:WaveNet: A Generative Model for Raw Audio

  • Causal:不能用到未来的资讯,例如在实作PixelCNN时,要把Kernel的一部分mask起来,但是在本实作1D conv时,Kernel直接是2,意思为要预测\(x_t\) 时,仅用到 \(x_{t-2}\) 与 \(x_{t-1}\) ,不过要记得把最后一个时间去掉。
  • Dilated:让Kernel看远一点,不要只看邻居,如果Dilated设定大一些时,就会看 \(x_t\) 与\(x_{t-N}\) ,大幅增加视野域,我猜音讯邻近的时间点值都差不多,不如看远一点可能会有比较多变化,提供模型更多有用讯息;建议参考这篇来了解Dilated Conv。

Residual & Stack block


图片来源:ご注文は机械学习ですか


图片来源:WaveNet: A Generative Model for Raw Audio

  • 模型以多个Block堆叠在一起,每个Block含有多个Dilated Conv,并且加入Residual link来帮助梯度传递。
  • 把每一个Block的输出汇集并加起来,每个Block计算视野不同,越往上层越大,代表资料不同的resolution,最后加总在经过转换输出得到下一个时间点的预测。

Data processing & Training

  • VCTK资料集有多人的语音与文字内容,可以用来训练TTS系统。
  • 语音资料处理我用上torchaudiolibrosa,但不知道为什么用两个套件读出来的有点差异,我最后用librosa来读取音讯,还有把无声部分去掉,这个步骤非常重要!不然训练到最后只会一直产生静音,再用torchaudio做Mulaw encoding。
  • 训练batch size为1,一次给一段语音来训练,基本上因为训练资料长度差异很大,要做padding很浪费与不好做,再且显卡记忆体也不够大,所以一次训练一个语音档是合理的做法。
  • 训练大概要2天,而且颇慢的,建议做learning rate scheduling从0.001往下到0.00001,我训练在p225这个语音上,最后得到loss约2左右,可以得到还可以的结果。
  • 计算视野其实蛮简单,就喂给模型资料来测试看多长的资料,模型刚好输出为1,就是模型的视野,代表要预测下一个时间点,需要往前看多长的资料。
  • 产生新样本非常慢的,请耐心等待,所以这一篇顶多只能说是开一个研究开头,而且也无法直接做到TTS或其他应用,而是一个好的音讯产生网路结构,后续很多声音产生都是基于此。

代码实现

大家可以在这里找到代码实现。

文章来源:odie’s whisper

PyTorch入门实战教程

发表评论

电子邮件地址不会被公开。 必填项已用*标注

返回顶部