☰
PaddleSpeech SpeedySpeech 链路测试脚本详解:从 lite 快速训练到 Paddle Inference 推理验证
2026/9/25 6:51:03 网站建设 项目流程
  • 人工智能
  • 语音
  • 音频

【免费下载链接】PaddleSpeech

Easy-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
点击查看免费下载

本文以 tests/chains/speedyspeech/README.md 为主线,完整拆解 PaddleSpeech 中 SpeedySpeech(并行 WaveNet 类 TTS 声学模型)的链路测试(chains test)体系:三个入口脚本lite_train_infer.sh、whole_train_infer.sh、infer.sh各自做什么、依赖的参数文件如何组织、test.sh如何编排“训练 → 评估 → 导出 → 推理”全链路,以及底层训练与推理入口脚本的关键参数。读完本文,你可以完整理解并复现该目录下的每一次命令执行过程,也能将其作为编写其他模型链路测试脚本的参考范式。

链路测试目录结构与三个入口

tests/chains/speedyspeech/ 目录包含以下文件:

文件作用
README.md入口说明:告知用户运行三个入口脚本
lite_train_infer.sh小数据集快速训练 + 推理验证(单卡、多卡各跑一遍)
whole_train_infer.sh完整数据集训练 + 推理验证
infer.sh纯推理验证(使用官方推理模型包 + Paddle Inference)
prepare.sh按 MODE 下载预训练模型与训练数据
test.sh真正的编排引擎:解析参数文件并驱动训练/评估/导出/推理
speedyspeech_params_lite_single_gpu.txt 等 4 个参数文件定义训练、评估、推理的具体命令与执行维度

README 给出的用法就是三条命令(在tests/chains/speedyspeech目录下执行):

# lite:小数据集快速链路 bash lite_train_infer.sh # whole:完整数据集链路 bash whole_train_infer.sh # infer:纯推理验证 bash infer.sh

下面结合每个脚本的实际内容逐一说清“这一条命令背后到底发生了什么”。

lite_train_infer.sh:小数据集快速训练 + 推理验证

lite_train_infer.sh 全文只有 7 行,流程非常直白:

rm exp -rf rm e2e -rf bash prepare.sh lite_train_infer bash test.sh speedyspeech_params_lite_single_gpu.txt lite_train_infer rm exp -rf rm e2e -rf bash test.sh speedyspeech_params_lite_multi_gpu.txt lite_train_infer

它分两轮执行同一条训练链路:第一轮使用speedyspeech_params_lite_single_gpu.txt(单卡,gpu_list:0),第二轮清理exp/与e2e/输出目录后使用speedyspeech_params_lite_multi_gpu.txt(多卡,gpu_list:0,1)。两轮都会走完“训练 → 评估 → 导出 → 推理”全流程,因此可以分别验证单卡与多卡(--ngpu)两种并行方式下的链路正确性。

从参数文件看,lite 模式的训练命令基于mini_BZNSYP小型数据集:

python3.7 ../../../paddlespeech/t2s/exps/speedyspeech/train.py \ --train-metadata=train_data/mini_BZNSYP/train/norm/metadata.jsonl \ --dev-metadata=train_data/mini_BZNSYP/dev/norm/metadata.jsonl \ --config=../../../examples/csmsc/tts2/conf/default.yaml \ --batch_size=32 --max_epoch=10 --num_snapshots=10 \ --output-dir=exp/default \ --phones-dict=train_data/mini_BZNSYP/phone_id_map.txt \ --tones-dict=train_data/mini_BZNSYP/tone_id_map.txt \ --use-relative-path=True

注意这些路径是相对于tests/chains/speedyspeech目录的(../../../指回仓库根目录)。单卡文件使用--max_epoch=10,多卡文件将--max_epoch调整为 20,评估阶段对应的 checkpoint 分别为snapshot_iter_30.pdz与snapshot_iter_20.pdz。

whole_train_infer.sh:完整数据集训练链路

whole_train_infer.sh 结构与 lite 版完全对称,区别仅在数据与参数文件:

rm exp -rf rm e2e -rf bash prepare.sh whole_train_infer bash test.sh speedyspeech_params_whole_single_gpu.txt whole_train_infer rm exp -rf rm e2e -rf bash test.sh speedyspeech_params_whole_multi_gpu.txt whole_train_infer

