尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

PaddleSpeech FastSpeech2 GTA Mel 生成指南:基于 gen_gta_mel.py 为声码器微调准备训练数据

发布时间:2026/9/24 17:07:47

资讯中心
01
ARTICLE

PaddleSpeech FastSpeech2 GTA Mel 生成指南:基于 gen_gta_mel.py 为声码器微调准备训练数据

PaddleSpeech FastSpeech2 GTA Mel 生成指南:基于 gen_gta_mel.py 为声码器微调准备训练数据
人工智能语音音频NLP媒体生成【免费下载链接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.项目地址https://gitcode.com/paddlepaddle/PaddleSpeech点击查看免费下载导读本文以 PaddleSpeech 仓库中 gen_gta_mel.py 模块为核心系统讲解如何利用已训练好的 FastSpeech2 模型与 MFA 音素时长对齐结果批量生成GTAGround Truth Aligned梅尔频谱为 Parallel WaveGAN / MB MelGAN 等声码器的**微调finetune**准备对齐准确的训练数据。读完本文你将掌握gen_gta_mel.py的完整参数体系、数据流与调用链理解它与durations.txt、merge_silence、StyleFastSpeech2Inference等关键组件的关系并能直接参照 examples/csmsc/voc5/finetune.sh 跑通从 GTA Mel 生成到声码器微调的全流程。一、背景为什么声码器微调需要 GTA Mel1.1 声码器微调的问题在 TTS 两阶段方案中声码器如 Parallel WaveGAN、MB MelGAN通常先在由 FastSpeech2 合成synthesized的 Mel 频谱上训练。但合成 Mel 与真实音频提取的 Mel 之间存在差异时长不对齐声码器自回归地基于 Mel 逐帧生成波形若 Mel 时长与真实音频不一致会造成帧级错位音素边界模糊合成 Mel 的音素边界由时长预测器估计存在误差不利于声码器学习精确的帧级映射。为了让声码器学到输入 Mel 帧 → 输出真实波形帧的正确映射业界普遍采用GTAGround Truth Aligned模式使用真实音频对齐得到的音素时长而非模型预测时长驱动 FastSpeech2 生成 Mel这样得到的 Mel 与真实波形在时间上严格对齐可作为声码器微调的理想训练对。1.2 GTA 在 PaddleSpeech 中的实现PaddleSpeech 将这一过程封装在 gen_gta_mel.py对应的 API 文档页为 paddlespeech.t2s.exps.fastspeech2.gen_gta_mel.rst。脚本头部注释写明了其用途# generate mels using durations.txt # for mb melgan finetune即读取durations.txt中由 MFAMontreal Forced Aligner对齐得到的音素时长配合已训练好的 FastSpeech2 权重批量生成与真实语音对齐的 Mel 频谱供声码器MB MelGAN 等微调使用。二、核心工作流程与调用链gen_gta_mel.py的执行流程可分为五个阶段整体调用链如下durations.txt (MFA 时长) │ get_phn_dur() 解析 ▼ sentence 字典 {utt: (phones, durations, speaker)} │ merge_silence() 合并静音 ▼ phone_dict / spk_id_list 词表映射 │ ▼ FastSpeech2 模型加载 ZScore 归一化 │ ▼ StyleFastSpeech2Inference(phone_ids, durations, spk_id) ← 关键注入真实时长 │ ▼ 输出 dump_finetune/{train,dev,test}/raw/{utt}_feats.npy下面按阶段展开。2.1 阶段一解析 MFA 时长文件入口函数evaluate()首先读取args.dur_file指向的durations.txt其格式由 preprocess_utils.py 中的get_phn_dur()定义speaker|utt_id|phn dur phn dur ...例如BZNSYP|SSB00050001|sil 17 # 这仅是示意# 之后为注释实际文件无注释get_phn_dur()逐行按|切分取出utt、speaker与最后的phn dur对奇数位为音素、偶数位为帧数时长组装为sentence[utt] (phones, durations, speaker)并顺带返回speaker_setphn_dur p_d.split() phn phn_dur[::2] # 音素序列 dur phn_dur[1::2] # 每音素的时长帧数 assert len(phn) len(dur) sentence[utt] (phn, [int(i) for i in dur], speaker)2.2 阶段二静音合并与边界裁剪得到句子字典后脚本调用merge_silence(sentences)见 preprocess_utils.py。该函数做两件事合并连续静音将相邻的sil/sp合并为一个sil时长累加避免碎片化静音区分短停与长停时长 14帧的静音标记为sp否则标记为spl。随后在逐句生成时若开启--cut-sil默认True脚本会裁掉句子开头和结尾的sil仅当len(durations) 1时保证送入模型的音素序列以有效音素开始和结束if args.cut_sil: if phones[0] sil and len(durations) 1: durations durations[1:] phones phones[1:] if phones[-1] sil and len(durations) 1: durations durations[:-1] phones phones[:-1]2.3 阶段三词表与说话人映射脚本读取--phones-dict默认phone_id_map.txt构造phone_dict并将vocab_size词表大小作为 FastSpeech2 的输入维度idimwith open(args.phones_dict, r) as f: phn_id [line.strip().split() for line in f.readlines()] vocab_size len(phn_id) phone_dict {phn: int(id) for phn, id in phn_id}若提供--speaker-dict则读取说话人 id 映射表spk_id_list得到spk_num多说话人场景否则spk_num None单说话人场景。2.4 阶段四模型加载与归一化加载 FastSpeech2 模型并恢复训练权重同时加载训练时统计量speech_stats.npy内含均值mu与标准差std构建 ZScore 归一化器model FastSpeech2(idimvocab_size, odimfastspeech2_config.n_mels, **fastspeech2_config[model], spk_numspk_num) model.set_state_dict(paddle.load(args.fastspeech2_checkpoint)[main_params]) model.eval() stat np.load(args.fastspeech2_stat) mu, std stat fastspeech2_normalizer ZScore(paddle.to_tensor(mu), paddle.to_tensor(std)) fastspeech2_inference StyleFastSpeech2Inference(fastspeech2_normalizer, model) fastspeech2_inference.eval()注意这里使用的是StyleFastSpeech2Inference定义于 fastspeech2.py。它是FastSpeech2Inference的子类其forward()支持直接注入durationsGround Truth 时长见 fastspeech2.py这正是 GTA 生成的核心——用真实时长覆盖时长预测器def forward(self, text, durationsNone, durations_scaleNone, durations_biasNone, pitchNone, ..., robotFalse, spk_embNone, spk_idNone): # durations: Groundtruth of duration (T,), 传入后覆盖 durations_scale/bias 的效果2.5 阶段五逐句生成并分类落盘脚本遍历tqdm(sentences)对每句执行with paddle.no_grad(): mel fastspeech2_inference(phone_ids, durationsdurations, spk_idspeaker_id) np.save(sub_output_dir / (utt_id _feats.npy), mel)同时根据utt_id对应的.wav所属的数据划分将生成的 Mel 写入不同的子目录数据划分判定方式输出目录trainwav_path in train_wav_filesoutput_dir/train/raw/devwav_path in dev_wav_filesoutput_dir/dev/raw/testwav_path in test_wav_filesoutput_dir/test/raw/数据集划分逻辑随--dataset变化源码注释说明当前支持baker与aishell3bakerBZNSYP遍历rootdir/Wave/下全部.wav按排序取前 9800 条为 train、随后 100 条为 dev、其余为 testaishell3遍历rootdir/train/wav/下每个说话人目录说话人样本数 100 时末尾 10 条中前 5 条为 dev、后 5 条为 test其余为 train否则全部归入 train。从源码结构看--dataset的帮助文本虽写着 should in {baker, ljspeech, vctk} now但evaluate()内实际只实现了baker与aishell3两个分支使用时以实际支持的数据集为准。源码注释还提示生成的和真实的可能有 1, 2 帧的差距但是 batch_fn 会修复即 GTA Mel 与真实 Mel 在帧数上可能存在 1~2 帧偏差由后续微调数据的 batch 处理逻辑batch_fn在训练时补齐这不会影响声码器微调。三、命令行参数详解main()通过argparse解析全部参数完整参数表如下参数类型默认值必填说明--datasetstrbaker否数据集名称用于 train/dev/test 划分源码实际支持baker、aishell3--rootdirstrNone是数据集根目录如 BZNSYP 的~/datasets/BZNSYP/--fastspeech2-configstr—是FastSpeech2 训练时的配置文件yaml--fastspeech2-checkpointstr—是待加载的 FastSpeech2 权重.pdz--fastspeech2-statstr—是训练时用于归一化频谱的均值/标准差speech_stats.npy--phones-dictstrphone_id_map.txt是音素词表文件--speaker-dictstrNone否说话人 id 映射文件多说话人必需--dur-filestrNone是durations.txt路径MFA 对齐结果--output-dirstr—是输出目录将生成train/raw、dev/raw、test/raw--ngpuint1否0表示 CPU0表示 GPU--cut-silboolstr2boolTrue否是否裁剪音频边缘的sil设备选择逻辑if args.ngpu 0: paddle.set_device(cpu) elif args.ngpu 0: paddle.set_device(gpu)配置加载通过CfgNode完成并会打印Args与Config供核对with open(args.fastspeech2_config) as f: fastspeech2_config CfgNode(yaml.safe_load(f)) print(yaml.safe_dump(vars(args))) print(fastspeech2_config)其中odim fastspeech2_config.n_mels即 Mel 维度直接取自配置文件中的n_mels。四、端到端实战CSMSC voc5 声码器微调仓库中 examples/csmsc/voc5/finetune.sh 给出了完整实战示例用 BZNSYP 数据集上训练好的 FastSpeech2 生成 GTA Mel再微调 Parallel WaveGAN 声码器。4.1 Stage 0生成 GTA Melpython3 ${MAIN_ROOT}/paddlespeech/t2s/exps/fastspeech2/gen_gta_mel.py \ --fastspeech2-configfastspeech2_nosil_baker_ckpt_0.4/default.yaml \ --fastspeech2-checkpointfastspeech2_nosil_baker_ckpt_0.4/snapshot_iter_76000.pdz \ --fastspeech2-statfastspeech2_nosil_baker_ckpt_0.4/speech_stats.npy \ --dur-filedurations.txt \ --output-dirdump_finetune \ --phones-dictfastspeech2_nosil_baker_ckpt_0.4/phone_id_map.txt \ --datasetbaker \ --rootdir~/datasets/BZNSYP/参数对应关系--fastspeech2-config/--fastspeech2-checkpoint/--fastspeech2-stat均来自预训练目录fastspeech2_nosil_baker_ckpt_0.4/default.yaml、snapshot_iter_76000.pdz、speech_stats.npy--dur-filedurations.txt为 MFA 对齐时长由utils/gen_duration_from_textgrid.py从 TextGrid 转换而来即get_phn_dur()注释所指的 gen_duration_from_textgrid.pys result--output-dirdump_finetune为输出根目录。运行后生成dump_finetune/ ├── train/raw/*_feats.npy ├── dev/raw/*_feats.npy └── test/raw/*_feats.npy4.2 Stage 1软链原始 wav声码器微调需要 Mel 与 wav 一一对应因此用 link_wav.py 将原 dump 目录中的 wav 软链到dump_finetunepython3 ${MAIN_ROOT}/utils/link_wav.py \ --old-dump-dirdump \ --dump-dirdump_finetune4.3 Stage 2复用频谱统计量直接复制原 dump 的统计量供后续归一化使用cp dump/train/feats_stats.npy dump_finetune/train/4.4 Stage 3归一化对 train/dev/test 三部分分别执行normalize.py其中dev 和 test 必须使用 train 的统计量保证分布一致python3 ${BIN_DIR}/../normalize.py \ --metadatadump_finetune/train/raw/metadata.jsonl \ --dumpdirdump_finetune/train/norm \ --statsdump_finetune/train/feats_stats.npy \ --skip-wav-copy # dev、test 同理--stats 仍指向 train 的 feats_stats.npy4.5 Stage 4启动微调CUDA_VISIBLE_DEVICES${gpus} \ FLAGS_cudnn_exhaustive_searchtrue \ FLAGS_conv_workspace_size_limit4000 \ python ${BIN_DIR}/train.py \ --train-metadatadump_finetune/train/norm/metadata.jsonl \ --dev-metadatadump_finetune/dev/norm/metadata.jsonl \ --configconf/finetune.yaml \ --output-direxp/finetune \ --ngpu1注意--configconf/finetune.yaml是声码器微调专用配置区别于正常训练的conf/default.yaml微调结果输出到exp/finetune。类似地examples/opencpop/voc5/finetune.sh 展示了 SVS歌声合成场景下diffsinger的 GTA Mel 生成流程流程骨架与本文一致可对照阅读。五、实现要点与注意事项GTA 的本质是用真实时长替换预测时长核心在于StyleFastSpeech2Inference.forward()的durations参数见 fastspeech2.py传入后覆盖模型内部时长预测结果使 Mel 与真实语音帧级对齐。durations.txt必须由 MFA 对齐生成其格式speaker|utt|phn dur ...由get_phn_dur()严格解析音素与时长一一对应含assert len(phn) len(dur)校验来源是gen_duration_from_textgrid.py的输出。数据划分与数据集强相关baker 与 aishell3 的划分策略不同见 2.5 节换数据集需确认evaluate()中是否已有对应分支。统计量复用微调阶段 dev/test 必须沿用 train 的feats_stats.npy避免统计口径不一致导致性能波动。帧数微小偏差可接受GTA Mel 与真实 Mel 可能存在 1~2 帧偏差由训练时的batch_fn补齐无需在生成阶段强行对齐。六、小结gen_gta_mel.py是 PaddleSpeech 声码器微调链路中的关键数据生成工具。它将 MFA 真实音素时长、FastSpeech2 预训练权重与 ZScore 归一化三者结合通过StyleFastSpeech2Inference注入真实时长批量产出与真实语音严格对齐的 GTA Mel并按 train/dev/test 自动分类落盘。结合 examples/csmsc/voc5/finetune.sh 中的 link_wav、统计量复用与 normalize 流程即可完整搭建GTA Mel 生成 → 声码器微调的实战管线。如需深入底层可继续阅读 fastspeech2.py模型与前向推理封装、preprocess_utils.py时长解析与静音合并以及 link_wav.pywav 软链工具。赞分享人工智能语音音频NLP媒体生成【免费下载链接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.项目地址https://gitcode.com/paddlepaddle/PaddleSpeech点击查看免费下载相关推荐SpeechBrain 基于 LJSpeech 的 TTS 全流程训练指南Tacotron2、FastSpeech2 与 HiFiGAN / DiffWave 声码器SpeechBrain 基于 LJSpeech 的 TTS 全流程训练指南Tacotron2、FastSpeech2 与 HiFiGAN / DiffWave人工智能深度学习语音音频NLP预训练MiniCPM 基于 LLaMA-Factory 微调实战从数据准备到多卡训练完整指南MiniCPM 基于 LLaMA Factory 微调实战从数据准备到多卡训练完整指南 导读 本文以 OpenBMB/MiniCPM 仓库中 finetune大模型本地部署模型量化微调LoRA工具调用openBMBAscendBuzz模型微调数据集准备如何准备训练数据Buzz模型微调数据集准备如何准备训练数据 一、为什么需要高质量的微调数据 你是否遇到过这些问题会议录音转写时专业术语错误百出播客字幕与口语表达脱节多人工智能语音音频本地部署桌面应用上一篇ComfyUI-layerdiffuse硬件性能与配置选型指南5张GPU生成速度全对比最划算配置怎么定下一篇Spring AI 依赖管理一次讲清BOM、私有仓库与版本升级 5 步走通创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。