菜单

模型训练

相关源文件

本文档提供了训练Real-Time Voice Cloning系统中每个组件的详细说明。它涵盖了三个主要模型的训练过程:说话人编码器(Speaker Encoder)、合成器(Synthesizer,Tacotron 2)和声码器(Vocoder,WaveRNN)。有关训练前数据预处理的信息,请参阅数据预处理

训练流程概述

SV2TTS框架需要按顺序训练三个模型,因为每个模型的输出都将作为下一个模型训练的输入。

来源: encoder_train.py synthesizer_train.py synthesizer_preprocess_embeds.py vocoder_preprocess.py vocoder_train.py

先决条件

在训练任何模型之前,请确保您已

  1. 完成了数据预处理中描述的数据预处理步骤
  2. 拥有充足的计算资源(所有训练阶段均建议使用GPU)
  3. 安装了所需的依赖项和库

训练说话人编码器

说话人编码器将语音样本转换为捕捉说话人身份的固定长度嵌入。

数据要求

编码器需要大量的说话人数据进行训练

  • 来自许多不同说话人的多个语音片段
  • 常用数据集:LibriSpeech、VoxCeleb1、VoxCeleb2
  • 使用 encoder_preprocess.py 预处理成梅尔频谱图

训练命令

python encoder_train.py <run_id> <clean_data_root> -m <models_dir> [options]

主要参数

  • run_id:本次训练的唯一标识符
  • clean_data_root:预处理后的编码器数据路径
  • -m/--models_dir:保存模型权重的目录(默认为 "saved_models")
  • -v/--vis_every:损失更新之间的步数(默认为 10)
  • -u/--umap_every:嵌入可视化更新之间的步数(默认为 100)
  • -s/--save_every:模型保存之间的步数(默认为 500)
  • -f/--force_restart:强制从头开始训练

训练过程

编码器训练

  • 使用GE2E(Generalized End-to-End)损失进行对比学习
  • 创建包含多个说话人的多个语音片段的批次
  • 将语音片段投影到嵌入空间,同时优化说话人区分度
  • 使用UMAP投影可视化嵌入,以监控训练质量

来源: encoder_train.py encoder/train.py encoder/data_objects/speaker_verification_dataset.py10-56 encoder/visualizations.py

训练合成器

合成器(Tacotron 2)根据说话人嵌入,从文本生成梅尔频谱图。

数据要求

在训练合成器之前

  1. 使用 synthesizer_preprocess_audio.py 准备带有文本的音频数据
  2. 使用 synthesizer_preprocess_embeds.py 生成说话人嵌入

训练命令

python synthesizer_train.py <run_id> <syn_dir> -m <models_dir> [options]

主要参数

  • run_id:本次训练的唯一标识符
  • syn_dir:预处理的合成器数据路径
  • -m/--models_dir:保存模型权重的目录(默认为 "saved_models")
  • -s/--save_every:模型保存之间的步数(默认为 1000)
  • -b/--backup_every:模型备份之间的步数(默认为 25000)
  • -f/--force_restart:强制从头开始训练
  • --hparams:通过逗号分隔的 name=value 对覆盖超参数

训练架构和流程

合成器训练

  • 遵循 hparams.tts_schedule 中定义的多个阶段的计划
  • 每个阶段都有不同的缩减因子、学习率和批次大小
  • 优化多个损失分量:梅尔重建(MSE + L1)、后处理梅尔(MSE)和停止标记预测(BCE)
  • 定期生成样本进行评估
  • 可视化注意力矩阵以监控对齐学习

来源: synthesizer_train.py synthesizer/train.py26-236 synthesizer/models/tacotron.py

训练声码器

声码器(WaveRNN)将梅尔频谱图转换为音频波形。

数据要求

有两种声码器训练方法

  1. 真实数据训练:使用真实音频的实际梅尔频谱图
  2. GTA训练:使用训练过的合成器生成的梅尔频谱图

对于GTA训练,首先生成对齐的梅尔频谱图

python vocoder_preprocess.py <datasets_root> -s <syn_model_fpath>

训练命令

python vocoder_train.py <run_id> <datasets_root> [options]

主要参数

  • run_id:本次训练的唯一标识符
  • datasets_root:数据集根目录的路径
  • -g/--ground_truth:在真实梅尔数据上训练(而不是GTA梅尔数据)
  • -s/--save_every:模型保存之间的步数(默认为 1000)
  • -b/--backup_every:模型备份之间的步数(默认为 25000)
  • -f/--force_restart:强制从头开始训练

训练过程

声码器训练

  • 使用原始音频波形或离散化物流混合(取决于模式)
  • 在具有相应梅尔帧的音频片段上进行训练
  • 定期生成音频样本以进行评估
  • 比其他组件需要更长的训练时间
  • WaveRNN架构结合了效率和高质量输出

来源: vocoder_train.py vocoder/train.py18-118 vocoder/models/fatchord_version.py

完整的训练工作流程

完整的训练工作流程需要按顺序执行以下步骤

步骤脚本目的关键产出
1encoder_preprocess.py准备编码器训练数据梅尔频谱图
2encoder_train.py训练说话人编码器encoder.pt
3synthesizer_preprocess_audio.py准备合成器数据梅尔频谱图+元数据
4synthesizer_preprocess_embeds.py创建说话人嵌入用于合成器的嵌入
5synthesizer_train.py训练合成器synthesizer.pt
6vocoder_preprocess.py创建GTA梅尔频谱图用于声码器的GTA梅尔数据
7vocoder_train.py训练声码器vocoder.pt

模型间数据流

训练最佳实践

  1. 渐进式训练:每个模型都训练到收敛后再进行下一步

  2. 检查点:以固定的间隔保存模型(通过 --save_every 配置)

  3. 验证:在训练过程中监控生成的样本以检测问题

  4. 资源管理:

    • 编码器训练:中等的GPU内存需求
    • 合成器训练:更高的GPU内存需求
    • 声码器训练:资源消耗最大,可能需要调整批次大小
  5. 超参数调整:

    • 编码器:关注每个说话人的语音片段数量和学习率
    • 合成器:调整缩减因子(r)和注意力参数
    • 声码器:根据可用资源调整批次大小和序列长度

来源: encoder_train.py synthesizer_train.py vocoder_train.py synthesizer_preprocess_embeds.py vocoder_preprocess.py

监控训练进度

每个模型都提供不同的方式来监控训练进度

  1. 说话人编码器:

    • 终端输出中的损失和等错误率(EER)指标
    • 嵌入空间的UMAP可视化(使用Visdom时)
    • 嵌入空间中的说话人聚类应随时间得到改善
  2. 合成器:

    • 训练过程中显示的损失值
    • 保存到磁盘的注意力矩阵(应显示对角线对齐)
    • 生成的梅尔频谱图和音频样本用于评估
  3. 声码器:

    • 终端输出中的损失指标
    • 在检查点生成的音频样本
    • 生成音频质量随时间的改善

训练完成时间因数据集大小和硬件而异

  • 编码器:在中档GPU上约1-2天
  • 合成器:根据数据集大小约3-7天
  • 声码器:最耗时,通常需要1-2周才能达到良好质量

来源: synthesizer/train.py237-258 vocoder/train.py116-117 encoder/visualizations.py103-155