它使用完整处理后的processed_BZNSYP数据集训练,--output-dir=exp/whole,且不再显式覆盖--batch_size/--max_epoch(沿用 examples/csmsc/tts2/conf/default.yaml 配置中的默认值)。其评估命令与 lite 版不同:它直接加载官方发布的预训练权重pretrain_models/speedyspeech_nosil_baker_ckpt_0.5/snapshot_iter_11400.pdz做端到端合成验证,相当于在完整数据训练的同时,用发布 checkpoint 校验评估链路本身可用。

prepare.sh:按 MODE 准备数据与预训练模型

prepare.sh 根据传入的 MODE 决定下载什么,是三个入口脚本能“开箱即跑”的关键:

  • MODE = lite_train_infer:下载 PWG(Parallel WaveGAN 声码器)预训练包pwg_baker_ckpt_0.4.zip到./pretrain_models/并解压;同时下载并解压小型训练集mini_BZNSYP.tar.gz到./train_data/(下载前会先删除旧目录避免脏数据)。
  • MODE = whole_train_infer:额外下载 SpeedySpeech 预训练包speedyspeech_nosil_baker_ckpt_0.5.zip,并下载完整数据集processed_BZNSYP.tar.gz。
  • MODE 为其他(即 infer):只下载官方推理模型包speedyspeech_pwg_inference_0.5.zip并解压,供 Paddle Inference 直接加载。

所有下载均使用wget -nc(已存在则跳过),重复执行脚本不会产生重复下载。

infer.sh:纯推理验证

infer.sh 只有一行实质逻辑:

bash prepare.sh infer bash test.sh speedyspeech_params_lite_single_gpu.txt infer

它复用 lite 参数文件的inference段,跳过训练与评估,只对pretrain_models/speedyspeech_pwg_inference_0.5目录中已导出的推理模型执行 paddlespeech/t2s/exps/speedyspeech/inference.py(后文详述)。lite 参数文件第 41 行显式声明了--use_gpu:True,即推理验证在 GPU 上执行。

参数文件组织方式:speedyspeech_params_*.txt

四个参数文件是test.sh的“配置源”,采用固定的按行号定位 +key:value分隔的格式,全文用key:value描述,未使用的行写null:null占位,并用##与===...===分隔三个功能段:

===========================train_params=========================== # 第 1 行起 model_name:speedyspeech # 第 2 行 python:python3.7 # 第 3 行 gpu_list:0 # 第 4 行 ... trainer:norm_train # 第 15 行 norm_train:../../../paddlespeech/t2s/exps/speedyspeech/train.py ... # 第 16 行 ... ===========================eval_params=========================== # 第 23 行 eval:../../../paddlespeech/t2s/exps/speedyspeech/synthesize_e2e.py ... # 第 24 行 ===========================infer_params=========================== # 第 27 行 inference:../../../paddlespeech/t2s/exps/speedyspeech/inference.py ... # 第 40 行 --use_gpu:True # 第 41 行(GPU 推理开关)

test.sh 按行下标取值(例如第 3 行是python解释器、第 4 行是gpu_list、第 16 行是训练命令、第 24 行是评估命令、第 40 行是推理命令、第 41 行是--use_gpu列表等)。这种“行号即协议”的约定意味着:修改参数文件时必须保持行号语义不变,空位用null:null占位,否则编排逻辑会取错值。

各行的典型语义(以 lite 单卡文件为例):

行号key含义
2model_name链路标识,本目录固定为speedyspeech
3python使用的 Python 解释器(python3.7)
4gpu_list依次尝试的 GPU 规格:0(单卡)、0,1(多卡)等,-1表示 CPU
15trainer训练器列表,本链路只有norm_train(普通训练)
16norm_train训练入口命令(train.py+ 全部训练参数)
24eval评估/端到端合成命令(synthesize_e2e.py+ 全部参数)
40inferencePaddle Inference 推理命令(inference.py+ 全部参数)
41--use_gpu推理的 GPU 开关列表

test.sh:训练 → 评估 → 导出 → 推理的编排引擎

