尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

ESPnet2 Recipe Template 实战指南:用自有语料搭建 ASR/TTS 训练流程与 Kaldi 风格数据准备

发布时间:2026/9/24 15:11:45

资讯中心
01
ARTICLE

ESPnet2 Recipe Template 实战指南:用自有语料搭建 ASR/TTS 训练流程与 Kaldi 风格数据准备

ESPnet2 Recipe Template 实战指南:用自有语料搭建 ASR/TTS 训练流程与 Kaldi 风格数据准备
人工智能语音音频深度学习NLP【免费下载链接】espnetEnd-to-End Speech Processing Toolkit项目地址https://gitcode.com/gh_mirrors/es/espnet点击查看免费下载导读ESPnet2 采用「任务级统一 Recipe」的设计思路不再像 ESPnet1 那样为每个语料单独编写全套脚本而是为 ASR、TTS、增强、翻译等每个任务维护一份通用模板脚本如asr.sh通过命令行参数吸收不同语料的差异。本文以仓库中的 Recipe Template 文档 为主体结合 egs2/TEMPLATE/asr1/ 下的setup.sh、asr.sh、db.sh等真实源码系统讲解如何用模板在自有语料上快速跑通端到端训练、如何手工构造 Kaldi 风格的data/目录以及开发者如何把 ESPnet1/Kaldi 的老 Recipe 移植为 ESPnet2 新 Recipe。读完本文你将掌握从「一份原始音频 标注」到「可训练、可解码、可评分」的完整落地路径。一、Recipe Template 是什么Recipe配方/流程脚本是 ESPnet 中把「数据准备 → 特征提取 → 词表构建 → 语言模型训练 → ASR 模型训练 → 解码 → 评分 → 打包 → 上传」等步骤串联起来的可执行流水线。egs2/TEMPLATE/README.md指出模板被设计为支持每个任务常见且通用的功能与需求从而让用户无需修改 Recipe 主体只需补充语料相关的一小段数据准备脚本即可。仓库中模板按任务划分在 egs2/TEMPLATE/ 下每个任务一个目录例如asr1语音识别核心示例脚本名为asr.shenh1语音增强enh.shtts1/tts2语音合成tts.shmt1机器翻译mt.shst1语音翻译st.shs2t1语音到文本s2t.shenh_asr1、enh_diar1、sds1、ssl1、spk1等更多任务以asr1为例模板目录包含以下关键内容见 egs2/TEMPLATE/asr1/文件/目录作用setup.sh一键把模板复制到新语料目录的引导脚本asr.sh通用 ASR 主流水线15 个 stage约 1800 行path.sh设置 PATH、Python 环境、工具路径cmd.sh选择本地执行 / SLURM / PBS 等运行队列方式db.sh集中登记各语料的下载路径或本地路径local/语料相关的数据准备与评分脚本每个 Recipe 需要自定义的部分conf/特征、训练、解码、队列配置fbank.conf、train_asr_*.yaml、decode_asr_*.yaml等scripts/、pyscripts/、steps/、utils/公共工具脚本通常以符号链接指向模板从源码看setup.sh见 egs2/TEMPLATE/asr1/setup.sh做的事非常明确复制cmd.sh、conf、local三个部分到目标目录这些是需要按语料定制的内容符号链接asr.sh、path.sh、db.sh、scripts、pyscripts、steps、utils到模板这些是公共内容软链可保证升级模板时自动同步。这样设计的好处是同一份asr.sh被所有语料共享任何 bug 修复或新特性只需改模板一处。二、用自有语料运行 ESPnet三步上手原文档给出了最核心的三步流程下面结合源码逐一展开。第 1 步复制模板到自己的语料目录% taskasr1 # enh1, tts1, mt1, st1 % egs2/TEMPLATE/${task}/setup.sh egs2/foo/${task}执行后egs2/foo/${task}下会生成可直接修改的工作目录cmd.sh、conf/、local/被真实复制其余公共文件以符号链接形式存在。setup.sh还做了两项校验源码第 18-31 行必须恰好传入 1 个目标目录参数且目标目录的上级须存在TEMPLATE目录否则报错退出。第 2 步创建egs2/foo/${task}/data目录data/是训练、验证、测试数据的存放处采用 Kaldi 风格结构下一节详解。如果你的语料在egs2下已有对应 Recipe如mini_an4、librispeech也可以直接参考其local/data.sh的实现。第 3 步运行主脚本原文档以 ASR 为例给出了最小启动命令cd egs2/foo/${task} # 官方约定所有脚本都在该目录下执行 # 假设 Stage1 已经生成 data可直接从 Stage2 开始 ./asr.sh \ --stage 2 \ --ngpu 1 \ --train_set train \ --valid_set valid \ --test_sets test \ --lm_train_text data/train/text要点说明必须cd到 Recipe 目录执行。asr.sh依赖相对路径如./path.sh、utils/parse_options.sh、conf/*.yaml离开该目录会导致解析失败。--stage 2表示跳过 Stage 1数据准备假定data/已就绪从速度扰动阶段开始。--ngpu 1指定使用 1 块 GPU设为0则纯 CPU 运行见 asr.sh 中ngpu1 # The number of gpus (0 uses cpu, otherwise use gpu)。--train_set/--valid_set/--test_sets是必填项asr.sh在进入主流程前会做严格校验源码第 301-331 行未指定--train_set/--valid_set直接报错退出train_set与valid_set不允许相同test_sets中不允许出现train_set。若遇到 CUDA 显存不足OOM应调小batch_bins或batch_size而不是盲目增大nj。指定 GPU 设备号可使用环境变量CUDA_VISIBLE_DEVICES。下面这张表汇总了asr.sh中最常用的参数默认值均来自 asr.sh 的源码便于按需调整参数默认值说明--stage/--stop_stage1/10000流水线起止阶段--skip_stages空指定要跳过的阶段--ngpu1GPU 数量0表示 CPU--num_nodes1分布式训练的节点数--nj32数据/特征阶段的并行任务数--inference_nj32解码阶段的并行任务数--gpu_inferencefalse是否用 GPU 解码--dumpdir/--expdirdump/exp特征与实验输出目录--feats_typerawraw、raw_copy、fbank_pitch、fbank、extracted--audio_formatflacwav、flac、wav.ark、flac.ark仅raw系列有效--fs16k采样率需与语料实际采样率匹配--min_wav_duration/--max_wav_duration0.1/20训练音频时长过滤区间秒--token_typebpebpe、char、word、whisper_en、whisper_multilingual、hugging_face--nbpe30BPE 词表大小--bpemodeunigramunigram或bpe--use_lmtrue解码时是否使用语言模型--lm_config/--lm_args空LM 训练配置与覆盖参数--asr_config/--asr_args空ASR 训练配置与覆盖参数--inference_config/--inference_args空解码配置与覆盖参数--inference_asr_modelvalid.acc.ave.pth解码所用模型快照也常用valid.loss.ave.pth--download_model空直接从 Model Zoo 下载预训练模型用于解码--use_ngramfalse是否训练并使用 n-gram 语言模型--feats_normalizeglobal_mvn特征归一化方式--use_streaming/--use_maskctcfalse流式解码 / Mask-CTC 解码--train_set/--valid_set/--test_sets空必填训练/验证/测试数据目录名几个值得注意的源码细节--lm_train_text未指定时会自动复用训练集文本源码第 374 行Use the same text as ASR for lm training if not specified所以最小启动命令里即使不写它也通常没问题。指定--feats_type raw时特征目录为${dumpdir}/raw源码第 334-349 行选择不支持的feats_type会直接报错退出。--token_type支持多种词表策略bpeSentencePiece、char、word、whisper_*复用 Whisper 词表以及hugging_face需配合--hugging_face_model_name_or_path源码第 402-424 行逐一分支处理。通过--lm_args/--asr_args/--inference_args传入的覆盖参数会自动拼进实验目录的 tag 中源码第 452-455 行保证不同参数组合的产物目录不互相覆盖这也是推荐「先用 yaml 配置再在命令行覆盖」的原因。三、Kaldi 风格 data 目录格式与构造详解训练集、开发集、测试集各自拥有完全相同的目录结构详见原文档「About Kaldi style data directory」一节。data/train、data/dev、data/test三者并列内部文件格式完全一致。3.1 目录结构总览data/ train/ - text # 转写文本 - wav.scp # 音频文件路径 - utt2spk # 发音单元(utterance) id 到说话人(spk) id 的映射 - spk2utt # 说话人 id 到发音单元 id 列表的映射 - segments # [可选] 指定每条发音的起止时间 dev/ ... test/ ...3.2 各文件格式text转写文件uttidA transcription uttidB transcription ...wav.scp音频路径文件uttidA /path/to/uttidA.wav uttidB /path/to/uttidB.wav ...utt2spk发音单元 → 说话人uttidA speakerA uttidB speakerB uttidC speakerA uttidD speakerB ...spk2utt说话人 → 发音单元列表speakerA uttidA uttidC ... speakerB uttidB uttidD ... ...原文档特别强调spk2utt可由utt2spk生成反之亦然因此手工创建时二选一即可用模板自带的 Perl 工具互转utils/utt2spk_to_spk2utt.pl data/train/utt2spk data/train/spk2utt utils/spk2utt_to_utt2spk.pl data/train/spk2utt data/train/utt2spk没有说话人信息怎么办原文档给出两种兜底方案把说话人 id 设成与发音单元 id 相同或全部填同一个dummyid。它同时指出「对于 asr recipe我们实际上并不使用说话人信息」所以这种占位做法不会影响 ASR 训练。uttidA uttidA uttidB uttidB ...或uttidA dummy uttidB dummy ...3.3 可选文件segments长音频切分如果原始录音很长约 1 小时且一个音频文件里包含多段语音就需要segments指定每条发音的起止时间格式为utterance_id wav_id start_time end_timesw02001-A_000098-001156 sw02001-A 0.98 11.56 ...关键约定使用segments时wav.scp中的键是wav_id而非utterance_idsw02001-A对应整段录音而sw02001-A_000098-001156是切出的某条发音sw02001-A /path/to/sw02001-A.wav ...从asr.shStage 3 的注释源码第 643-649 行可以印证这条约定segments用于把wav.scp中的整段录音按segment_id record_id start_time end_time切分为发音单元时间单位为秒。3.4 目录校验validate_data_dir.sh手工构造完data/后强烈建议用官方校验脚本检查格式是否合法utils/validate_data_dir.sh --no-feats data/train utils/validate_data_dir.sh --no-feats data/dev utils/validate_data_dir.sh --no-feats data/test--no-feats表示跳过特征文件检查因为我们只有wav.scp没有预提取的feats.scp。该校验脚本能及时发现wav.scp键不一致、text缺失、时间戳格式错误等常见问题。3.5 推荐实践先跑 mini_an4 感受数据结构原文档建议通过mini_an4亲自检查data/的实际内容cd egs2/mini_an4/asr1 ./run.shegs2/mini_an4/asr1/run.sh 展示了run.sh的真实形态——它只是asr.sh的一层薄封装把数据集名称与配置文件集中传递./asr.sh \ --nj 2 \ --inference_nj 2 \ --lang en \ --asr_config conf/train_asr_rnn_debug.yaml \ --lm_config conf/train_lm_rnn_debug.yaml \ --inference_config conf/decode_asr_debug.yaml \ --train_set train_nodev \ --valid_set train_dev \ --test_sets train_dev test test_seg \ --lm_train_text data/train_nodev/text $跑完run.sh后查看data/train_nodev/下的text、wav.scp、utt2spk、spk2utt就能直观理解上述格式约定。四、开发者向如何制作 / 移植一个新的 Recipe原文档第三部分是给开发者看的「How to make/port new recipe」。ESPnet2 与 ESPnet1 最大的不同在于不为每个语料准备不同 Recipe而是每个任务一套通用 Recipeasr.sh、enh.sh、tts.sh等。这些通用脚本被精心设计为适用于任意语料理想情况下你几乎不需要修改 Recipe 主体唯一必须自己做的是local/data.sh。4.1 建立目录与 run.sh% taskasr1 # enh1, tts1, mt1, st1 % egs2/TEMPLATE/${task}/setup.sh egs2/foo/${task} % cd egs2/foo/${task} % cp ../../mini_an4/${task}/run.sh . % vi run.shrun.sh是通用 Recipe 的薄封装内容形如# The contents of run.sh ./asr.sh \ --train_set train \ --valid_set dev \ --test_sets dev test1 test2 \ --lm_train_text data/train/text $注意末尾的$它把用户在命令行额外传入的--xxx参数原样转发给asr.sh这是run.sh保持灵活性的关键设计。4.2 local/data.sh唯一的必写脚本原文档给出四条核心原则语料差异必须通过asr.sh的命令行参数吸收不要擅自修改公共脚本。local/data.sh负责生成 Kaldi 风格的data/train训练、data/dev验证以及多个data/test1、data/test2测试目录对应asr.sh的 Stage 1源码第 572-576 行直接调用local/data.sh ${local_data_opts}。特征提取、速度扰动Speed Perturbation、长短句过滤都由公共阶段完成local/data.sh中不需要也不应该重复实现这些步骤见原文档对「Feature extraction, Speed Perturbation, Removing long/short utterances」的说明。从 ESPnet1 或 Kaldi 移植时只需把原 Recipe 的数据准备部分嵌入local/data.sh。4.3 关于验证集与测试集的几条约定验证集必须只有一份训练期间的验证集--valid_set必须是单个数据目录。如果有多个验证目录用utils/combine_data.sh合并。测试集可以有多份推理阶段--test_sets接受多个测试目录因此可以顺手把验证集也纳入评估。部分语料没有官方 dev 集此时可以从训练数据中切出一部分作为验证集其余仍作训练集原文档举例egs2/csj/asr1/local/data.sh就是这么做的。asr.sh的自动去重逻辑源码第 316-331 行若test_sets里包含valid_set脚本会自动把eval_valid_set置为true并把验证集从test_sets中剔除避免重复评估test_sets内部的重复项也会被自动去重。4.4 在 db.sh 登记语料路径如果 Recipe 依赖的语料尚未在 egs2/TEMPLATE/asr1/db.sh 中登记则需要补充一行... YOUR_CORPUS ...db.sh中已登记了大量语料值有三种形态从文件头注释「downloadsmeans the corpus can be downloaded by the recipe automatically」可以确认downloads表示 Recipe 能自动下载该语料如LIBRISPEECHdownloads、AN4downloads空值等待用户填写本地路径绝对路径某些机构环境预置的路径db.sh底部还有针对 CMU TIR、JHU CLSP 等特定环境的hostname分支自动覆盖对应语料路径。因此新增语料时把YOUR_CORPUS改成你的本地路径或downloads即可。4.5 特殊工具依赖写入 local/path.sh如果 Recipe 依赖某些特殊命令行工具在local/path.sh中声明# e.g. flac command is required if ! which flac /dev/null; then echo Error: flac is not installed return 1 fipath.sh会在主流程加载时执行asr.sh源码第 296 行. ./path.sh工具缺失会提前暴露避免跑到一半才失败。注意path.sh面向的是「配方所需的外部命令」而 Python 解释器等公共环境由模板级path.sh统一处理。五、asr.sh 的 15 阶段流水线一次跑通全流程结合源码asr.sh 中各log Stage N: ...语句asr.sh从数据到部署的完整流水线如下这也是理解模板设计的最直观方式Stage内容源码位置1数据准备调用local/data.sh生成data/{train,valid,test}asr.sh#L572-L5762速度扰动对train_set按speed_perturb_factors生成train_spasr.sh#L579-L5993特征处理raw模式下格式化wav.scp统一格式与采样率fbank_pitch等模式下提取特征asr.sh#L615-L7604长短句过滤按min/max_wav_duration清洗dump/数据asr.sh#L8015词表构建按token_type生成 BPE / char / word / whisper / hugging_face 的token_listasr.sh#L879-L10086LM 统计量收集collect statsasr.sh#L10097LM 训练asr.sh#L10868LM 困惑度perplexity评估asr.sh#L11629n-gram 训练需use_ngramtrueasr.sh#L118110ASR 统计量收集collect statsasr.sh#L119111ASR 模型训练asr.sh#L131012解码含 k2 / streaming / Mask-CTC / n-best 重打分等可选路径asr.sh#L151313评分默认走sclite可通过score_opts/local_score_opts定制asr.sh#L165414打包模型packasr.sh#L176015上传模型到 HuggingFacehf_repo指定仓库asr.sh#L1793几个与阶段编排直接相关的参数组合--skip_data_prep true自动跳过 Stage 1-5源码第 544-546 行。--skip_train true跳过训练相关阶段2/4/5/6/7/8/9/10/11只做数据与解码评估。--use_lm false跳过 LM 相关阶段 6/7/8。--use_ngram false默认跳过 Stage 9。--skip_eval true跳过 Stage 12/13。--skip_packing默认true与--skip_upload_hf默认true默认不执行打包与上传需要时手动打开。特征配置方面conf/fbank.conf 提供了 fbank 提取的默认参数--sample-frequency16000、--num-mel-bins80conf/pitch.conf 提供 pitch 特征参数队列配置则在 conf/ 下的queue.conf本地/多机、slurm.confSLURM 集群、pbs.confPBS 集群中选择并由cmd.sh切换。实际语料通常在 egs2/librispeech/asr1/conf/ 这类目录中提供更完整的train_asr_*.yaml与decode_asr_*.yaml参考配置。六、总结模板使用的完整心智模型把原文档与仓库源码合起来看Recipe Template 的使用可以归结为三层普通用户跑通自有语料setup.sh复制模板 → 构造 Kaldi 风格data/textwav.scputt2spk/spk2utt长音频加segments→utils/validate_data_dir.sh校验 → 从--stage 2起跑asr.sh必要时调整batch_bins解决显存问题。格式细节四个核心文件text/wav.scp/utt2spk/spk2utt的键值约定、segments的utterance_id wav_id start end四列格式、以及「用segments时wav.scp以wav_id为键」的隐含规则。开发者制作/移植 Recipe只写local/data.sh生成train/dev/test的 Kaldi 目录、在run.sh中传参、在db.sh登记语料路径、在local/path.sh声明特殊工具依赖特征提取、速度扰动、长短句过滤、训练与解码全部复用公共流水线。验证集只能有一份多个则combine_data.sh合并测试集可以有多个asr.sh会自动处理test_sets与valid_set重叠的情况。掌握这套模板机制后无论是跑通一个新的开源语料还是把 ESPnet1/Kaldi 时代的老 Recipe 迁移到 ESPnet2都能以最小的代码量完成——这也是 ESPnet2 以「通用 Recipe 参数化差异」替代「每语料一套脚本」的核心设计意图。赞分享人工智能语音音频深度学习NLP【免费下载链接】espnetEnd-to-End Speech Processing Toolkit项目地址https://gitcode.com/gh_mirrors/es/espnet点击查看免费下载相关推荐ESPnet2 端到端语音处理实战教程Recipe 体系、训练配置、流式 ASR 与 Transducer 模型全解析ESPnet2 端到端语音处理实战教程Recipe 体系、训练配置、流式 ASR 与 Transducer 模型全解析 导读 本文是基于 ESPnet 仓库人工智能语音音频深度学习NLPFairseq 语音识别ASR实战指南LibriSpeech 数据准备、VGG-Transformer 训练与 Flashlight 解码Fairseq 语音识别ASR实战指南LibriSpeech 数据准备、VGG Transformer 训练与 Flashlight 解码 本指南以 ex人工智能深度学习预训练NLP语音WinUtil 完整指南用免费 Windows 系统优化工具完成批量装软件、一键调优与更新管理WinUtil 完整指南用免费 Windows 系统优化工具完成批量装软件、一键调优与更新管理 刚装好的 Windows 11四件事几乎躲不掉软件要挨个官桌面应用运维上一篇May协程库CLS机制为什么应该用CLS替代TLS下一篇ProcMon-for-Linux安装指南支持Ubuntu、Debian、Fedora等主流发行版创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。