- 人工智能
- 语音
- 音频
【免费下载链接】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.
本文以 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 | 含义 |
|---|---|---|
| 2 | model_name | 链路标识,本目录固定为speedyspeech |
| 3 | python | 使用的 Python 解释器(python3.7) |
| 4 | gpu_list | 依次尝试的 GPU 规格:0(单卡)、0,1(多卡)等,-1表示 CPU |
| 15 | trainer | 训练器列表,本链路只有norm_train(普通训练) |
| 16 | norm_train | 训练入口命令(train.py+ 全部训练参数) |
| 24 | eval | 评估/端到端合成命令(synthesize_e2e.py+ 全部参数) |
| 40 | inference | Paddle 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时,脚本会:
- 根据第三个参数设置
CUDA_VISIBLE_DEVICES(未指定则为空); - 对每个待推理模型目录,若参数文件中声明了导出命令则先执行导出(本链路中 infer 模式的导出位为
null,因为模型包已预导出); - 调用
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。每个训练任务完成后,脚本自动串联后续步骤:
- eval:把刚产出的 checkpoint(
--pretrain-model指向save_log/模型名)传入评估命令; - export:若声明了导出命令,则导出推理模型到
save_infer_path; - 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 得到波形,逐句写出音频。
运行前提与注意事项
- 执行目录:三个入口脚本与
test.sh内部命令均使用相对路径(../../../回到仓库根、train_data/、pretrain_models/等),必须在 tests/chains/speedyspeech/ 目录下执行,否则路径全部失效。 - Python 环境:参数文件指定
python:python3.7,链路按 Python 3.7 + PaddlePaddle(含 GPU 支持)环境编写;若本机解释器名不同,需要相应调整参数文件第 3 行。 - 网络下载:
prepare.sh会从 Baidu Bos 公网地址下载数据集与预训练包(lite 约含mini_BZNSYP.tar.gz,whole 含processed_BZNSYP.tar.gz等),需要可用的网络环境;下载失败或包结构变化都会导致后续metadata.jsonl缺失。 - GPU 依赖:lite/whole 链路的多卡轮次要求至少 2 张可见 GPU(
gpu_list:0,1);多卡轮次通过--ngpu参数走单机多卡。无 GPU 环境可参考参数文件中gpu_list:-1的 CPU 分支约定自行调整。 - 产物与日志:训练产物写入
exp/<output-dir>/checkpoints/,端到端合成音频写入e2e/,各组合的推理日志与状态汇总在./tests/output/;lite_train_infer.sh/whole_train_infer.sh在每轮之间会rm exp -rf、rm e2e -rf清理现场,因此同一时刻只应运行一个链路。 - 参数文件行号协议:如前所述,
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.
相关推荐
PaddleSpeech SpeedySpeech 训练模块详解:从 train.py 入口到多卡训练实战
PaddleSpeech SpeedySpeech 训练模块详解:从 train.py 入口到多卡训练实战 导读 本文以 PaddleSpeech 仓库中 pa
人工智能语音音频InsightFace ArcFace Paddle 飞桨训推一体认证(TIPC)测试指南:从训练、推理到 Serving 部署的一键验证
InsightFace ArcFace Paddle 飞桨训推一体认证(TIPC)测试指南:从训练、推理到 Serving 部署的一键验证 飞桨(PaddleP
人工智能计算机视觉深度学习PaddleSpeech SpeedySpeech 端到端语音合成(synthesize_e2e)实战指南:从文本到波形的完整推理链路
PaddleSpeech SpeedySpeech 端到端语音合成(synthesize_e2e)实战指南:从文本到波形的完整推理链路 导读 本文围绕 Padd
人工智能语音音频NLP媒体生成
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考