[特殊字符]TTS Vocoder 训练实战:从配置 MelGAN / ParallelWaveGAN 到续训与微调的完整流程

发布时间:2026/9/6 18:55:05
[特殊字符]TTS Vocoder 训练实战:从配置 MelGAN / ParallelWaveGAN 到续训与微调的完整流程 TTS Vocoder 训练实战从配置 MelGAN / ParallelWaveGAN 到续训与微调的完整流程【免费下载链接】TTS - a deep learning toolkit for Text-to-Speech, battle-tested in research and production项目地址: https://gitcode.com/GitHub_Trending/tt/TTS本文以TTS/vocoder/README.md为主线系统讲解 TTS 仓库中 Vocoder 模块的训练方法如何准备数据、编写config.json、用train_vocoder.py启动训练、续训continue与微调restore的区别并深入源码剖析 GAN 训练循环中生成器/判别器交替更新、多损失组合与 PQMF 分带处理的实现细节帮助你在真实语料上独立训练并复现 MelGAN、ParallelWaveGAN 等声码器。一、Vocoder 模块的定位与模型清单TTS/vocoder/README.md开篇即点明该目录实现了一批声码器vocoder模型它们可以与其他 TTS 模型组合使用——即 TTS 声学模型负责输出 mel 频谱Vocoder 负责把频谱还原为波形。README 列出的早期实现为MelGANMultiBand-MelGANParallelWaveGANGAN-TTS当时仅实现了 Discriminator 部分从当前仓库的实际结构看模型清单已经明显扩大。TTS/vocoder/configs/目录下提供了 8 套独立配置melgan_config.py、multiband_melgan_config.py、parallel_wavegan_config.py、hifigan_config.py、univnet_config.py、wavernn_config.py、wavegrad_config.py、fullband_melgan_config.pyTTS/vocoder/models/目录下则对应实现了各模型的 generator 与 discriminator 类例如 melgan_generator.py、hifigan_discriminator.py、univnet_generator.py 等。README 还特别强调该框架“灵活且模块化but not too modular”——这一点在模型加载机制上有直接体现见第五节setup_model。二、训练数据准备把 wav 文件收进一个目录即可README 给出的第一步非常直接把所有 wav 文件收拢到一个文件夹然后把该文件夹路径填入config.json的data_path。这一步在源码中的对应实现是 TTS/vocoder/datasets/preprocess.pydef find_wav_files(data_path, file_extwav): wav_paths glob.glob(os.path.join(data_path, **, f*.{file_ext}), recursiveTrue) return wav_paths也就是说data_path下的 wav 文件会被递归查找不需要扁平结构。训练/验证集切分同样在这里完成def load_wav_data(data_path, eval_split_size, file_extwav): wav_paths find_wav_files(data_path, file_extfile_ext) assert len(wav_paths) 0, f [!] {data_path} is empty. np.random.seed(0) np.random.shuffle(wav_paths) return wav_paths[:eval_split_size], wav_paths[eval_split_size:]两点值得注意切分使用固定随机种子 0np.random.seed(0)因此同一数据集每次启动训练时的 train/eval 划分是一致的便于对比实验eval_split_size指定用于评估的样本数默认 10定义于 shared_configs.py 的BaseVocoderConfig其余全部参与训练。如果不想在线计算 mel 特征还可以走预计算特征路径训练入口 TTS/bin/train_vocoder.py 中当 config 存在非空的feature_path时会调用load_wav_feat_data(config.data_path, config.feature_path, config.eval_split_size)该函数会按文件名stem把 wav 与.npy特征文件一一配对并断言二者数量与命名一致。这一分支主要服务于需要量化波形特征的模型如 WaveRNN见preprocess.py中的preprocess_wav_files。三、配置文件体系三个层次继承下来的参数表Vocoder 配置采用 dataclass coqpit 的层次化设计全部继承链为BaseTrainingConfig (TTS.config) └── BaseVocoderConfig # 所有声码器共享 └── BaseGANVocoderConfig # GAN 类声码器共享 ├── MelganConfig / ParallelWaveganConfig / HifiganConfig / ...3.1 BaseVocoderConfig数据加载与基础训练参数定义于 TTS/vocoder/configs/shared_configs.py核心字段及默认值如下参数类型/默认值说明audioBaseAudioConfig音频处理器配置采样率、mel 参数等训练时据此构建AudioProcessordata_path训练数据根目录递归查找全部 wavfeature_pathNone预计算特征目录留空则在线计算特征seq_len1000训练时截取的声音片段长度各模型会覆盖如 MelGAN 为 8192pad_short0对短于seq_len的波形的额外 paddingconv_pad0针对频谱边缘卷积的额外 paddinguse_noise_augmentFalse是否对输入添加随机噪声增强use_cacheFalse是否把计算好的特征缓存在内存中RAM 不足可能 OOMeval_split_size10评估样本数epochs10000训练总轮数optimizerAdamW优化器名称optimizer_params{betas: [0.8, 0.99], weight_decay: 0.0}优化器超参注意默认 betas 是 (0.8, 0.99) 而非 (0.9, 0.999)3.2 BaseGANVocoderConfigGAN 训练与损失组合的“开关面板”GAN 类声码器的训练完全由一组开关 权重控制。每个use_*布尔位决定是否启用某项损失对应的*_loss_weight负责加权求和开关默认对应权重默认损失来源use_stft_lossTruestft_loss_weight 0ParallelWaveGAN 提出的多分辨率 STFT 损失use_subband_stft_lossTruesubband_stft_loss_weight 0MultiBand-MelGAN 的分带 STFT 损失use_mse_gan_lossTruemse_G_loss_weight 1MSE 型 GAN 损失use_hinge_gan_lossTruehinge_G_loss_weight 0Hinge GAN 损失与 MSE 二选一use_feat_match_lossTruefeat_match_loss_weight 100MelGAN 的特征匹配损失依赖能输出中间特征的判别器use_l1_spec_lossTruel1_spec_loss_weight 45HiFi-GAN 的 L1 频谱mel损失STFT 损失的多分辨率参数默认为{n_ffts: [1024, 2048, 512], hop_lengths: [120, 240, 50], win_lengths: [600, 1200, 240]}L1 频谱损失默认在 mel 域计算n_mels: 80, hop_length: 256, n_fft: 1024采样率 22050。除损失外BaseGANVocoderConfig还定义了 GAN 训练特有的优化器与调度器参数lr_gen 0.0002、lr_disc 0.0002各自的ExponentialLR学习率调度器gamma 0.999scheduler_after_epoch True梯度裁剪grad_clip [5, 5]对两个优化器各设阈值以及两个训练策略开关steps_to_start_discriminator默认 0前若干步只训生成器、推迟判别器启动diff_samples_for_G_and_D默认 False让判别器使用与生成器不同的样本对迭代变慢但某些情况下收敛更好use_pqmf默认 False启用 PQMF 进行多分带训练MultiBand-MelGAN 使用。3.3 以 MelganConfig 为例的完整配置以 TTS/vocoder/configs/melgan_config.py 为例它在上层开关基础上的默认值给出了一个可直接复用的训练起点dataclass class MelganConfig(BaseGANVocoderConfig): model: str melgan discriminator_model: str melgan_multiscale_discriminator discriminator_model_params: dict field( default_factorylambda: {base_channels: 16, max_channels: 1024, downsample_factors: [4, 4, 4, 4]} ) generator_model: str melgan_generator generator_model_params: dict field( default_factorylambda: {upsample_factors: [8, 8, 2, 2], num_res_blocks: 3} ) batch_size: int 16 seq_len: int 8192 pad_short: int 2000 use_noise_augment: bool True use_cache: bool True # 损失组合STFT MSE-GAN 特征匹配关闭 hinge 与 subband use_stft_loss: bool True use_subband_stft_loss: bool False use_mse_gan_loss: bool True use_hinge_gan_loss: bool False use_feat_match_loss: bool True stft_loss_weight: float 0.5 mse_G_loss_weight: float 2.5 feat_match_loss_weight: float 108可以看到 MelGAN 的默认组合是「STFT 损失(0.5) MSE-GAN(2.5) 特征匹配(108)」并开启了噪声增强与特征缓存。ParallelWaveganConfig则默认使用parallel_wavegan_discriminator与parallel_wavegan_generatorupsample_factors [4,4,4,4]、stacks 3、num_res_blocks 30等见 parallel_wavegan_config.py 的文档串。各配置的字段注释本身就是一份参数手册建议训练前通读对应 dataclass。如果你想要现成的完整config.json起点除了TTS/vocoder/configs/外recipes/ljspeech/ 下为每个模型都提供了配方脚本如 hifigan/train_hifigan.py、multiband_melgan/train_multiband_melgan.py可以直接参考其中的参数组合。四、训练、续训与微调三条命令的语义差异README 给出的核心操作如下仓库中该入口脚本实际位于 TTS/bin/train_vocoder.py1. 新起一次训练——先准备config.json然后CUDA_VISIBLE_DEVICES0 python TTS/bin/train_vocoder.py --config_path path/to/config.json2. 从上次训练中断处继续continueCUDA_VISIBLE_DEVICES0 python TTS/bin/train_vocoder.py --continue_path path/to/your/model/folder3. 用预训练权重微调restoreCUDA_VISIBLE_DEVICES0 python TTS/bin/train_vocoder.py --restore_path path/to/your/model.pthREADME 对后两条命令的差异有一句关键说明值得逐字理解Restoring a model starts a new training in a different folder. It only restores model weights with the given checkpoint file. However, continuing a training starts from the same directory where the previous training run left off.即restore 只恢复模型权重、在新目录开一次全新训练优化器状态、步数计数等不继承continue 则原地继续从上次留下的目录接着跑。这一行为在源码中得到印证TTS/bin/train_vocoder.py 中--config_path走load_config(args.config_path)--continue_path则读取continue_path/config.json——后者依赖训练器在实验目录下回写的配置这正是“原地继续”的实现基础。启动入口main()的完整流程为解析命令行参数TrainVocoderArgs允许用额外的--xxx覆盖 config 中的字段见parser.parse_known_args与config.parse_known_args(config_overrides, relaxed_parserTrue)按feature_path是否存在选择load_wav_feat_data或load_wav_data载入样本用AudioProcessor(**config.audio)构建音频处理器通过setup_model(config)依据配置实例化模型交给通用Trainer并执行trainer.fit()同时把audio_processor作为training_assets传入供训练日志画图、合成试听音频。README 最后还提示训练过程与 TTS 模型一样可以通过 Tensorboard 跟踪——日志由 Trainer 的 logger 统一写出GAN.train_log/GAN.eval_log会在每个评估周期调用plot_resultsTTS/vocoder/utils/generic_utils.py绘制预测波形/频谱对比图并保存一条试听音频见 gan.py 的_log方法。五、框架纵深模型如何被动态装配GAN 训练循环如何运转5.1 “灵活且模块化”的模型装载机制README 提到适配新声码器很容易这对应 TTS/vocoder/models/init.py 中基于配置名的动态导入def setup_model(config: Coqpit): if discriminator_model in config and generator_model in config: MyModel importlib.import_module(TTS.vocoder.models.gan) MyModel getattr(MyModel, GAN) else: MyModel importlib.import_module(TTS.vocoder.models. config.model.lower()) ... return MyModel.init_from_config(config)也就是说只要配置里同时声明了discriminator_model与generator_model就一律走统一的GAN包装类其余单模型WaveRNN、Wavegrad 等则按config.model字符串映射到models/下的同名模块。setup_generator/setup_discriminator再按generator_model/discriminator_model的字符串名实例化具体网络并把generator_model_params/discriminator_model_params展开为构造参数——这正是“mix and match”的落点你可以用HifiganConfig的生成器换配 MelGAN 系判别器而不用改任何训练代码。所有声码器模型继承 TTS/vocoder/models/base_vocoder.py 中的BaseVocoder其约定MODEL_TYPE vocoder标识模型类别输入/输出张量形状规范batch x time x channels3D、batch x channels2D、batch x 11D_set_model_args会区分*Config训练用参数嵌在config.model_args中与*Args纯推理配置两种 config 形态。5.2 GAN 训练循环一次 train_step 里发生了什么GAN 类声码器的核心是 TTS/vocoder/models/gan.py 中的GAN类。它把 generatormodel_g与 discriminatormodel_d包在一个 Lightning 兼容的模型里通过optimizer_idx区分当前是判别器还是生成器优化步optimizer_idx 0判别器步先用生成器前向得到y_hat并缓存self.y_hat_g若diff_samples_for_G_and_D开启则用 batch 中额外提供的input_disc / waveform_disc样本重新跑一次生成器no_grad随后用真/假样本对调用判别器取(scores_fake, scores_real)计算判别器损失。判别器是否带条件输入通过反射检查forward参数个数2 个参数即条件判别器如 UnivNet自动适配。optimizer_idx 1生成器步复用缓存的y_hat_g过判别器得到scores_fake及特征feats_fake若启用特征匹配损失则以no_grad过一遍真样本得到feats_real最后统一交给GeneratorLoss按配置中的开关组合出总损失。PQMF 多分带处理当生成器输出通道数 1如 MultiBand-MelGAN 输出 4 个带代码自动调用model_g.pqmf_synthesis(y_hat)合成回单声道波形再喂给判别器并对真波形做pqmf_analysis得到分带目标——这就是配置里use_pqmf选项背后的机制分带相关层实现在 TTS/vocoder/layers/pqmf.py。延迟启动判别器on_train_step_start中self.train_disc trainer.total_steps_done self.config.steps_to_start_discriminator在训练早期只训生成器实现“热身”策略。优化器顺序get_optimizer返回[optimizer2(disc), optimizer1(gen)]与train_step中optimizer_idx的语义0判别器1生成器严格对齐调度器通过lr_scheduler_gen / lr_scheduler_disc分别构建。损失组合get_criterion返回[DiscriminatorLoss(config), GeneratorLoss(config)]二者均实现在 TTS/vocoder/layers/losses.py按第三节表格中的开关与权重把 STFT / Subband-STFT / MSE-GAN / Hinge-GAN / 特征匹配 / L1 频谱损失加权求和。数据侧GAN.get_data_loader构建 GANDataset透传seq_len、pad_short、conv_pad、use_noise_augment、use_cache等配置当diff_samples_for_G_and_D开启时return_pairsTrue让数据集每次返回两对样本G 用与 D 用各一份format_batch则把(x_G, y_G, x_D, y_D)整理成{input, waveform, input_disc, waveform_disc}供train_step消费。六、验证与测试如何确认你的训练在正常工作仓库为声码器模块准备了成体系的测试位于 tests/vocoder_tests/例如test_melgan_train.py、test_parallel_wavegan_train.py、test_multiband_melgan_train.py、test_hifigan_train.py端到端跑训练流程test_vocoder_melgan_generator.py、test_vocoder_melgan_discriminator.py、test_vocoder_parallel_wavegan_discriminator.py验证各网络模块的前向形状test_vocoder_losses.py、test_vocoder_pqmf.py、test_vocoder_rwd.py覆盖损失函数、PQMF 分带与随机窗口判别器test_vocoder_gan_datasets.py验证 GAN 数据集的切段、padding 与缓存行为。排查训练问题时可以对照这些测试确认配置能否被setup_model正确装配模型/判别器名字拼写错误会在此阶段报ValueError: Model xxx not exist!、损失开关组合是否与 test_vocoder_losses.py 中的场景一致、评估样本数是否符合eval_split_size预期。七、小结与致谢回到 TTS/vocoder/README.md 的原始主张可以把它浓缩为三条可操作的原则数据wav 收进一个目录 →data_path需要预计算特征时用feature_path配对 wav 与.npy配置继承BaseGANVocoderConfig的 dataclass或对应的config.json决定一切——网络结构*_model*_model_params、数据行为seq_len/pad_short/use_cache、损失组合use_* 权重、优化与调度lr_gen/lr_disc/ ExponentialLR /grad_clip训练--config_path新起、--continue_path原地续训、--restore_path换目录只带权重微调全程 Tensorboard 可观测。最后按 README 原样保留致谢本模块的 GAN 声码器工作以 kan-bayashi 的 ParallelWaveGAN 开源实现为起点仓库在其基础上统一了配置、数据与训练接口。【免费下载链接】TTS - a deep learning toolkit for Text-to-Speech, battle-tested in research and production项目地址: https://gitcode.com/GitHub_Trending/tt/TTS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考