test.sh 是整个链路的核心,用法为bash test.sh ***.txt MODE,其中 MODE 取lite_train_infer、whole_infer、whole_train_infer或infer之一(见文件头注释)。它先解析参数文件,再根据 MODE 走两条完全不同的分支。

infer 分支:导出 + 多推理维度组合

MODE 为infer时,脚本会:

  1. 根据第三个参数设置CUDA_VISIBLE_DEVICES(未指定则为空);
  2. 对每个待推理模型目录,若参数文件中声明了导出命令则先执行导出(本链路中 infer 模式的导出位为null,因为模型包已预导出);
  3. 调用func_inference逐模型执行推理。

func_inference是推理维度组合的核心:

  • CPU 路径(use_gpu=False/cpu):对use_mkldnn、cpu_threads、batch_size三个维度做三重循环,逐一生成推理命令并记录日志(量化模型会跳过mkldnn=False的组合);
  • GPU 路径(use_gpu=True/gpu):对use_trt、precision、batch_size三重循环,并内置约束——fp16/int8精度必须搭配use_trt=True,非量化模型跳过int8等组合;
  • 每个组合的 stdout 都落盘到./tests/output/infer_*.log,并由status_check函数将“Run successfully / Run failed”状态追加写入./tests/output/results.log。

训练分支:gpu × autocast × trainer 三重循环

MODE 为训练类(lite_train_infer/whole_train_infer)时,脚本按gpu_list→autocast→trainer三重循环执行。GPU 字段的长度还隐含并行方式:

  • 长度 ≤ 2(如0、-1):单卡或 CPU 直接运行训练命令;
  • 长度 ≤ 15(如0,1):多机同卡场景,以--ngpu=N追加并行参数;
  • 更长(ips;gpus形式):多机多卡,改用python -m paddle.distributed.launch --ips=... --gpus=...启动。

trainer 支持pact(量化感知训练)、fpgm、distill等扩展位,若命中会自动加载普通训练的 checkpoint 作为预训练(set_pretrain="${load_norm_train_model}");本链路只启用norm_train。每个训练任务完成后,脚本自动串联后续步骤:

  1. eval:把刚产出的 checkpoint(--pretrain-model指向save_log/模型名)传入评估命令;
  2. export:若声明了导出命令,则导出推理模型到save_infer_path;
  3. inference:用func_inference对新导出模型跑一遍推理,验证“训练出的模型真的可用”。

所有步骤的成败都会追加到./tests/output/results.log,训练日志目录命名为${trainer}_gpus_${gpu}_autocast_${autocast},便于对照定位问题。

底层链路入口脚本(源码级说明)

参数文件中指向的三条命令,对应三个可独立运行的入口脚本,理解它们是读懂整条链路的关键。

训练入口 train.py

paddlespeech/t2s/exps/speedyspeech/train.py 是 SpeedySpeech 的分布式训练入口。从源码结构看:

  • 设备选择优先ngpu(CUDA)、其次 XPU/NPU/MLU,最后回退 CPU(train.py);
  • 数据字段固定为phones、tones、num_phones、num_frames、feats、durations;若提供--speaker-dict则切换为多说话人batch_fn并追加spk_id字段,否则走单说话人模式(train.py);
  • 数据集通过jsonlines读取 metadata,--use-relative-path=True时会在 metadata 所在目录还原feats的相对路径(train.py),这正是链路脚本中该参数必须为True的原因;
  • 模型与训练器来自 paddlespeech/t2s/models/speedyspeech,训练循环使用Trainer+Snapshot扩展,每num_snapshots个 epoch 保存一次snapshot_iter_*.pdz——评估命令中引用的snapshot_iter_30.pdz即来源于此。

评估入口 synthesize_e2e.py

paddlespeech/t2s/exps/speedyspeech/synthesize_e2e.py 在训练后(或加载发布 checkpoint)做端到端合成验证,参数文件中它的典型参数为:

