ESPnet2 CMU ARCTIC TTS Recipe 实战指南:单说话人训练与 Pretrain-Finetune 微调全流程
人工智能语音音频深度学习NLP【免费下载链接】espnetEnd-to-End Speech Processing Toolkit项目地址https://gitcode.com/gh_mirrors/es/espnet点击查看免费下载CMU ARCTIC 是语音合成领域经典的英文单说话人朗读语料库本指南围绕 ESPnet2 为其提供的 TTS recipeegs2/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默认的单说话人训练入口默认说话人为awbrun_pre_fine.sh本 recipe 的特色脚本用于预训练 微调两阶段训练tts.shTTS 通用训练脚本stage 编排核心来自 egs2/TEMPLATE/tts1/tts.shconf/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_ARCTICdownloads表示数据可自动下载。整个流水线基于 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该脚本的核心参数如下fs16000 # 采样率 16 kHz n_fft1024 # FFT 点数 n_shift256 # 帧移 win_lengthnull # 窗长null 表示与 n_fft 相同 spkawb # 默认说话人 train_set${spk}_train_no_dev valid_set${spk}_dev test_sets${spk}_eval train_configconf/train.yaml inference_configconf/decode.yaml g2pg2p_en_no_space # 英文 G2P不含词分隔符随后调用tts.sh关键选项包括--lang en英语、--feats_type raw直接使用原始波形特征、--token_type phn音素级 token、--cleaner tacotronTacotron 文本清洗器、--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_*。默认配置下训练的是 Tacotron2conf/train.yaml解码时使用 Griffin-Lim 生成波形。三、Pretrain-Finetune 方案一使用全部 CMU ARCTIC 说话人预训练这是 CMU ARCTIC recipe 的特色能力脚本 run_pre_fine.sh 通过pretrain_stage与adapt_stage两个开关控制两阶段pretrain_stagetrue # 预训练阶段 adapt_stagetrue # 微调适配阶段预训练阶段使用spkall全部说话人微调阶段使用spkslt目标说话人。脚本头部注释明确说明如果只想跑其中一阶段将不需要的阶段设为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 划分规则。需要注意的是当spkall时run_pre_fine.sh会在训练集合命名上使用${spk}_train_no_dev即all_train_no_dev、${spk}_devall_dev和${spk}_evalall_eval并通过--local_data_opts all传给local/data.sh走data_prep_all.sh的多说话人数据准备分支。3.2 预训练stage 6pretrain_stagetrue数据准备完成后进入预训练阶段# 建议使用 --tag 命名预训练实验目录 $ ./run_pre_fine.sh --stage 6预训练配置为 conf/tuning/pretrain_transformer_sid.yaml其核心要点模型架构为 Transformer-TTStts: transformer并启用 guided attention loss 加速对角注意力学习相比原始论文配置唯一改动是tts_conf.spks: 88 个说话人这正是多说话人预训练的关键——通过 Speaker ID embedding 让模型在全部说话人数据上联合训练训练规模max_epoch: 200、num_iters_per_epoch: 1000、batch_bins: 6000000、batch_type: numel动态 batch优化器为 Adamlr: 1.0配合 Noam schedulerwarmup_steps: 8000配置文件注释指出该配置需要 4 张 32 GB 显存的 GPU在 Tesla V100 上约 1 天内完成训练。3.3 微调stage 6pretrain_stagefalseadapt_stagetrue微调阶段仅使用目标说话人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减至100batch_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_transformerModel 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.yamlTacotron2 微调场景。--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.yamlTacotron2单说话人基线train_transformer.yaml/train_transformer_pre.yamlTransformer-TTS单说话人 / 预训练pretrain_transformer_sid.yamlTransformer-TTS SID8 说话人联合预训练finetune_transformer.yamlTransformer-TTS单说话人微调finetune_tacotron2.yamlTacotron2外部预训练模型微调train_conformer_fastspeech2.yamlConformer-FastSpeech2非自回归快速合成train_vits.yaml/train_multi_spk_vits.yamlVITS端到端文本到波形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 eval1FastSpeech 可以直接用教师模型生成的特征做知识蒸馏训练$ ./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_spectrogramfeats_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 扩展多说话人模型还可使用说话人 embeddingX-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模型在句尾生成无意义语音通常是模型未能预测停止 tokenstop 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【免费下载链接】espnetEnd-to-End Speech Processing Toolkit项目地址https://gitcode.com/gh_mirrors/es/espnet点击查看免费下载相关推荐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 训练离散单元 TTSLJSpeech 单说话人 FastSpeech2 实战指南基于 ESPnet2 tts2 Recipe 训练离散单元 TTSLJSpeech 单说话人 FastSpeech2 实战指南 本文以 ESPnet 仓库中的人工智能语音音频深度学习NLP上一篇FTXUI 通过 XMake 包管理器集成xmake.lua 配置与实战指南下一篇League Akari英雄联盟工具箱基于LCU API的全能游戏助手创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →