1. 理论分析
1.1 生成对抗网络 (GAN)
AI顶尖成果,其思想很多极简,甚至简单到不可思议。
比如,ResNet残差网络:
> y = f(x) + x
大概意思就是每一层或块都有个旁路,不用计算(+x)。
而GAN也类似:
> G(x) = y ; D(y, y’) = 0,1
- 这里有两个网络(G和D),
- G 完成上采样(扩展特征、升维),生成内容通过输入mel谱(x) 输出音频wave(y)。
- D 完成下采样(压缩特征、降维),判别生成内容为 真 (1) or 假 (0)。
- D的作用就是帮助G训练,由于G是上采样,相比分类等下采样任务难训练的多。
- 训练完成后,D就没什么用了,这个时候D分别不出图像的真假。
通过G和D交替训练,我们得到一个强大的生成模型G。
1.2 HiFiGAN前期工作:
HiFiGAN是用梅尔谱mel-spectrogram 生成音频的生成模型,前期工作如下:
- WaveNet (2016 SSW Workshop)
一个随机生成音频的模型,潜码不一定是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)
- WaveGlow (ICASSP 2019)
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 频谱图,并从简单的高斯分布转换为复杂的语音分布。
- MelGAN (NeurIPS 2019)
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 表示单机训练。