python3.7 ../../../paddlespeech/t2s/exps/speedyspeech/synthesize_e2e.py \ --speedyspeech-config=<SpeedySpeech 的 yaml 配置> \ --speedyspeech-checkpoint=<训练产出的 snapshot_iter_*.pdz> \ --speedyspeech-stat=<feats_stats.npy> \ --pwg-config=pretrain_models/pwg_baker_ckpt_0.4/pwg_default.yaml \ --pwg-checkpoint=pretrain_models/pwg_baker_ckpt_0.4/pwg_snapshot_iter_400000.pdz \ --pwg-stat=pretrain_models/pwg_baker_ckpt_0.4/pwg_stats.npy \ --text=<测试句文件> --output-dir=e2e --inference-dir=inference --ngpu=1 \ --phones-dict=<phone_id_map.txt> --tones-dict=<tone_id_map.txt>

它同时加载 SpeedySpeech 声学模型与 PWG 声码器,--speedyspeech-stat传入的 mel 均值/方差统计(feats_stats.npy)用于声学特征归一化,是合成效果的一部分来源。

推理入口 inference.py

paddlespeech/t2s/exps/speedyspeech/inference.py 是“已导出模型”的 C++ 后端推理脚本,注释标明remain for chains,即为链路测试保留。其关键实现(inference.py):

  • 参数为--inference-dir(已导出的模型目录)、--text(utt_id sentence格式文本)、--output-dir、--phones-dict、--tones-dict;
  • 兼容 PaddlePaddle 3.0 前后两套推理接口:3.0 起用inference.Config(dir, "speedyspeech")按子图名加载,旧版本用speedyspeech.pdmodel/speedyspeech.pdiparams文件路径加载,PWG 同理;
  • 两个 predictor 均开启enable_use_gpu(100, 0)与enable_memory_optim();
  • 推理时先用 paddlespeech/t2s/frontend/zh_frontend.py 的Frontend把文本转成 phone/tone id,喂给 SpeedySpeech 得到 mel,再串联喂给 PWG 得到波形,逐句写出音频。

运行前提与注意事项

  1. 执行目录:三个入口脚本与test.sh内部命令均使用相对路径(../../../回到仓库根、train_data/、pretrain_models/等),必须在 tests/chains/speedyspeech/ 目录下执行,否则路径全部失效。
  2. Python 环境:参数文件指定python:python3.7,链路按 Python 3.7 + PaddlePaddle(含 GPU 支持)环境编写;若本机解释器名不同,需要相应调整参数文件第 3 行。
  3. 网络下载:prepare.sh会从 Baidu Bos 公网地址下载数据集与预训练包(lite 约含mini_BZNSYP.tar.gz,whole 含processed_BZNSYP.tar.gz等),需要可用的网络环境;下载失败或包结构变化都会导致后续metadata.jsonl缺失。
  4. GPU 依赖:lite/whole 链路的多卡轮次要求至少 2 张可见 GPU(gpu_list:0,1);多卡轮次通过--ngpu参数走单机多卡。无 GPU 环境可参考参数文件中gpu_list:-1的 CPU 分支约定自行调整。
  5. 产物与日志:训练产物写入exp/<output-dir>/checkpoints/,端到端合成音频写入e2e/,各组合的推理日志与状态汇总在./tests/output/;lite_train_infer.sh/whole_train_infer.sh在每轮之间会rm exp -rf、rm e2e -rf清理现场,因此同一时刻只应运行一个链路。
  6. 参数文件行号协议:如前所述,test.sh按行下标解析,扩展该链路(例如增加 pact 量化训练)时,应参照 tests/chains/ds2/ 等其他链路的参数文件保持同样的行号布局,而不是随意增删行。

小结

这套 SpeedySpeech 链路测试是 PaddleSpeech 中 TTS 模型“可复现验证”的样板:README 只给出三条命令,而真正的工作量藏在prepare.sh的资源准备、*.txt参数文件的行号协议,以及test.sh对 gpu/autocast/trainer/mkldnn/trt/precision 等多维组合的遍历与状态记录中。理解这一套机制后,不仅能在本仓库中独立复现 SpeedySpeech 的训练与推理链路,也能将同一套“参数文件 + 编排脚本”的模式迁移到其他模型的链路验证场景。

  • 人工智能
  • 语音
  • 音频

【免费下载链接】PaddleSpeech

Easy-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
点击查看免费下载

相关推荐

上一篇:探索跨平台新纪元:Kotlin Multiplatform Mobile 样例项目
下一篇:在 Android 上使用 Rust 与 Binder:Birthday Service 完整实战教程

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询