ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

ESPnet2 LJSpeech TTS 配方实战:从 FastSpeech2 训练到 XPU 形状分桶推理优化

ESPnet2 LJSpeech TTS 配方实战:从 FastSpeech2 训练到 XPU 形状分桶推理优化 人工智能语音音频深度学习NLP【免费下载链接】espnetEnd-to-End Speech Processing Toolkit项目地址https://gitcode.com/gh_mirrors/es/espnet点击查看免费下载LJSpeech 是 ESPnet2 中最经典的英语单说话人 TTS 基准语料egs2/ljspeech/tts1配方完整覆盖了 Tacotron2、Transformer、FastSpeech / FastSpeech2、Conformer-FastSpeech2、VITS、JETS 与 text2melvocoder 联合训练等主流模型。本指南以该配方为核心系统讲解 ESPnet2 TTS 配方的 9 阶段流水线、核心模型训练实操并深入剖析仓库中新增的 FastSpeech2 形状分桶shape-bucketing推理优化让你能够从数据准备开始一步步完成训练、解码与评估。配方总览LJSpeech TTS 能做什么LJSpeech 数据集约 13,100 条、24 小时左右的单说话人英语录音是 ESPnet2 用于验证各代 TTS 模型的标准语料。egs2/ljspeech/tts1/README.md顶部给出的官方用法链接指向 通用 TTS 模板 中的「How to run」「FastSpeech training」「FastSpeech2 training」「VITS training」「Joint text2wav training」等章节以及 FAQ 部分。这意味着该配方同时扮演着两个角色新模型/新配置的试炼场模板中列出的单说话人模型Tacotron2、Transformer-TTS、FastSpeech、FastSpeech2、Conformer 版 FastSpeech/FastSpeech2、VITS、JETS的示例配置都集中在 conf/tuning 目录下你可以直接拿来跑推理优化试验田README 还记录了仓库新增的「FastSpeech2 XPU Shape-Bucketing」推理优化方案提供了配套的训练/解码配置与实测性能数据。配套的 demo 目录 提供了基于 Gradio 的交互式 TTS 演示应用app.py训练完成后可以快速体验合成效果。一、Recipe 流水线9 个 Stage 一步步做什么TTS 配方的执行入口是run.sh它最终调用 tts.sh 完成全部流水线。以egs2/ljspeech/tts1为例完整执行流程即./run.sh不带任何参数时默认训练Tacotron2采用feats_typerawtoken_typephn的配置。建议新手用--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 # 解码流水线各阶段如下详见 模板 READMEStage名称核心产物 / 说明1数据准备调用local/data.sh生成 Kaldi 风格data/{tr_no_dev,dev,eval1}也可用 MFA 强制对齐参考 run_mfa.sh2Wav dump / 嵌入准备将wav.scp统一重格式化可选--use_spk_embed true抽取说话人嵌入--use_sid true/--use_lid true生成说话人/语言 ID3抽取说话人嵌入输出到dump/${spk_embed_tag}/*/下的*.ark,scp4长短数据过滤通过--min_wav_duration/--max_wav_duration过滤训练/验证集5Token 词典生成由srctexts生成 token 列表token_typechar或phn后者需指定--g2p6统计量收集计算特征归一化的均值/方差FastSpeech2 还需 F0 与能量统计7TTS 训练由--train_config/--train_args控制模型与训练超参8TTS 解码由--inference_config/--inference_args控制解码设置9TTS 评估使用 versa 计算 PESQ、STOI、MCD、F0 相关、UTMOS、DNSMOS、说话人相似度等指标1. 数据准备ESPnet 格式与 MFA 对齐默认方式是执行local/data.sh创建 Kaldi 风格数据目录。另一种新方式是使用蒙特利尔强制对齐器MFA生成音素级对齐脚本 scripts/mfa.sh 会自动下载或训练 G2P 与声学模型并生成split_sets_phn目录之后从 stage 2 继续训练# MFA 对齐生成参考 egs2/ljspeech/tts1/local/run_mfa.sh ./scripts/mfa.sh --split_sets train_set dev_set test_set \ --stage 1 --stop-stage 2 \ --train true --nj 36 --g2p_model espeak_ng_english_vits # 接着在主脚本中继续 ./run.sh --train-set train_set_phn --dev-set dev_set_phn \ --test_sets dev_set_phn test_set_phn \ --stage 2 --g2p none --cleaner none --teacher_dumpdir data2-4. 特征 dump 与数据过滤Stage 2 会统一 wav 格式并可选抽取说话人嵌入Stage 4 通过时长阈值剔除过短/过长的句子避免模型注意力学习失败。5. Token 列表生成LJSpeech 默认使用--g2p g2p_en_no_spaceESPnet 的 g2p 工具不含词间分隔符--cleaner tacotron负责文本清洗。支持的 G2P 非常多包括g2p_en、espeak_ng_*各语言、pyopenjtalk*日语、pypinyin*中文、g2pk*/korean_jaso*韩语等全部可在 phoneme_tokenizer.py 的g2p_choices中扩展。6. 统计量收集./run.sh --stage 6会计算全局均值/方差用于特征归一化。FastSpeech2 由于使用额外的 F0 与能量特征需要从 stage 5/6 开始并配合--write_collected_feats true加速后续训练。7-8. 训练与解码训练由--train_config指定模型架构与超参解码由--inference_config指定。默认解码用 Griffin-Lim 从 mel 谱合成波形要使用神经声码器如 ParallelWaveGAN 提供的 ljspeech 风格 MelGAN在 stage 8 指定--inference_args --vocoder_tag parallel_wavegan/ljspeech_style_melgan.v1即可也可以用--vocoder_file指向自己训练的声码器。9. 评估除 versa 外模板还提供 MCD、log-F0 RMSE、CER、CFSD、SECS、SpeechBERTScore 等客观指标脚本详见后文「客观评估」一节。二、FastSpeech2 训练全流程含教师模型时长蒸馏FastSpeech2 是非自回归模型训练前必须先用自回归教师模型Tacotron2/Transformer-TTS解码出时长以及 F0/能量。关键步骤# 1) 先训练教师模型Tacotron2并强制 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 # 2) 从 stage 6 开始收集额外统计量并训练 FastSpeech2 ./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--teacher_dumpdir指向包含durations的目录FastSpeech 可用普通解码产物做知识蒸馏FastSpeech2 必须用 teacher forcing 解码产物--tts_stats_dir指定统计量落盘目录--write_collected_feats true会在统计阶段顺便 dump 特征以加速训练。三、VITS / JETS 与联合训练text2mel vocoderVITS 训练要点VITS 配置面向 22.05 kHzn_fft1024, n_shift256或 44.1 kHzn_fft2048, n_shift512设计默认特征提取为linear_spectrogram。单说话人 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训练过程中可以开启tts_conf.plot_pred_mos: true实时监控伪 MOS 分数见 train_vits.yaml。多说话人场景可在tts_conf中加入spks、langs或spk_embed_dim配置配合--use_sid/--use_lid/--use_spk_embed使用。联合训练Joint text2wav联合训练让 text2mel 与声码器PWG/MelGAN/HiFiGAN/StyleMelGAN端到端 GAN 训练。从零联合训练./run.sh --stage 7 --tts_task gan_tts \ --train_config ./conf/tuning/train_joint_conformer_fastspeech2_hifigan.yaml微调预训练 text2mel 声码器则需先下载预训练模型、把 PWG 的.pklcheckpoint 转换为 ESPnet 可加载格式再编辑 finetune_joint_conformer_fastspeech2_hifigan.yaml 中的text2mel_params/generator_params/discriminator_params与init_param路径后运行。四、FastSpeech2 XPU 形状分桶Shape-Bucketing推理优化这是 ljspeech tts1 README 中最具特色的新增内容在推理时将 encoder文本 token与 decodermel 帧张量 padding 到固定的分桶边界使 oneDNN / GEMM 原语只创建一次即可在变长 batch 间复用从而消除昂贵的原语重建开销尤其适合 Intel CPU / XPU 设备与torch.compile组合使用。性能数据仓库实测配置Batch size延迟加速比Baseline无分桶8166 ms1.0x形状分桶889 ms~1.9x在 Intel Xeon / XPU 上使用torch.compile测得。默认分桶边界Encoder文本 token[16, 32, 64, 96, 128, 192, 256, 384, 512]Decodermel 帧[64, 128, 192, 256, 384, 512, 768, 1024, 1536, 2048]这些默认值覆盖典型英语 TTS 语料的长度分布可在训练配置的tts_conf中覆盖。两种开启方式Option 1 —— 环境变量适用于任何已训练模型无需改配置ESPNET_BUCKET_INFER1 \ ./run.sh --stage 8 --stop_stage 8 \ --train_config conf/tuning/train_fastspeech2.yaml \ --inference_config conf/tuning/decode_fastspeech_xpu_bucket.yamlOption 2 —— 纯配置方式把bucket_infer固化进训练配置# 训练配置自带分桶参数推理时无需再设环境变量 ./run.sh \ --train_config conf/tuning/train_fastspeech2_xpu_bucket.yaml \ --inference_config conf/tuning/decode_fastspeech_xpu_bucket.yaml # 仅推理已有预训练模型 ./run.sh --stage 8 --stop_stage 8 \ --train_config conf/tuning/train_fastspeech2_xpu_bucket.yaml \ --inference_config conf/tuning/decode_fastspeech_xpu_bucket.yaml与 torch.compile 组合想要最高吞吐可叠加 PyTorch ≥ 2.1 的torch.compile的reduce-overhead模式ESPNET_BUCKET_INFER1 \ python -m espnet2.bin.tts_inference \ --model_file model.pth \ --train_config conf/tuning/train_fastspeech2.yaml \ --compile_mode reduce-overhead \ ...相关配置文件配置说明train_fastspeech2_xpu_bucket.yaml含bucket_infer: true及分桶边界的训练配置decode_fastspeech_xpu_bucket.yaml分桶推理用的解码配置speed_control_alpha: 1、use_teacher_forcing: falsetrain_fastspeech2.yaml标准训练配置推理时用ESPNET_BUCKET_INFER1开启分桶源码级原理分桶逻辑实现在 espnet2/tts/fastspeech2/fastspeech2.py 中参数入口FastSpeech2.__init__接受bucket_infer、enc_buckets、dec_buckets三个可选参数当bucket_infer未显式指定时会读取环境变量ESPNET_BUCKET_INFER值为1即开启默认分桶边界由模块级常量DEFAULT_ENC_BUCKETS/DEFAULT_DEC_BUCKETS定义fastspeech2.py#L43-L47取桶函数_bucket_pad_size(cur_len, buckets)返回不小于当前长度的最小桶边界若超出所有桶则保持原长fastspeech2.py#L674-L680Encoder 侧仅在is_inferenceTrue且开启分桶时将xs用 0 padding 到桶大小并同步扩展 source maskpadding 位置置为被 mask此后 encoder 与时长/音高/能量预测器等 Conv1d 层都会看到固定尺寸输入从而复用 oneDNN 原语fastspeech2.py#L697-L719Decoder 侧对经过长度调节LengthRegulator的hs做同样的分桶 padding解码完成后将before_outs/after_outs裁剪回原始长度并.contiguous()保证紧凑内存布局fastspeech2.py#L818-L856。注意分桶仅影响推理训练阶段完全不生效因此不会改变模型训练行为该特性面向 Intel CPU / XPU 与 oneDNN 场景在普通 GPU 上收益有限。五、配置文件深度解读FastSpeech2 训练配置逐项注释train_fastspeech2.yaml 是标准 FastSpeech2 训练配置train_fastspeech2_xpu_bucket.yaml 与其完全一致、仅多了分桶参数。核心字段模型结构tts_conf参数值含义adim384注意力维度aheads2注意力头数elayers/dlayers4 / 4encoder / decoder 层数eunits/dunits1536 / 1536encoder / decoder FFN 单元数positionwise_layer_typeconv1d位置前馈层类型卷积核 3duration_predictor_layers/chans/kernel_size2 / 256 / 3时长预测器结构postnet_layers/filts/chans5 / 5 / 256PostNet 结构pitch_predictor_*5 层 / 256 通道 / 核 5 / dropout 0.5音高预测器energy_predictor_*2 层 / 256 通道 / 核 3 / dropout 0.5能量预测器reduction_factor1解码器帧缩减因子use_masking/use_scaled_pos_encTrue / True损失 mask、缩放位置编码init_typexavier_uniform初始化方式各类*_dropout_rate0.2Transformer 各子层 dropout特征模块pitch_extract: dioDIO 提取 F0、pitch_normalize: global_mvn、energy_extract: energy、energy_normalize: global_mvn。优化器与调度optim: adamlr: 1.0scheduler: noamlrNoam 调度model_size: 384、warmup_steps: 4000。训练策略num_iters_per_epoch: 800、max_epoch: 1000、grad_clip: 1.0、accum_grad: 8梯度累积、batch_type: numelbatch_bins: 3000000按元素数动态 batch、sort_in_batch/sort_batch: descending、keep_nbest_models: 5、best_model_criterion以 valid/train loss 最小为准。配置头部注释特别提醒FastSpeech2 需要 F0/能量特征因此必须配合feats_typeraw使用相比原论文仓库采用 FastPitch 式 token 平均音高/能量非量化。六、实验结果与预训练模型README 按「SIXTH ~ INITIAL」逆序记录了历次实验结果覆盖 JETS、VITS、Tacotron2、Conformer-FastSpeech2、FastSpeech、Transformer、Joint text2melvocoder 等模型。每次结果均包含环境信息Python/PyTorch/ESPnet 版本与 Git hash与 Zenodo/Hugging Face 预训练模型链接例如VITSFIFTH RESULTSespeak-ng 美式英语 G2P先用utils/copy_data_dir.sh复制数据目录再以--nj 32 --g2p espeak_ng_english_us_vits --cleaer tacotron批量音素化文本随后./run.sh --stage 2 --ngpu 4 --g2p none --cleaner none --tts_task gan_tts --feats_extract linear_spectrogram --feats_normalize none --train_config ./conf/tuning/train_vits.yaml --inference_model train.total_count.ave.pthTacotron2 Conformer-FastSpeech2 级联FIFTH RESULTS先以 Tacotron2 作教师解码再./run.sh --stage 5 --train_config ./conf/tuning/train_conformer_fastspeech2.yaml --teacher_dumpdir .../decode_use_teacher_forcingtrue_train.loss.aveJETSSIXTH RESULTS初始 JETS 模型的预训练权重同样托管在 Hugging Face。这些预训练模型可通过 espnet_model_zoo 或在 Python 中直接用Text2Speech.from_pretrained加载。七、客观评估与常见问题排查客观评估命令在 recipe 目录下执行先. ./path.sh# MCD ./pyscripts/utils/evaluate_mcd.py \ exp/model_dir/decode_dir/eval1/wav/wav.scp dump/raw/eval1/wav.scp # log-F0 RMSE可限制 F0 范围--f0min/--f0max ./pyscripts/utils/evaluate_f0.py \ exp/model_dir/decode_dir/eval1/wav/wav.scp dump/raw/eval1/wav.scp # 伪 MOS 预测UTMOS 等 ./pyscripts/utils/evaluate_pseudomos.py \ exp/model_dir/decode_dir/eval1/wav/wav.scp dump/raw/eval1/wav.scp # CER可用 whisper--whisper_tag base ./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_dir/decode_dir/eval1/wav/wav.scp \ exp/model_dir/decode_dir/asr_results另有evaluate_cfsd.py、evaluate_secs.py、evaluate_speechbertscore.py、evaluate_speechbleu.py等脚本均在 pyscripts/utils 目录。ASR 评估时建议先remove_punctuation.pl去标点必要时用 sox 在首尾补 0.25s 静音以获得更合理的 CER。这些客观指标对高保真语音仍难完全代表主观听感精细评估建议配合 webMUSHRA 做主观评测。FAQ 高频问题模板中已有答案ESPnet1 模型与 ESPnet2 不兼容不能直接加载minibatch 大小默认用batch_typenumelbatch_bins实现动态 batch而非batch_size模型生成结尾无意义语音多为 stop token 预测失败可尝试use_attention_constraintTrue、加大bce_pos_weight如 10.0或改用非自回归模型自有数据集训不好重点检查文本清洗、首尾静音裁剪、中间长静音切分、使用音素代替字符、小数据集考虑预训练模型微调与增大reduction_factor神经声码器输出有金属噪声通常因声码器如 MelGAN/HiFiGAN对特征失配不鲁棒可通过 GTA 微调声码器或 text2melvocoder 联合训练缓解FastSpeech2 时长来源与 FastSpeech 相同由教师模型注意力权重计算得到Tacotron2/Transformer 输出非确定decoder prenet 始终有 dropout可用--always_fix_seed固定结果在 Python 中使用模型Text2Speech.from_pretrained(model_file...)可配合vocoder_file或vocoder_tag使用声码器微调加载用--init_param格式file:src_key:dst_key:exclude_keys。总结egs2/ljspeech/tts1是 ESPnet2 理解与上手 TTS 的最佳入口9 阶段流水线、全套经典模型配置、清晰的目录结构data/→dump/→exp/一应俱全。除标准训练外仓库还在此沉淀了 FastSpeech2 的 XPU 形状分桶推理优化——通过ESPNET_BUCKET_INFER环境变量或tts_conf中的bucket_infer/enc_buckets/dec_buckets即可开启配合torch.compile在 Intel CPU / XPU 上可将 batch 8 的推理延迟从 166 ms 降至 89 ms约 1.9x 加速。无论你是要复现论文、为自有数据建配方还是在异构设备上做低延迟推理都可以从这份配方出发。赞分享人工智能语音音频深度学习NLP【免费下载链接】espnetEnd-to-End Speech Processing Toolkit项目地址https://gitcode.com/gh_mirrors/es/espnet点击查看免费下载相关推荐ESPnet2 LibriTTS-R 多说话人 TTS Recipe 实战从语料准备到 FastSpeech2 / VITS 训练与推理ESPnet2 LibriTTS R 多说话人 TTS Recipe 实战从语料准备到 FastSpeech2 / VITS 训练与推理 本指南以 egs2/人工智能语音音频深度学习NLPESPnet2 RUSLAN 配方实战俄语单讲者 TTS 的音素化数据准备与 Tacotron2 / FastSpeech2 训练全流程ESPnet2 RUSLAN 配方实战俄语单讲者 TTS 的音素化数据准备与 Tacotron2 / FastSpeech2 训练全流程 本文以 egs2/r人工智能语音音频深度学习NLPAISHELL3 多说话人中文 TTS 实战指南基于 ESPnet2 Recipe 的 Tacotron2 / FastSpeech2 / VITS 训练与调优AISHELL3 多说话人中文 TTS 实战指南基于 ESPnet2 Recipe 的 Tacotron2 / FastSpeech2 / VITS 训练与调人工智能语音音频深度学习NLP创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表