- 人工智能
- 语音
- 音频
- 深度学习
- NLP
【免费下载链接】espnet
End-to-End Speech Processing Toolkit
CMU ARCTIC 是语音合成领域经典的英文单说话人朗读语料库,本指南围绕 ESPnet2 为其提供的 TTS recipe(egs2/cmu_arctic/tts1)展开,覆盖从数据准备、统计量计算到模型训练、解码的完整流水线,并重点讲解该 recipe 独有的两套 Pretrain-Finetune 方案:一是用全部 CMU ARCTIC 说话人预训练后针对单说话人微调,二是直接使用 ESPnet Model Zoo 外部预训练模型进行微调。读完本文,你将掌握run.sh与run_pre_fine.sh的 stage 编排逻辑、--init_param参数加载语法,以及 Tacotron2 / Transformer-TTS / FastSpeech2 / VITS 等主流模型在 CMU ARCTIC 上的实际配置与运行方式。
一、CMU ARCTIC 数据集与 Recipe 概览
CMU ARCTIC 是一个专供语音合成研究的英文语料库,包含多位说话人(如slt、clb、bdl、rms、jmk、awb、ksp等),每位说话人有约 1100 句经过精心挑选、音素均衡的朗读语音,适合用来验证 TTS 模型的单说话人合成能力。
在 ESPnet2 中,该数据集的 recipe 位于 egs2/cmu_arctic/tts1,其目录结构如下:
run.sh:默认的单说话人训练入口(默认说话人为awb);run_pre_fine.sh:本 recipe 的特色脚本,用于"预训练 + 微调"两阶段训练;tts.sh:TTS 通用训练脚本(stage 编排核心),来自 egs2/TEMPLATE/tts1/tts.sh;conf/train.yaml、conf/decode.yaml:默认训练与解码配置;conf/tuning/:针对预训练/微调/多说话人场景的调优配置(如pretrain_transformer_sid.yaml、finetune_transformer.yaml、train_vits.yaml等);local/:数据下载与准备脚本(data.sh、data_download.sh、data_prep.sh等);db.sh:语料路径配置,CMU_ARCTIC=downloads表示数据可自动下载。
整个流水线基于 ESPnet2 TTS 模板 recipe 的标准 stage 划分,详细流程说明见 egs2/TEMPLATE/tts1/README.md。recipe 共分 11 个阶段:数据准备(stage 1)、wav dump 与说话人 embedding 提取(stage 2)、说话人 embedding 提取(stage 3)、长短句过滤(stage 4)、token list 生成(stage 5)、统计量收集(stage 6)、模型训练(stage 7)、解码(stage 8)、VERSA 客观评测(stage 9)、模型打包(stage 10)以及可选的 Hugging Face 上传(stage 11)。
二、单说话人基础训练:run.sh 默认流程
CMU ARCTIC recipe 默认的快速入门方式是直接运行 run.sh,它会以awb说话人为例跑完整个流水线:
$ ./run.sh该脚本的核心参数如下:
fs=16000 # 采样率 16 kHz n_fft=1024 # FFT 点数 n_shift=256 # 帧移 win_length=null # 窗长(null 表示与 n_fft 相同) spk=awb # 默认说话人 train_set=${spk}_train_no_dev valid_set=${spk}_dev test_sets=${spk}_eval train_config=conf/train.yaml inference_config=conf/decode.yaml g2p=g2p_en_no_space # 英文 G2P,不含词分隔符随后调用tts.sh,关键选项包括--lang en(英语)、--feats_type raw(直接使用原始波形特征)、--token_type phn(音素级 token)、--cleaner tacotron(Tacotron 文本清洗器)、--g2p g2p_en_no_space(英文音素化),以及--train_set/--valid_set/--test_sets三个数据集合和--srctexts data/${train_set}/text(用于生成 token list 的文本来源)。
对新手而言,建议用--stage/--stop-stage逐阶段运行以理解每个环节:
$ ./run.sh --stage 1 --stop-stage 1 # 数据准备 $ ./run.sh --stage 2 --stop-stage 2 # wav dump ... $ ./run.sh --stage 8 --stop-stage 8 # 解码运行结束后会生成data/(Kaldi 风格数据目录,含awb_train_no_dev、awb_dev、awb_eval)、dump/(特征 dump 与 token_list 词典)以及exp/(实验目录,含统计量目录tts_stats_*与模型目录tts_train_*)。默认配置下训练的是 Tacotron2(conf/train.yaml),解码时使用 Griffin-Lim 生成波形。
三、Pretrain-Finetune 方案一:使用全部 CMU ARCTIC 说话人预训练
这是 CMU ARCTIC recipe 的特色能力,脚本 run_pre_fine.sh 通过pretrain_stage与adapt_stage两个开关控制两阶段:
pretrain_stage=true # 预训练阶段 adapt_stage=true # 微调(适配)阶段预训练阶段使用spk=all(全部说话人),微调阶段使用spk=slt(目标说话人)。脚本头部注释明确说明:如果只想跑其中一阶段,将不需要的阶段设为false即可。
3.1 数据准备(stage 1-5)
预训练与微调共用同一份数据处理逻辑,先执行到统计量计算阶段:
# 从数据准备到统计量计算 $ ./run_pre_fine.sh --stop-stage 5stage 1-5 的细节对应模板文档 egs2/TEMPLATE/tts1/README.md#recipe-flow 中的标准流程。数据准备阶段由 local/data.sh 完成,它接收一个说话人参数,支持slt clb bdl rms jmk awb ksp all共 8 种取值(all表示全部说话人联合训练)。
数据划分逻辑在 local/get_utt_list.py 中实现:文件名以a开头的语句全部划入训练集;以b开头的按编号划分——编号 ≤ 339 进训练集,340-439 进开发集(dev),更大编号进评测集(eval)。这是 CMU ARCTIC 在该 recipe 中固定的 train/dev/eval 划分规则。
需要注意的是,当spk=all时,run_pre_fine.sh会在训练集合命名上使用${spk}_train_no_dev(即all_train_no_dev)、${spk}_dev(all_dev)和${spk}_eval(all_eval),并通过--local_data_opts all传给local/data.sh,走data_prep_all.sh的多说话人数据准备分支。
3.2 预训练(stage 6,pretrain_stage=true)
数据准备完成后进入预训练阶段:
# 建议使用 --tag 命名预训练实验目录 $ ./run_pre_fine.sh --stage 6预训练配置为 conf/tuning/pretrain_transformer_sid.yaml,其核心要点:
- 模型架构为 Transformer-TTS(
tts: transformer),并启用 guided attention loss 加速对角注意力学习; - 相比原始论文配置,唯一改动是
tts_conf.spks: 8(8 个说话人),这正是多说话人预训练的关键——通过 Speaker ID embedding 让模型在全部说话人数据上联合训练; - 训练规模:
max_epoch: 200、num_iters_per_epoch: 1000、batch_bins: 6000000、batch_type: numel(动态 batch); - 优化器为 Adam(
lr: 1.0),配合 Noam scheduler(warmup_steps: 8000); - 配置文件注释指出该配置需要 4 张 32 GB 显存的 GPU,在 Tesla V100 上约 1 天内完成训练。
3.3 微调(stage 6,pretrain_stage=false,adapt_stage=true)
微调阶段仅使用目标说话人slt的数据,配置切换为 conf/tuning/finetune_transformer.yaml。与预训练配置相比,微调配置做了两处关键调整(配置文件注释明确说明"Config change for finetune is lower learning rate and less number of epochs"):
- 学习率降低:
optim_conf.lr从1.0降至0.002; - 训练轮数减半:
max_epoch从200减至100; batch_bins提高到9000000(单说话人数据更小,可容纳更大 batch)。
微调的关键是让--train_args "--init_param ..."指向正确的预训练模型路径。run_pre_fine.sh脚本第 76 行已内置了路径模板:
./tts.sh \ ... --train_config conf/tuning/finetune_transformer.yaml \ --train_args "--init_param exp/tts_pretrain_transformer_sid_raw_phn_tacotron_g2p_en_no_space/train.loss.best.pth" \ ...实际操作时,需要把该路径改为你自己实验的真实目录(脚本注释也提示:Modify "--train_args "--init_param <path of the pre-trained model>"" according to the actual path of your experiment)。训练时建议用--tag命名微调实验目录以便区分:
$ ./run_pre_fine.sh --stage 6四、Pretrain-Finetune 方案二:使用外部预训练模型微调
如果不希望自己预训练,可以直接下载 ESPnet Model Zoo 中已有的预训练 TTS 模型进行微调。该流程与 egs2/jvs/tts1/README.md 中的日语微调示例结构一致,分为四步。
4.1 数据准备
先运行常规 recipe 到 stage 5(数据准备至统计量计算)。由于本方案通常面向日语(jvs 示例风格)或与预训练模型语言一致的数据,示例命令中使用了日语 G2P:
# 从数据准备到统计量计算 $ ./run.sh --stop-stage 5 --g2p pyopenjtalk_accent_with_pause--g2p pyopenjtalk_accent_with_pause表示使用 pyopenjtalk 进行日语音素化,并在音素基础上附加声调标签与停顿(pause)标签。如果你微调的是英文预训练模型,则应按预训练模型的语言选择对应的 G2P(例如英文使用g2p_en_no_space)。关于所有支持的 G2P 与 cleaner 选项,可参考模板文档 egs2/TEMPLATE/tts1/README.md#supported-text-frontend 和 egs2/TEMPLATE/tts1/README.md#supported-text-cleaner。
4.2 下载预训练模型
初始化环境并从 ESPnet Model Zoo 下载模型:
$ . ./path.sh $ espnet_model_zoo_download --unpack true --cachedir downloads kan-bayashi/ljspeech_transformer--unpack true:下载后自动解包;--cachedir downloads:缓存目录;kan-bayashi/ljspeech_transformer:Model Zoo 中的模型 ID(这里以 ljspeech 上训练的 Transformer-TTS 为例)。
如果你已经有自己的预训练模型,可以跳过本步骤,直接使用本地.pth文件路径。
4.3 替换 token list
由于微调数据与预训练模型使用同一种语言,必须使用预训练模型的 token list 而不是微调数据重新生成的 token list,否则 token 编号不一致会导致参数加载错位。具体替换方法参照 egs2/jvs/tts1/README.md 中的说明执行。
4.4 微调
从 stage 6 开始运行,通过--train_args指定--init_param加载预训练参数(也可以直接写入*.yaml训练配置中):
# 建议使用 --tag 命名实验目录 $ ./run.sh \ --stage 6 \ --g2p pyopenjtalk_accent_with_pause \ --train_config conf/tuning/finetune_tacotron2.yaml \ --train_args "--init_param downloads/0afe7c220cac7d9893eea4ff1e4ca64e/exp/tts_train_tacotron2_raw_phn_jaconv_pyopenjtalk_accent_with_pause/train.loss.ave_5best.pth:tts:tts" \ --tag finetune_tacotron2_raw_phn_jaconv_pyopenjtalk_accent_with_pause这里--train_config使用了微调专用配置 conf/tuning/finetune_tacotron2.yaml(Tacotron2 微调场景)。--init_param的路径通常位于downloads/<hash>/exp/tts_train_*/...下(由espnet_model_zoo_download解包产生)。
五、--init_param 参数加载语法详解
--init_param是 ESPnet2 预训练/微调的核心机制,其通用格式为:
--init_param <file_path>:<src_key>:<dst_key>:<exclude_keys>字段含义:
| 字段 | 含义 | 缺省行为 |
|---|---|---|
file_path | 预训练模型.pth文件路径 | 必填 |
src_key | 源模型(预训练模型)中要加载的参数前缀 | 缺省加载全部参数 |
dst_key | 目标模型(新模型)中接收参数的键前缀 | 缺省与src_key相同 |
exclude_keys | 需要排除的参数前缀(可多个,用逗号分隔) | 缺省不排除 |
典型用法(对应模板文档 egs2/TEMPLATE/tts1/README.md FAQ 中的示例):
# 加载全部参数 python -m espnet2.bin.tts_train --init_param model.pth # 只加载源模型中 "tts.dec" 开头的参数(目标键同名) python -m espnet2.bin.tts_train --init_param model.pth:tts.dec # 加载源模型 "decoder" 前缀参数,写入目标 "tts.dec" python -m espnet2.bin.tts_train --init_param model.pth:decoder:tts.dec # 加载 decoder.pth 的全部参数到目标 "tts.dec" python -m espnet2.bin.tts_train --init_param decoder.pth::tts.dec # 加载全部参数,但排除 "tts.enc.embed" python -m espnet2.bin.tts_train --init_param model.pth:::tts.enc.embed # 加载全部参数,排除 "tts.enc.embed" 和 "tts.dec" python -m espnet2.bin.tts_train --init_param model.pth:::tts.enc.embed,tts.decCMU ARCTIC 文档中给出的--init_param /path/to/model.pth:a:b表示"把 model.pth 中键前缀为 a 的参数加载到新模型的键前缀 b";而:tts:tts则表示加载除特征归一化器(feature normalizer)之外的所有参数——因为特征归一化器(如均值方差统计)应基于微调数据重新计算,不能继承预训练模型的值。该机制的底层实现在 espnet2/torch_utils/load_pretrained_model.py,由训练任务框架 espnet2/tasks/abs_task.py 在训练初始化时调用。
六、多说话人与多模型扩展
CMU ARCTIC recipe 除了上述预训练/微调流程,还支持通过替换训练配置训练多种模型架构,配置均位于 egs2/cmu_arctic/tts1/conf/tuning:
| 配置文件 | 模型 | 场景 |
|---|---|---|
train_tacotron2.yaml | Tacotron2 | 单说话人基线 |
train_transformer.yaml/train_transformer_pre.yaml | Transformer-TTS | 单说话人 / 预训练 |
pretrain_transformer_sid.yaml | Transformer-TTS + SID | 8 说话人联合预训练 |
finetune_transformer.yaml | Transformer-TTS | 单说话人微调 |
finetune_tacotron2.yaml | Tacotron2 | 外部预训练模型微调 |
train_conformer_fastspeech2.yaml | Conformer-FastSpeech2 | 非自回归快速合成 |
train_vits.yaml/train_multi_spk_vits.yaml | VITS | 端到端文本到波形 |
6.1 FastSpeech / FastSpeech2 训练
FastSpeech 系列是非自回归模型,训练前必须先用教师模型(Tacotron2 或 Transformer-TTS)解码出音素时长。先对全部数据集(含训练集)做解码生成durations:
$ ./run.sh --stage 8 \ --tts_exp exp/tts_train_raw_phn_tacotron_g2p_en_no_space \ --test_sets "tr_no_dev dev eval1"FastSpeech 可以直接用教师模型生成的特征做知识蒸馏训练:
$ ./run.sh --stage 7 \ --train_config conf/tuning/train_fastspeech.yaml \ --teacher_dumpdir exp/tts_train_raw_phn_tacotron_g2p_en_no_space/decode_train.loss.aveFastSpeech2 则必须使用 teacher forcing 解码得到与真实语音对齐的时长:
$ ./run.sh --stage 8 \ --tts_exp exp/tts_train_raw_phn_tacotron_g2p_en_no_space \ --inference_args "--use_teacher_forcing true" \ --test_sets "tr_no_dev dev eval1" # 由于 FastSpeech2 额外使用 F0 和 energy 特征,需从 stage 6 起重新收集统计量 $ ./run.sh --stage 6 \ --train_config conf/tuning/train_fastspeech2.yaml \ --teacher_dumpdir exp/tts_train_raw_phn_tacotron_g2p_en_no_space/decode_use_teacher_forcingtrue_train.loss.ave \ --tts_stats_dir exp/tts_train_raw_phn_tacotron_g2p_en_no_space/decode_use_teacher_forcingtrue_train.loss.ave/stats \ --write_collected_feats true--tts_stats_dir指定统计量输出目录,--write_collected_feats true可在统计量计算时同时 dump 特征以加速后续训练(可选但推荐)。
6.2 VITS 端到端训练
VITS 直接以波形为输出目标,无需外部声码器。其配置硬编码针对22.05 kHz 或 44.1 kHz采样率,特征提取默认使用linear_spectrogram,feats_normalize设为none(不做均值方差归一化)。以 22.05 kHz 单说话人为例:
$ ./run.sh --stage 2 \ --ngpu 4 \ --fs 22050 \ --n_fft 1024 \ --n_shift 256 \ --win_length null \ --dumpdir dump/22k \ --expdir exp/22k \ --tts_task gan_tts \ --feats_extract linear_spectrogram \ --feats_normalize none \ --train_config ./conf/tuning/train_vits.yaml \ --inference_config ./conf/tuning/decode_vits.yaml \ --inference_model latest.pth多说话人场景可加--use_sid true并改用train_multi_spk_vits.yaml配置。VITS 训练耗时较长,通常约 10 万步训练后即可生成合理质量的语音;训练期间可在配置中开启tts_conf.plot_pred_mos: true用伪 MOS 预测模型实时监控合成质量。
6.3 说话人 embedding 扩展
多说话人模型还可使用说话人 embedding(X-Vector)或 Speaker ID embedding。前者在 stage 2-3 用--use_spk_embed true提取,配置中通过tts_conf.spk_embed_dim(如 512)指定维度;后者用--use_sid true提取,配置中通过tts_conf.spks指定说话人数量。CMU ARCTIC 预训练方案正属于后者的应用——pretrain_transformer_sid.yaml中的spks: 8即对应 8 位说话人的联合建模。
七、模型评测与 FAQ 精选
7.1 客观指标评测
模板 recipe 提供多种客观评测指标:MCD(梅尔倒谱距离)、log-F0 RMSE、CER(字符错误率)、CFSD、SECS(说话人 embedding 余弦相似度)以及 SpeechBERTScore / SpeechBLEU 等离散语音指标。示例(在 recipe 目录下):
cd egs2/cmu_arctic/tts1 . ./path.sh # MCD 与 log-F0 RMSE ./pyscripts/utils/evaluate_mcd.py exp/<model>/<decode>/eval1/wav/wav.scp dump/raw/eval1/wav.scp ./pyscripts/utils/evaluate_f0.py exp/<model>/<decode>/eval1/wav/wav.scp dump/raw/eval1/wav.scp # 伪 MOS 自动评测 ./pyscripts/utils/evaluate_pseudomos.py exp/<model>/<decode>/eval1/wav/wav.scp dump/raw/eval1/wav.scp # CER(需 ASR 模型) ./scripts/utils/evaluate_asr.sh \ --model_tag <asr_model_tag> \ --nj 1 \ --inference_args "--beam_size 10 --ctc_weight 0.4 --lm_weight 0.0" \ --gt_text "dump/raw/eval1/text" \ exp/<model>/<decode>/eval1/wav/wav.scp exp/<model>/<decode>/asr_results客观指标能辅助估计合成质量,但无法完全替代主观听感评测,细致的主观评测推荐使用 webMUSHRA 搭建网页评测系统。
7.2 常见问题(FAQ)
- 模型在句尾生成无意义语音:通常是模型未能预测停止 token(stop token)。解决手段:Tacotron2 推理时启用
use_attention_constraint注意力约束;增大bce_pos_weight(如 10.0);或改用非自回归模型(FastSpeech/FastSpeech2)。 - Tacotron2 / Transformer 输出不确定:因为解码器 prenet 始终使用 dropout。如需固定结果,可在推理时使用
--always_fix_seed选项(见 espnet2/bin/tts_inference.py)。 - 自建数据集训练不佳:多数问题源于数据清洗不到位。建议检查训练期间注意力图(TTS 中 loss 数值参考意义有限)、去除句首句尾静音、将过长静音切分、有 G2P 时优先用音素而非字符、尽可能清理文本(缩写、数字等)、语料过小时优先考虑基于预训练模型的适配(adaptation)或增大 reduction factor。
- 结合神经声码器出现金属音:常见于未以噪声为输入的声码器(如 MelGAN、HiFiGAN)对声学特征失配不鲁棒。可通过声码器 GTA 微调或文本到波形联合训练缓解。
- minibatch 大小如何调整:默认使用
batch_type: numel与batch_bins(而非batch_size)实现动态 batch,调整batch_bins即可控制单 batch 的 token 总量上限。
八、总结
CMU ARCTIC TTS recipe 是 ESPnet2 中展示"预训练 + 微调"范式的最佳示例之一。通过 run_pre_fine.sh 可以在 8 位说话人数据上预训练多说话人模型,再低成本适配到单个目标说话人;也可以借助 ESPnet Model Zoo 的外部预训练模型快速微调。配合--init_param灵活的参数加载语法(file:src_key:dst_key:exclude_keys)、模板 recipe 的标准化 stage 流程,以及 Tacotron2 / Transformer / FastSpeech2 / VITS 等丰富模型配置,这一 recipe 既适合语音合成初学者从零跑通完整流水线,也适合研究者快速开展跨说话人迁移、低资源适配等实验。更完整的 stage 细节、模型清单与 FAQ 可随时查阅模板文档 egs2/TEMPLATE/tts1/README.md。
- 人工智能
- 语音
- 音频
- 深度学习
- NLP
【免费下载链接】espnet
End-to-End Speech Processing Toolkit
相关推荐
5 分钟跑通:LocalAI 私有化部署全攻略
5 分钟跑通:LocalAI 私有化部署全攻略 公司合规不让把内部文档丢给外部 API 服务,内网环境又没法测试模型,或者你单纯不想按 token 付费——这就
人工智能语音音频深度学习NLPEF Core Native AOT 测试工程解析:逐文件生成 AOT 发布工程并约定返回码 100 的验证机制
EF Core Native AOT 测试工程解析:逐文件生成 AOT 发布工程并约定返回码 100 的验证机制 EF Core 仓库中的 EFCore.Nat
人工智能语音音频深度学习NLP基于 ESPnet2 tts2 Recipe 训练离散单元 TTS:LJSpeech 单说话人 FastSpeech2 实战指南
基于 ESPnet2 tts2 Recipe 训练离散单元 TTS:LJSpeech 单说话人 FastSpeech2 实战指南 本文以 ESPnet 仓库中的
人工智能语音音频深度学习NLP
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考