音频模型_HiFiGAN源码解析1

1. 理论分析

1.1 生成对抗网络 (GAN)

AI顶尖成果,其思想很多极简,甚至简单到不可思议。

比如,ResNet残差网络:

> y = f(x) + x

大概意思就是每一层或块都有个旁路,不用计算(+x)。


而GAN也类似:

> y = G(x) ;   0,1 = D(y, y’)

- 这里有两个网络(G和D), G 完成上采样,生成内容,D判别生成的内容真 (1) or  假 (0)。

- D的作用就是帮助G训练,由于G是上采样,相比分类等下采样任务难训练的多。

- 训练完成后,D就没什么用了,这个时候D分别不出图像的真假。

通过D的辅助交替训练,我们得到一个强大的生成模型G。

1.2 HiFiGAN前期工作:

HiFiGAN是用梅尔谱mel-spectrogram 生成音频的生成模型,前期工作如下:

一个随机生成音频的模型,潜码不一定是mel谱,可以有条件地加入语言学(linguistic)和声学(acoustic)的特征。

 1.类PixelCNN的自回归模型,提出因果卷积网络(Causal Convolutional Networks),使得当前生成样本依赖于之前的样本。

 2.门控激活单元 (Gated Activation Units), 保证数据的时序特征

 3.加入ResNet结构,来确保较深的网络性能,超越过去的隐马尔可夫(HMM)和循环神经网络(LSTM)等参数模型

注意:原版的wavenet代码只能自回归式的随机连续生成音频,其通过输入之前时刻的音频输出下一个时刻音频, 因此不能控制输出的内容。

修改后的wavenet,主要是加入局部条件(音素的语义) 和 **全局条件(某位人声的ID)**来完成TTS或VC, 即加入了mel谱预测器的wavenet,名为 Tacotron-2 (Natural TTS Synthesis by Conditioning WaveNet on Mel Spectrogram Predictions
ICASSP 2018)

The Affine Coupling Layer in WaveGlow:

  • Splits the input into two parts.
  • Transforms one part using scaling and translation terms derived from the other part and a conditioning signal (mel-spectrogram).
  • Recombines the transformed components to produce the output.
  • Preserves invertibility, allowing the original input to be recovered from the output.

By conditioning on the mel-spectrogram, WaveGlow can generate high-quality, spectrally accurate speech, leveraging the flexibility and power of affine coupling layers within its flow-based generative framework.

这个是在wavenet中加入流模型,通过网络结构实现(仿射耦合层):

1. 训练模型通过最大化对数似然,  学习输入输出的正向变换和逆向变换参数,推理用逆向变换实现高斯分布样本生成音频分布样本。

  2.条件生成:mel 频谱图作为条件输入, 确保了生成的音频符合期望的频谱特征。

在仿射耦合层内部,数据会被分为两个部分 a和b:

1. a进行条件化变换,融合mel,得到参数s,t 
2. b通过s,t进行仿射变换
3. 将a和反射变换b’拼接,形成输出

在仿射耦合层中结合 mel 频谱图,并从简单的高斯分布转换为复杂的语音分布。

GAN结构的生成模型,HiFiGAN的前一份工作

1. 生成器为4个膨胀卷积块(Dilated conv block), 输入Mel谱,输出音频(waveform)

  2. 判别器设计为3个独立网络,以完成多尺度判别。

    - 对音频完成2倍和4倍下采样(用痴化pooling)

    - 不同下采样尺度的特征,有不同纬度的信息

    - 窗口片段判别,而非完整音频判别(window-based objective)

MelGAN 和 HiFiGAN都用了多尺度判别器,动机是: 原始尺度的音频(D1)包含完整的频率信息,包括高频和低频。而下采样后的音频(D2 和 D3)逐步丢失高频成分,保留更多的低频成分。这样一来,D2 和 D3 鉴别器更偏向于学习低频特征,而 D1 可以学习到全面的特征。

2. 环境和参数配置

2.1 环境配置文件:

  • requirements.txt

    python所需要的包

  • env.py

代码如下:

class AttrDict(dict):
    def __init__(self, *args, **kwargs):
        super(AttrDict, self).__init__(*args, **kwargs)
        self.__dict__ = self


def build_env(config, config_name, path):
    t_path = os.path.join(path, config_name)
    if config != t_path:
        os.makedirs(path, exist_ok=True)
        shutil.copyfile(config, os.path.join(path, config_name))

* AttrDict : 常见类,提供以访问对象属性的方式操作字典的键。
* build_env: 函数,将配置文件复制到指定的目录并在必要时创建目录。
  • utils.py

    工具包文件

