人工智能语音音频深度学习NLP【免费下载链接】espnetEnd-to-End Speech Processing Toolkit项目地址https://gitcode.com/gh_mirrors/es/espnet点击查看免费下载本篇技术指南以 ESPnet 仓库中的 egs2/multimed_st/s2t1/README.md 为主线系统讲解如何在 ESPnet2 S2T 框架下基于 MultiMed-ST 医学语音翻译数据集完成英语到德语的语音翻译Speech Translation, ST任务并利用 OWSM v4 small370M 参数预训练模型进行下游微调与解码评测。读完本文你将掌握该 Recipe 的数据准备流程、OWSM 资产准备机制、stage 调度策略、微调参数覆盖方法、德语 ST 解码配置以及 BLEU/chrF/TER 与 WER/CER/TER 两套评测体系的完整落地方式。1. 任务总览在医学语音数据上做英德双向语音翻译egs2/multimed_st/s2t1是一个面向多语言医学语音翻译数据集 MultiMed-ST 的 ESPnet2 S2T Recipe核心设定如下维度配置数据集MultiMed-ST医学领域多语言语音翻译语料源语言英语English目标语言德语German任务类型Speech Translationst预训练模型espnet/owsm_v4_small_370M该数据集的背景论文为MultiMed-ST: Large-scale Many-to-many Multilingual Medical Speech TranslationarXiv 2504.03546。Recipe 的核心思路是不从头训练 S2T 模型而是复用 OWSM v4 small 预训练模型的 tokenizer、token list、checkpoint 与特征统计量在医学领域数据上进行轻量微调并在测试集上与零样本zero-shot解码结果做对照。在 run.sh 中语言与任务被固定为src_langeng tgt_langdeu taskst同时train_settrain、valid_setvalid、test_setstest三个数据划分贯穿整个 Recipe后续所有命令与评测均围绕这三个集合展开。2. 数据准备从 Hugging Face 流式下载到 Kaldi 风格数据目录2.1 整体流程数据准备由 local/data.sh 与 local/prepare_multimed_st.py 共同实现。流程为从 Hugging Face 以流式streaming方式读取 MultiMed-ST 数据将每条音频解码为 mono wav 文件生成 Kaldi 风格的data/train、data/valid、data/test目录。数据目录的根路径由 db.sh 中的MULTIMED_STdownloads控制即默认下载到本地downloads目录该变量可在运行前按需修改为自定义路径。local/data.sh 的主体逻辑为mkdir -p ${MULTIMED_ST} python local/prepare_multimed_st.py \ --src_lang ${src_lang} \ --tgt_lang ${tgt_lang} \ --task ${task} \ --out_root ${MULTIMED_ST}/${src_lang}_${tgt_lang}_${task} \ --max_train_samples ${max_train_samples} \ --max_valid_samples ${max_valid_samples} \ --max_test_samples ${max_test_samples} mkdir -p data cp -r ${MULTIMED_ST}/${src_lang}_${tgt_lang}_${task}/data/train data/train cp -r ${MULTIMED_ST}/${src_lang}_${tgt_lang}_${task}/data/valid data/valid cp -r ${MULTIMED_ST}/${src_lang}_${tgt_lang}_${task}/data/test data/test for dset in train valid test; do utils/fix_data_dir.sh --utt_extra_files text.prev text.ctc data/${dset} utils/validate_data_dir.sh --no-feats data/${dset} done可以看到生成的数据目录随后会被拷贝到 Recipe 根目录下的data/并通过fix_data_dir.sh携带--utt_extra_files text.prev text.ctc与validate_data_dir.sh做标准化与校验。2.2 脚本参数与数据划分映射local/prepare_multimed_st.py 支持以下命令行参数参数默认值说明--hf_datasetleduckhai/MultiMed-STHugging Face 数据集 ID--src_langeng源语言可选eng/vie/fra/deu/zho--tgt_langdeu目标语言可选值同上--taskst任务类型可选asr、st、multitask_asr_st--out_root必填输出根目录--max_train_samples0训练集最大样本数0表示全部--max_valid_samples0验证集最大样本数--max_test_samples0测试集最大样本数脚本内置的语言信息映射LANG_INFO同时给出语言名称与对应的 OWSM 特殊符号LANG_INFO { eng: (English, eng), vie: (Vietnamese, vie), fra: (French, fra), deu: (German, deu), zho: (Chinese, zho), }Hugging Face 原始划分到 ESPnet 划分的映射SPLIT_MAP为SPLIT_MAP { train: train, eval: valid, corrected.test: test, }即 HF 的eval对应 ESPnet 的validcorrected.test对应test。脚本还对 ST 任务做了参数校验当任务为st或multitask_asr_st时src_lang与tgt_lang必须不同否则直接抛出ValueError。2.3 音频处理与文本格式MultiMed-ST 的音频可能是立体声stereo而 ESPnet S2T 推理期望单声道mono输入。因此脚本在写 wav 前会做降混处理见 prepare_multimed_st.py 中的decode_and_write_wavspeech, sr sf.read(BytesIO(audio_bytes), dtypefloat32) # ESPnet S2T inference expects mono audio. # MultiMed-ST audio can be stereo, so downmix before writing wav. if getattr(speech, ndim, 1) 2: speech speech.mean(axis1) sf.write(wav_path, speech, sr)对于 OWSM 微调每个划分目录需要三个关键文本文件其格式约定如下text utt_id engst_deunotimestamps German translation text.prev utt_id na text.ctc utt_id English source transcripttext带 OWSM prompt 前缀的目标语言翻译文本eng为源语言符号st_deu为翻译成德语的任务符号notimestamps表示不预测时间戳text.prev前文上下文微调时统一置为natext.ctc英语源语言转写用于 CTC 辅助监督。脚本生成的 utterance ID 遵循eng_deu_st_split_8位序号_音频名的命名模式。由于 MultiMed-ST 元数据未提供可靠的说话人轮次信息脚本将每个 utterance 视为独立说话人即utt2spk写作utt_id utt_id同时在spk2utt中生成一一对应关系。此外脚本还会按任务类型额外生成text.asrASR 文本与text.stST 文本文件方便多任务扩展。值得注意的细节是脚本逐条检查音频字节是否完整、源文本是否为空ST 任务还要求目标文本非空解码失败的样本会被跳过并打印skip idx...日志保证数据目录的可用性同时每个划分的头 5 个样本会打印采样率、时长、源/目标文本片段便于人工抽查。3. OWSM v4 small 资产准备符号链接 微调配置生成OWSM 微调需要复用espnet/owsm_v4_small_370M的预训练 tokenizer、token list、checkpoint 与特征统计量。这一步骤由 local/prepare_owsm_v4_assets.py 完成它在 Recipe 目录下生成如下文件结构downloads/owsm_v4_small_370M/model.pth downloads/owsm_v4_small_370M/config.yaml downloads/owsm_v4_small_370M/bpe.model downloads/owsm_v4_small_370M/feats_stats.npz data/de_token_list/bpe_unigram50000/bpe.model data/de_token_list/bpe_unigram50000/tokens.txt conf/finetune_owsm_v4_small.yaml这些文件由脚本自动生成不应被提交到版本库。其核心实现逻辑通过snapshot_download从 Hugging Face Hub 下载模型仓库快照用find_one在快照中定位*.pth优先选择名称含valid的 checkpoint、config.yaml、bpe.model、feats_stats.npz在downloads/owsm_v4_small_370M/与data/de_token_list/bpe_unigram50000/下创建指向真实文件的符号链接symlink避免把大文件复制进 Recipe 工作区从config.yaml中读取token_list写出tokens.txt读取模型自带的训练配置经sanitize_train_config清洗后写出conf/finetune_owsm_v4_small.yaml。3.1 配置清洗与本地微调默认值sanitize_train_config会剔除模型卡片/HF 元数据与 Recipe 运行时字段如config、required、version、distributed、output_dir、token_list、init_param、pretrain_path等并注入面向本地微调的默认值max_epoch: 1 num_iters_per_epoch: 1000 batch_size: 1 accum_grad: 8 use_amp: true同时还会做一系列面向单机/CPU 友好的调整这些细节在 prepare_owsm_v4_assets.py 中均有体现训练节奏drop_last_iterfalse、num_workers1、log_interval1、num_att_plot0、keep_nbest_models[1]、patienceNone分布式配置全部关闭dist_launcherNone、multiprocessing_distributedfalse、dist_world_size1、sharded_ddpfalse优化器学习率固定为1.0e-5关闭fused调度器使用warmuplrwarmup_steps1避免可选的 Flash Attention 依赖encoder_conf/decoder_conf中use_flash_attnfalse、gradient_checkpoint_layers[]特征归一化normalizeglobal_mvnnormalize_conf.stats_file指向符号链接feats_stats.npz。上述参数均可通过run.sh暴露的--owsm_*参数在命令行覆盖详见第 5 节。4. Stage 调度为什么跳过 Stage 5–9egs2/multimed_st/s2t1复用了 ESPnet2 通用 S2T 流水线 s2t.sh 的 stage 体系。通过检索 s2t.sh 中的 stage 分支可以确认各阶段职责Stage职责Stage 1数据准备data/train、data/valid等Stage 2变速扰动Speed perturbationStage 3格式化wav.scp/ 特征提取Stage 4去除过长/过短数据Stage 5生成token_listBPE/字符级/Whisper/HF tokenizerStage 6LM 收集统计量Stage 7LM 训练Stage 8计算困惑度Stage 9N-gram 语言模型训练Stage 10S2T 收集统计量collect statsStage 11S2T 模型训练Stage 12解码DecodingStage 13评测ScoringStage 14打包模型Stage 15上传模型到 Hugging Face本 Recipe 有意跳过 Stage 5Stage 5 通常从训练文本训练新的 BPE tokenizer但这不适合 OWSM 微调——模型必须沿用预训练的 OWSM BPE 模型与 token list即data/de_token_list/bpe_unigram50000/下的bpe.model与tokens.txt。Stage 6–9 同样被跳过因为本 Recipe 不训练、也不使用外部神经 LM 或 n-gram LMuse_lmfalse。OWSM 解码直接由微调后的 S2T 模型完成无需语言模型打分。因此官方推荐的操作方式是--stage 1 --stop_stage 4先完成数据准备然后从 Stage 10collect stats继续。在 run.sh 中当启用微调模式--finetune_owsm_v4_small true时会自动完成以下配置注入token_typebpe nbpe50000 use_lmfalse s2t_configconf/finetune_owsm_v4_small.yaml inference_configconf/decode_owsm_st_de.yaml s2t_args--init_param downloads/owsm_v4_small_370M/model.pth --ignore_init_mismatch true其中--init_param指定从 OWSM checkpoint 初始化参数--ignore_init_mismatch true允许部分参数如输出层维度与预训练权重不一致时忽略不匹配项。同时run.sh会调用python local/prepare_owsm_v4_assets.py把第 3 节中的资产准备流程串入流水线。5. 运行指南数据准备 → 微调 → 解码评测5.1 数据准备Stage 1–4./run.sh \ --finetune_owsm_v4_small true \ --stage 1 \ --stop_stage 4 \ --ngpu 0此阶段不需要 GPU。执行后会在data/下生成train、valid、test三个 Kaldi 风格目录。5.2 OWSM v4 small 微调Stage 10–11./run.sh \ --finetune_owsm_v4_small true \ --stage 10 \ --stop_stage 11 \ --ngpu 1Stage 10 为 collect stats基于feats_stats.npz等资产Stage 11 为正式训练。默认生成的微调配置采用固定步数的初步设定max_epoch: 1 num_iters_per_epoch: 1000 batch_size: 1 accum_grad: 8 use_amp: true即默认只跑 1 个 epoch、每个 epoch 最多 1000 次迭代、batch size 为 1 并配合 8 步梯度累积、开启混合精度。这套默认值适合快速验证流水线。5.3 覆盖生成的配置参数以延长训练如果希望进行更长的本地训练可以借助 run.sh 暴露的--owsm_*参数覆盖生成配置中的对应旋钮。例如以下命令去除固定迭代上限将 epoch 数提高到 5./run.sh \ --finetune_owsm_v4_small true \ --stage 10 \ --stop_stage 11 \ --ngpu 1 \ --owsm_max_epoch 5 \ --owsm_num_iters_per_epoch 0run.sh中可用的 OWSM 相关参数及默认值如下run.sh 参数默认值作用--owsm_max_epoch1微调 epoch 数--owsm_num_iters_per_epoch1000每个 epoch 迭代数设为0表示不限制由数据量决定--owsm_batch_size1训练 batch size--owsm_valid_batch_size1验证 batch size--owsm_accum_grad8梯度累积步数这些参数会透传给 prepare_owsm_v4_assets.py--max_epoch、--num_iters_per_epoch、--batch_size、--valid_batch_size、--accum_grad进而写入新生成的conf/finetune_owsm_v4_small.yaml。注意当num_iters_per_epoch为 0 时脚本会从配置中移除该键见sanitize_train_config中的cfg.pop(num_iters_per_epoch, None)从而由实际数据量决定迭代轮数。5.4 解码与评测Stage 12–13./run.sh \ --finetune_owsm_v4_small true \ --stage 12 \ --stop_stage 13 \ --ngpu 1 \ --gpu_inference true \ --inference_nj 1 \ --inference_s2t_model 5epoch.pth--gpu_inference true在 GPU 上执行解码--inference_nj 1解码并行 job 数受限于资源可调大--inference_s2t_model 5epoch.pth指定推理所用的 checkpoint 文件名。如果按第 5.3 节以--owsm_max_epoch 5训练生成的模型文件名为5epoch.pthESPnet2 按 epoch 命名保存的 checkpoint。Stage 13 的评测包含两层ESPnet 默认的 WER/CER/TER 输出来自 s2t.sh 的 scoring 逻辑额外调用local/score.sh使用sacrebleu报告 ST 的 BLEU、chrF 与 TER。6. 德语 ST 解码配置详解德国 ST 解码使用 conf/decode_owsm_st_de.yaml完整内容如下beam_size: 5 ctc_weight: 0.0 maxlenratio: 1.0 minlenratio: 0.0 lang_sym: eng task_sym: st_deu predict_time: false各字段含义字段值说明beam_size5束搜索宽度ctc_weight0.0CTC 权重纯自回归解码不混合 CTCmaxlenratio1.0最大生成长度与输入长度的比例minlenratio0.0最小生成长度比例lang_symeng源语音语言符号作为 prompt 注入task_symst_deu任务符号指定翻译成德语predict_timefalse不预测时间戳对于英语到德语语音翻译lang_sym表示源语音的语言英语task_sym指定翻译目标德语。在 OWSM 的解码流程中这两个符号连同notimestamps一起构成模型输入的 prompt 前缀指引模型执行将英语语音翻译为德语且不输出时间戳的任务。7. ST 指标评测sacrebleu 与 prompt 剥离7.1 评测流程Stage 13 完成后local/score.sh 会在每个解码目录下查找text_nospecial假设文件可通过--test_sets限定默认全量查找并执行定位参考文件dump/raw/${dset}/text调用 local/align_ref_hyp.py 对齐参考与假设调用sacrebleu计算 BLEU、chrF、TER将结果写入score_st_bleu/result.txt并打印。7.2 Prompt 剥离与对齐逻辑由于参考文本text带有engst_deunotimestamps这类 OWSM prompt 标记直接计算 BLEU 会失真。align_ref_hyp.py 通过正则表达式将行首的连续特殊符号剥离text re.sub(r^(?:[^])\s*, , text).strip()随后只保留参考与假设共同包含的 utterance ID并统计 hyp-only 与 ref-only 的数量按 ID 排序后分别写出纯文本参考文件与假设文件供sacrebleu使用sacrebleu ${scoredir}/ref.txt \ -i ${scoredir}/hyp.txt \ -m bleu chrf ter \ ${scoredir}/result.txt8. 结果与对照解读官方在 README 中给出的结果用于验证 Recipe 可行性并对比 OWSM v4 small 零样本解码与在 MultiMed-ST 上微调的效果而非报告完全优化的基准fine-tuned 模型从espnet/owsm_v4_small_370M初始化。8.1 ST 指标由local/score.sh计算这些分数在剥离 OWSM prompt 标记后的参考上计算ModelTest set# uttsBLEUchrF2TEROWSM v4 small zero-shottest475129.456.360.6OWSM v4 small fine-tunedtest475131.458.058.0可以看到微调后 BLEU 提升 2.0 个点29.4 → 31.4chrF2 提升 1.7 个点56.3 → 58.0TER 下降 2.6 个点60.6 → 58.0说明医学领域微调对翻译质量有明确增益。8.2 ESPnet 默认评测Stage 13 的 WER/CER/TER以下为 s2t.sh Stage 13 的默认输出仅供对照参考ModelTest set# uttsWERCERTEROWSM v4 small zero-shottest475163.149.062.9OWSM v4 small fine-tunedtest475160.647.861.1需要说明的是WER/CER/TER 是基于词/字符编辑距离的指标与 ST 语义质量指标BLEU/chrF衡量维度不同因此在解读时应以第 8.1 节的 ST 指标为主。9. 关键文件速查表文件作用egs2/multimed_st/s2t1/README.mdRecipe 官方说明文档egs2/multimed_st/s2t1/run.sh顶层入口脚本承载全部--owsm_*与通用 stage 参数egs2/multimed_st/s2t1/s2t.shESPnet2 S2T 通用流水线Stage 1–15egs2/multimed_st/s2t1/local/data.sh数据准备驱动脚本egs2/multimed_st/s2t1/local/prepare_multimed_st.pyMultiMed-ST 下载、降混、Kaldi 数据目录生成egs2/multimed_st/s2t1/local/prepare_owsm_v4_assets.pyOWSM 资产下载、符号链接与微调配置生成egs2/multimed_st/s2t1/local/score.shST 的 sacrebleu 评测入口egs2/multimed_st/s2t1/local/align_ref_hyp.py参考/假设对齐与 prompt 剥离egs2/multimed_st/s2t1/conf/decode_owsm_st_de.yaml英德 ST 解码配置egs2/multimed_st/s2t1/db.sh数据集路径变量MULTIMED_STdownloads10. 小结本 Recipe 演示了一条完整的医学领域多语言语音翻译落地路径从 Hugging Face 流式拉取 MultiMed-ST、自动降混与 Kaldi 目录构建到 OWSM v4 small 预训练资产的符号链接复用与本地微调配置生成再到跳过 LM 相关 stage、直接以微调模型完成英德 ST 解码最后通过 prompt 剥离 sacrebleu 输出 BLEU/chrF/TER 指标。其设计对在自有领域数据上微调 OWSM 类多语言多任务 S2T 模型具有直接的可迁移参考价值凡是需要沿用预训练 tokenizer、避免重新训 BPE、且不需要外部语言模型的场景都可以借鉴这种 stage 裁剪与资产符号链接策略。参考论文MultiMed-ST: Large-scale Many-to-many Multilingual Medical Speech TranslationarXiv 2504.03546数据来自 MultiMed-ST 数据集。赞分享人工智能语音音频深度学习NLP【免费下载链接】espnetEnd-to-End Speech Processing Toolkit项目地址https://gitcode.com/gh_mirrors/es/espnet点击查看免费下载相关推荐基于 fairseq 的 MuST-C 英德语音翻译联合语音-文本训练实战指南Joint Speech Text Training基于 fairseq 的 MuST C 英德语音翻译联合语音 文本训练实战指南Joint Speech Text Training 导读 本文基于 kosm人工智能大模型预训练深度学习NLP计算机视觉多模态语音音频微调Ice把 macOS 菜单栏图标管理这件事做简单了Ice把 macOS 菜单栏图标管理这件事做简单了 菜单栏图标多到互相遮挡刘海屏上还有图标被刘海吞掉一半这种事很烦。Ice 菜单栏图标管理工具就是冲着这个桌面应用如何构建英语-德语翻译模型基于seq2seq框架的终极实战指南如何构建英语 德语翻译模型基于seq2seq框架的终极实战指南 想要快速构建高质量的机器翻译模型吗seq2seq序列到序列框架为你提供了完美的解决方案深度学习NLP上一篇Sol剪贴板管理器使用技巧轻松管理复制历史提升工作效率下一篇【亲测有效】SQLline 新手必看解决90%常见问题的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考