资讯中心

PaddleSpeech FastSpeech2 GTA Mel 生成模块(gen_gta_mel)完整解析:从 durations.txt 到声码器微调数据

📅 2026/9/24 16:17:27
PaddleSpeech FastSpeech2 GTA Mel 生成模块(gen_gta_mel)完整解析:从 durations.txt 到声码器微调数据
PaddleSpeech FastSpeech2 GTA Mel 生成模块gen_gta_mel完整解析从 durations.txt 到声码器微调数据【免费下载链接】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/gh_mirrors/pa/PaddleSpeech导读本文围绕 PaddleSpeech 仓库中由 docs/source/api/paddlespeech.t2s.exps.fastspeech2.gen_gta_mel.rst 这一 API 文档页所对应的核心模块——paddlespeech/t2s/exps/fastspeech2/gen_gta_mel.py——展开它是 FastSpeech2 训练流程中用于声码器Vocoder微调的关键数据准备工具利用对齐得到的durations.txt强制解码为训练集中的每一条音频生成地面真值对齐Ground Truth AlignedGTAMel谱。读完本文你将掌握该脚本的完整命令行参数、逐步执行流程、底层依赖实现以及如何在 CSMSC、OpenCPOP 等真实示例中用它驱动 MB-MelGAN 的微调。GTA Mel 是什么为什么声码器微调需要它在 PaddleSpeech 的 TTS 训练体系中声学模型如 FastSpeech2负责把音素序列转成 Mel 谱声码器如 Parallel WaveGAN、MB-MelGAN负责把 Mel 谱还原成波形。常规合成流程中声码器接收的是声学模型预测出的 Mel 谱但在声码器微调阶段我们更希望声码器学到从真实对齐的语音特征到波形的映射而不是从带误差的预测特征学习。GTAGround Truth AlignedMel 正是为此设计的它不是由声学模型端到端预测的 Mel而是在推理时把外部对齐工具如 MFAMontreal Forced Aligner得到的真实音素时长durations.txt直接喂给 FastSpeech2让模型跳过时长预测环节、严格按真实对齐信息展开每个音素从而生成与真实语音在时间上对齐的 Mel 谱。生成脚本文件头部的注释gen_gta_mel.py也明确说明了用途# generate mels using durations.txt、# for mb melgan finetune。这种做法的价值在于声码器微调阶段使用的特征分布与真实语音特征分布更接近避免了用模型预测特征训练声码器、推理时又暴露在预测误差中的分布漂移问题。模块定位与整体数据流从源码结构看gen_gta_mel.py是paddlespeech.t2s.exps.fastspeech2包下的一个独立可执行脚本与同目录下的preprocess.py数据预处理、normalize.py特征归一化、train.py声学模型训练共同构成 FastSpeech2 的完整训练链路。其整体数据流可以概括为durations.txt (MFA 对齐结果) │ get_phn_dur() 解析 ▼ phoneme 序列 真实 duration speaker │ cut_sil 裁剪首尾静音可选 ▼ phone_ids ──┐ durations ──┼──► StyleFastSpeech2Inference强制时长 spk_id ─────┘ │ ▼ 反归一化后的 log-Mel 谱 │ ▼ output_dir/{train,dev,test}/raw/{utt}_feats.npy整个脚本以evaluate()函数为主体gen_gta_mel.py通过main()完成参数解析、设备设置、配置加载后调用它。生成的特征按train/dev/test三部分分别落盘后续可直接交由声码器微调流程使用。命令行参数全解析main()中通过argparse定义的全部参数如下gen_gta_mel.py参数类型默认值含义--datasetstrbaker数据集名称当前代码分支实际支持baker与aishell3帮助文本中说明候选为{baker, ljspeech, vctk}--rootdirstrNone数据集根目录用于按训练集划分寻找对应 wav 文件--fastspeech2-configstr必填FastSpeech2 训练时的配置文件yaml--fastspeech2-checkpointstr必填待加载的 FastSpeech2 模型权重如snapshot_iter_76000.pdz--fastspeech2-statstr必填训练时用于归一化 Mel 谱的均值/标准差文件speech_stats.npy--phones-dictstrphone_id_map.txt音素词表文件每行音素 id--speaker-dictstrNone说话人 id 映射文件多说话人数据集如 aishell3/vctk必填--dur-filestrNonedurations.txt的路径MFA 对齐结果--output-dirstr必填GTA Mel 输出目录--ngpuint1使用 GPU 数0表示使用 CPU--cut-silboolstr2boolTrue是否裁剪音频首尾的sil音素其中--cut-sil使用paddlespeech.t2s.utils.str2bool进行字符串到布尔值的转换支持true/false等写法默认开启。设备选择逻辑为--ngpu 0时paddle.set_device(cpu)--ngpu 0时paddle.set_device(gpu)否则报错ngpu should 0。配置文件通过yacs.config.CfgNode加载CfgNode(yaml.safe_load(f))脚本启动时会打印Args与Config便于核对运行环境。核心执行流程逐步拆解1. 加载音素词表与说话人词表脚本首先读取--phones-dict构建phone_dict音素 → id其词表大小vocab_size直接决定 FastSpeech2 编码器输入维度idim。若提供了--speaker-dict则读取spk_id_list得到说话人数spk_num多说话人模型的说话人嵌入数量否则spk_numNone单说话人模型。2. 构建模型并加载训练权重模型构建gen_gta_mel.pyodim fastspeech2_config.n_mels model FastSpeech2( idimvocab_size, odimodim, **fastspeech2_config[model], spk_numspk_num) model.set_state_dict( paddle.load(args.fastspeech2_checkpoint)[main_params]) model.eval()注意模型输出维度odim取自配置中的n_mels模型结构其余超参来自配置的model段权重加载时取 checkpoint 中的main_params键。3. 加载统计量并构造归一化器--fastspeech2-stat指向训练阶段保存的speech_stats.npy内含mu, std两个向量脚本将其转为 Tensor 后交给ZScore归一化器normalizer.pystat np.load(args.fastspeech2_stat) mu, std stat mu paddle.to_tensor(mu) std paddle.to_tensor(std) fastspeech2_normalizer ZScore(mu, std)ZScore继承自nn.Layer通过register_buffer保存均值与方差forward执行(x - mu) / sigma标准化inverse执行x * sigma mu反标准化。这里至关重要的一点是生成 GTA Mel 用的是StyleFastSpeech2Inference其父类FastSpeech2Inference在 fastspeech2.py 中先对模型输出做normalizer.inverse()反归一化再返回 log-Mel也就是说最终保存的是真实数值域的 Mel 谱与训练时dump/train/norm里归一化后的特征不同这一点决定了后续微调阶段的数据使用方式。4. 读取 durations.txtget_phn_dur(args.dur_file)解析由 utils/gen_duration_from_textgrid.py 生成的时长文件其每行格式为speaker|utt_id|phn dur phn dur ...例如BZNSYP|SSB00050001|sil 12 #1 8 #2 10 ...。解析逻辑位于 preprocess_utils.py以|切分后取utt_id、speaker和最后的音素-时长串按空格交错切分出phn隔一个取一个与dur取剩余并断言二者等长最终得到sentence[utt] (phn列表, dur整数列表, speaker)同时返回speaker_set。紧接着调用merge_silence(sentences)preprocess_utils.py做两件事将连续的sil/sp静音片段合并为单个sil时长累加将单个sp按时长阈值 14 帧区分为sp短停顿与spl长停顿供后续韵律建模区分。5. 训练/开发/测试集划分脚本根据--dataset按 wav 文件对 utterance 分桶决定 GTA Mel 输出到train/raw、dev/raw还是test/rawbaker遍历rootdir/Wave下全部*.wav并排序固定切分前 9800 条为 train、其后 100 条为 dev、其余为 testgen_gta_mel.pyaishell3按说话人目录遍历对音频数 100 的说话人末尾5条为 test、倒数第6~10条为 dev、其余为 train音频数较少的说话人全部划入 traingen_gta_mel.py。随后将这些 wav 文件名转成 basename 列表用于在生成循环中判断当前 utterance 属于哪个子集。6. 逐句强制对齐推理脚本按tqdm进度条遍历全部句子对每条 utterance裁剪首尾静音--cut-sil开启时若首音素为sil且时长序列长度大于 1则去掉开头的sil及其时长结尾同理gen_gta_mel.py将音素序列映射为phone_ids并转为paddle.Tensor多说话人时按speaker在spk_id_list中查表得到speaker_id将真实时长durations转为 Tensor在paddle.no_grad()下调用推理接口mel fastspeech2_inference( phone_ids, durationsdurations, spk_idspeaker_id)将结果以np.save保存为sub_output_dir / (utt_id _feats.npy)。这里的关键在于StyleFastSpeech2Inference.forwardfastspeech2.py对durations参数的处理传入真实时长时会覆盖durations_scale/durations_bias等韵律缩放设置即强制使用地面真值时长而非模型预测时长。注释也指出生成结果与真实 Mel 可能存在 1~2 帧的误差后续batch_fn等处理会自动修复gen_gta_mel.py。输出目录结构以 CSMSCbaker为例--output-dir dump_finetune执行后的目录结构为dump_finetune/ ├── train/raw/{utt_id}_feats.npy # 训练集 GTA Mel ├── dev/raw/{utt_id}_feats.npy # 开发集 GTA Mel └── test/raw/{utt_id}_feats.npy # 测试集 GTA Mel配合后续link_wav.py链接原始 wav、拷贝feats_stats.npy、normalize.py归一化后即可得到声码器微调所需的metadata.jsonl与norm特征。在真实示例中的应用MB-MelGAN 微调仓库提供了两个使用该模块的端到端示例脚本examples/csmsc/voc5/finetune.shCSMSC 数据集examples/opencpop/voc5/finetune.shOpenCPOP 歌唱数据集以 CSMSC 为例stage 0的调用方式如下finetune.shpython3 ${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/其中durations.txt由 MFA 对齐后经 utils/gen_duration_from_textgrid.py 生成。该脚本后续 stages 的完整微调链路为stage 1link_wav.py将dump中的原始 wav 软链到dump_finetune对应子集stage 2把训练阶段统计量dump/train/feats_stats.npy拷贝到dump_finetune/train/stage 3用normalize.py分别对 train/dev/test 的 raw 特征做归一化dev/test 统一使用 train 的统计量--skip-wav-copy避免重复拷贝stage 4用 paddlespeech/t2s/exps/fastspeech2/train.py 以conf/finetune.yaml配置启动声码器微调训练。注意事项与适用范围数据集适配范围脚本内部分桶逻辑目前仅对baker与aishell3有专门实现帮助文本声明候选为{baker, ljspeech, vctk}在其它数据集上使用--dataset时不会进入任何分桶分支train/dev/test的sub_output_dir将无法确定因此实际使用请优先选择这两个数据集或按需扩展分桶逻辑。多说话人配置--speaker-dict缺省为None此时模型以单说话人模式构建spk_numNoneGTA Mel 中不含说话人嵌入维度多说话人场景如 aishell3必须提供说话人映射文件。checkpoint 键名权重加载依赖main_params键若使用自行训练且键名不同的权重需要先适配。数值域差异保存的_feats.npy是经ZScore.inverse反归一化后的真实 Mel 值而非训练时归一化后的特征后续归一化阶段会以feats_stats.npy重新统一到同一统计口径。小结gen_gta_mel是连接对齐信息与声码器微调之间的桥梁它以durations.txt中的真实音素时长强制驱动 FastSpeech2 解码为每一条训练语音生成时间对齐的 GTA Mel 谱再配合link_wav、normalize、train完成 MB-MelGAN 等声码器的微调。理解它的参数体系、分桶规则与底层调用链get_phn_dur→merge_silence→StyleFastSpeech2Inference→ZScore.inverse是掌握 PaddleSpeech 声码器微调流程的关键一步也可为复现 CSMSC/OpenCPOP 的voc5示例提供直接的实践参照。【免费下载链接】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/gh_mirrors/pa/PaddleSpeech创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

看完文章,想为自己的企业也做一次专业网站诊断?

尧图顾问免费为您评估现有网站,并给出建站/改版建议与报价方案。

免费获取方案