2.2 参数配置文件:

config.json: 有 config_v1到v3三个配置文件,文件结构和内容相同,仅少量参数值不同,用于消融实验

  • 模型架构参数
* resblock: "1"
    * 指定残差块(ResBlock)类型, 有 “1” 和 “2”

* upsample_rates: [8,8,2,2]
    * 生成器网络中各个块之间的上采样倍率。例如,8x是将音频的时序长度扩大 8 倍。

* upsample_kernel_sizes: [16,16,4,4]
    * 上采样卷积层的卷积核大小。卷积核大小与 upsample_rates 一致。

* upsample_initial_channel: 512
    * 上采样网络的初始通道数,上采样开始时的特征图通道数量,影响模型的计算复杂度和能力。

* resblock_kernel_sizes: [3,7,11]
    * 残差块中不同卷积层的卷积核大小, 控制残差块的感受野大小,影响模型在生成音频时捕捉长短期特征的能力。

* resblock_dilation_sizes: [[1,3,5], [1,3,5], [1,3,5]]
    * 残差块中每一层的膨胀系数。通过膨胀卷积(dilated convolution),扩展卷积核的感受野,增强模型在不同尺度上捕捉特征的能力。
  • 数据与训练参数
* num_gpus: 0
    * 含义: 训练的 GPU 的数量。

* batch_size: 16
    * 含义: 每次训练迭代中使用的样本数量。较大batch_size需要更多显存,有助于稳定梯度更新。

* learning_rate: 0.0002
    * 含义: 模型训练的学习率,用于控制模型参数在每次梯度更新中的调整步幅。
较低的学习率可以细致地调整参数,较高的学习率则可以加速收敛。

* adam_b1: 0.8
    * Adam 优化器的 一阶动量估计。值越大,历史梯度信息的影响越大,可平滑参数更新。
    * 0.8 - 0.9为常用范围。适合大多数任务,尤其是复杂的深度学习模型。
    * adam_b1过小会出现非常高的抖动。

* adam_b2: 0.99
    *  Adam 优化器的 二阶动量估计。控制梯度方差的指数衰减率
    *  值越大,之前的梯度平方信息对当前更新的影响越大,可平滑掉极端的梯度变化,帮助在有噪声的梯度中稳定学习。
    * 0.999为常用值,适用于大多数深度学习任务,特别是当模型对梯度变化非常敏感时,降低 β2 可以加速收敛。

* lr_decay: 0.999
    * 学习率衰减率,在每次训练迭代后,学习率会乘以这个衰减因子,逐渐减小学习率,帮助模型在接近收敛时更稳定地微调。

* seed: 1234
    *  随机种子,用于初始化随机数生成器,以保证实验的可重复性。

* segment_size: 8192
    * 每次输入到模型中的音频片段的大小,控制计算内存。

* num_mels: 80
    * Mel 频谱的频带数量,决定音频转换成 Mel 频谱时的分辨率,影响生成音频的质量。

* num_freq: 1025
    * 控制 STFT(短时傅里叶变换)后频谱的频率分辨率。

* n_fft: 1024
    * STFT 中使用的 FFT(快速傅里叶变换)大小。决定 FFT 的分辨率和计算量,影响频谱的频率细节。

* hop_size: 256
    * STFT 的跳跃大小(窗口的滑动步长),控制频谱的时间分辨率,影响音频的时间特性捕捉。

* win_size: 1024
    * STFT 的窗口大小,决定每次进行 FFT 计算时的信号段长度,影响频谱的平滑度和分辨率。

* sampling_rate: 22050
    * 音频信号的采样率(每秒采样的点数),定义音频数据的分辨率,影响生成和处理的音频质量。

* fmin: 0
    * Mel 频谱的最小频率,决定 Mel 频谱的频率范围的下限,影响低频特征的捕捉。

* fmax: 8000
    * Mel 频谱的最大频率,决定 Mel 频谱的频率范围的上限,影响高频特征的捕捉。

* fmax_for_loss: null
    * 含义: 用于损失计算的最大频率,指定损失函数中考虑的频率上限。设置为 null 表示使用默认的频率范围。

* num_workers: 4
    * 数据加载时使用的线程数量,影响数据加载的并行度,windows单机时需要设为0。
  • 分布式训练参数
* dist_backend
    * 指定用于分布式训练的后端通信库。nccl 是 NVIDIA 提供的用于 GPU 间高效通信的库。

* dist_url
    * 分布式训练中各节点之间的通信地址,用于初始化分布式训练。

* world_size
    * 分布式训练中参与的节点总数。1 表示单机训练。
  • 16
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值