ARTICLE DETAIL

资讯详情

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

NeMo 语音仓库 ASR 示例指南:从 CTC/RNNT 训练到推理、评估与大规模并行转写的完整执行流程

NeMo 语音仓库 ASR 示例指南:从 CTC/RNNT 训练到推理、评估与大规模并行转写的完整执行流程 NeMo 语音仓库 ASR 示例指南从 CTC/RNNT 训练到推理、评估与大规模并行转写的完整执行流程【免费下载链接】SpeechA scalable generative AI framework built for researchers and developers working on Large Language Models, Multimodal, and Speech AI (Automatic Speech Recognition and Text-to-Speech)项目地址: https://gitcode.com/GitHub_Trending/nem/Speech本指南以 NeMo 语音仓库examples/asr目录为核心系统梳理其中 ASR自动语音识别示例脚本的构成与用法重点讲解推理脚本的标准执行顺序Hydra 配置 → 模型/ Trainer 初始化 →set_trainer→ 解码策略切换 → 加载 manifest →model.transcribe(...)→ 写输出 manifest → 评估 WER/CER并扩展到 CTC/RNNT 训练、微调、Slurm 多节点运行等实战场景。读完本文你将掌握基于该仓库从零跑通语音识别推理 → 指标评估 → 大规模并行转写 → 模型微调的完整链路。ASR 示例目录的整体定位examples/asr是 NeMo 语音仓库中与自动语音识别强相关的全部示例脚本集合。按照 examples/asr/README.md 的说明该目录包含使用多种训练方法训练 ASR 模型的示例例如CTC 损失Connectionist Temporal Classification见 asr_ctc支持字符级与子词BPE级模型RNN Transducer 损失见 asr_transducer支持 char / BPE / multi-task / prompt 变体混合 RNNTCTC见 asr_hybrid_transducer_ctc同一编码器可切换两种解码头语音预训练自监督学习见 speech_pretraining如 masked token prediction 预训练语音活动检测VAD见 asr_vad 与 speech_classification 中的vad_infer.py此外还覆盖流式推理asr_streaming_inference、分块推理asr_chunked_inference、缓存感知流式asr_cache_aware_streaming、EOU端到端语音活动检测、适配器微调asr_adapters、语音翻译speech_translation等子域。目录顶层还提供了四个可直接复用的核心脚本推理脚本 transcribe_speech.py、评估脚本 speech_to_text_eval.py、大规模并行转写脚本 transcribe_speech_parallel.py、微调脚本 speech_to_text_finetune.py以及 Slurm 集群运行模板 slurm_example.sh 和配套的 conf 配置目录。ASR 模型推理执行总览核心脉络原文档给出了所有推理脚本都必须遵循的统一执行顺序。无论你后续编写自己的推理脚本还是修改仓库内任意推理示例都应严格按照以下顺序否则可能导致模型未正确加载、解码策略未生效或结果顺序错乱graph TD A[Hydra Overrides Config Dataclass] -- B{Config} B -- |Init| C[Model] B -- |Init| D[Trainer] C D -- E[Set trainer] E -- |Optional| F[Change Transducer Decoding Strategy] F -- H[Load Manifest] E -- |Skip| H H -- I[model.transcribe(...)] I -- J[Write output manifest] K[Ground Truth Manifest] J K -- |Optional| L[Evaluate CER/WER]对上述流程逐步拆解Hydra Overrides Config Dataclass脚本入口通过hydra_runner装饰器加载配置例如TranscriptionConfig、EvaluationConfig等 dataclass命令行参数以 Hydra override 形式传入如model_pathnull、batch_size32Config 初始化 Model 与 Trainer配置同时用于初始化 ASR 模型与 PyTorch Lightning Trainer。模型加载有两种方式model_path指向本地.nemo文件或pretrained_name指向预训练模型名Set trainer把 Trainer 绑定到模型上可选Change Transducer Decoding Strategy若模型是 RNNT/混合模型可在转写前切换解码策略贪婪、beam 等Load Manifest加载音频数据来源audio_dir目录或dataset_manifestJSON manifestmodel.transcribe(...)执行推理Write output manifest将预测文本写入输出 manifest可选Evaluate CER/WER若有 Ground Truth manifest可计算字符错误率/词错误率。关于模型的恢复方式原文档特别强调在恢复模型时可以把 Trainer 直接传给restore_from/from_pretrained调用也可以在模型初始化完成后再用model.set_trainer(Trainer)设置。这一设计在 transcribe_speech.py 中有直接印证asr_model, model_name setup_model(cfg, map_location) trainer pl.Trainer(devicesdevice, acceleratoraccelerator) asr_model.set_trainer(trainer) asr_model asr_model.eval()推理脚本 transcribe_speech.py 深度解析transcribe_speech.py 是单 CPU/GPU 上转写音频的核心脚本适用于中等规模音频数据的推理。其 docstring 明确指出模型通过model_path或pretrained_name二选一指定数据通过audio_dir或dataset_manifest二选一指定。命令行参数全表脚本基于TranscriptionConfigdataclasstranscribe_speech.py完整参数如下参数默认值说明model_pathnull本地.nemo模型文件路径pretrained_namenull预训练模型名称从 NGC 注册表加载audio_dirnull音频文件所在目录dataset_manifestnullNeMo 格式的 JSON manifest 文件路径channel_selectornull多声道音频选单声道或跨声道取平均audio_keyaudio_filepath覆盖 manifest 中音频路径的字段名eval_config_yamlnull外部评估 yaml可注入 augmentorpresort_manifestTrue按音频时长排序 manifest减少 padding短音频推理显著提速output_filenamenull转写结果输出文件路径batch_size32推理 batch sizenum_workers0dataloader 工作进程数append_predFalse若为 True向已有 json 追加新的预测字段pred_name_postfixnull输出文件中使用的模型名后缀random_seednull随机种子timestampsnull是否输出贪心时间戳信息仅支持的模型开启后返回完整对齐假设return_hypothesesFalse是否返回假设对象而非纯文本compute_langsFalse是否请求语言 ID 信息模型支持时cudanull指定 CUDA 设备负数表示仅 CPUnull时自动探测 CUDA无 CUDA 则 CPUallow_mpsFalse是否允许使用 Apple Silicon MPS 设备实验性ampFalse是否使用自动混合精度amp_dtypefloat16AMP 精度可设float16或bfloat16compute_dtypenullfloat32/bfloat16/float16默认 bfloat16可用时matmul_precisionhigh矩阵乘法精度highest/high/mediumaudio_typewav音频文件类型支持 wav、flac、mp3overwrite_transcriptsTrue输出已存在时是否重新转写ctc_decoding—CTC 模型解码子配置含ctc_timestamp_type可取all/char/word/segmentrnnt_decoding—RNNT 模型解码子配置含rnnt_timestamp_type同样四选一multitask_decoding—AED如 Canary多任务模型解码子配置prompt{}提示模型如 Canary-1B的 prompt 槽位支持隐式单轮、显式单轮、显式多轮三种写法decoder_typenull混合 RNNT/CTC 模型切换解码头ctc或rnntatt_context_sizenull缓存感知流式模型的 look-ahead 配置model_change—转写前对 Conformer 编码器做模型级修改如注意力模式、上下文大小、rope_basecalculate_werTrue结束时是否计算 WER/CERclean_groundtruth_textFalse是否清洗 ground truth 文本langidenground truth 清洗时 convert_num_to_words 的语言use_cerFalse使用 CER 还是 WERreturn_transcriptionsFalse为 True 时直接返回转写列表跳过写文件gt_text_attr_nametextmanifest 中 ground truth 文本字段名gt_lang_attr_namelangmanifest 中语言字段名extract_nbestFalse提取 n-best 假设beam 解码需配合return_hypothesesconfidenceFalse在 manifest 中输出 token 与词级置信度calculate_rtfxFalse计算 RTFx实时率倍数吞吐warmup_steps0RTFx 测量的预热步数run_steps1RTFx 测量的运行步数标准用法命令脚本 docstringtranscribe_speech.py给出完整用法python transcribe_speech.py \ model_pathnull \ pretrained_namenull \ audio_dirremove or path to folder of audio files \ dataset_manifestremove or path to manifest \ output_filenameremove or specify output filename \ clean_groundtruth_textTrue \ langiden \ batch_size32 \ timestampsFalse \ compute_langsFalse \ cuda0 \ ampTrue \ append_predFalse \ pred_name_postfixremove or use another model name for output filename时间戳类型可按需限制例如ctc_decoding.ctc_timestamp_typeall # 默认 all可选 [all, char, word, segment] rnnt_decoding.rnnt_timestamp_typeall # 默认 all可选 [all, char, word, segment]运行时流程与源码印证脚本主函数transcribe_speech.py的执行要点入参校验model_path与pretrained_name不能同时为nullaudio_dir与dataset_manifest不能同时为null否则抛出ValueError设备选择cuda为null时自动探测——有 CUDA 用 0 号设备allow_mpsTrue且 MPS 可用时用 MPS实验性建议设置PYTORCH_ENABLE_MPS_FALLBACK1否则回退 CPU模型加载调用setup_model实现于 nemo/collections/asr/parts/utils/transcribe_utils.py。当传入model_path时先ASRModel.restore_from(..., return_configTrue)读取模型类的真实路径并动态导入再按该类恢复完整模型模型名取文件名去扩展名传入pretrained_name时则走ASRModel.from_pretrained(model_name...)解码策略切换脚本按模型类型EncDecCTCModel/EncDecRNNTModel/EncDecHybridRNNTCTCModel/ AED 多任务模型自动选择ctc_decoding、rnnt_decoding或multitask_decoding调用change_decoding_strategy。对混合模型可通过decoder_typectc|rnnt指定解码头CTC 模型当前不支持compute_langs数据准备prepare_audio_datatranscribe_utils.py按audio_dir递归收集指定audio_type文件或按 manifest 逐行读取并调用read_and_maybe_sort_manifest做时长降序排序presort_manifestTrue时同时把相对音频路径补全为绝对路径排序结果写入临时 manifest推理在torch.amp.autocast与torch.no_grad()下调用asr_model.transcribe(audiofilepaths, override_configoverride_cfg, timestampscfg.timestamps)其中override_cfg由asr_model.get_transcribe_config()派生再覆盖batch_size、num_workers、channel_selector、prompt 等字段顺序还原若使用 manifest 且开启presort_manifest推理完成后通过restore_transcription_ordertranscribe_utils.py将按时长排序的转写结果映射回原始 manifest 顺序——这一步对应执行总览中Load Manifest与Write output manifest之间的顺序约束输出与评估write_transcription写出结果 manifest若calculate_werTrue调用cal_write_er计算并输出每个样本的 WER/CER若calculate_rtfxTrue用 manifest 中的duration总和除以模型耗时得到 RTFx注意开启 RTFx 时要求 manifest 每条都含duration字段且建议warmup_steps至少为 1。评估脚本 speech_to_text_eval.pyWER/CER 计算speech_to_text_eval.py 依赖transcribe_speech.py两者须位于同一目录继承其全部参数并新增评估专属配置dataset_manifest必填、output_filename默认evaluation_transcripts.json、use_cer、use_punct_er标点错误率可配合text_processing.punctuation_marks、toleranceWER/CER 超限即抛错可用于回归门禁、only_score_manifest、scores_per_sample。场景一先转写再评估适用于 manifest 中没有pred_text的情况脚本会先转写再打分python speech_to_text_eval.py \ model_pathnull \ pretrained_namenull \ dataset_manifestMandatory: Path to an ASR dataset manifest file \ output_filenameOptional: Some output filename which will hold the transcribed text as a manifest \ batch_size32 \ ampTrue \ use_cerFalse场景二只对已有预测打分适用于用transcribe_speech_parallel.py等工具已完成转写、manifest 中同时含textground truth与pred_text模型转写的情况python speech_to_text_eval.py \ dataset_manifestMandatory: Path to an ASR dataset manifest file \ use_cerFalse \ only_score_manifestTrue其实现要点speech_to_text_eval.pyonly_score_manifestTrue时跳过转写直接把output_filename指向 manifest随后逐行读取若缺少pred_text字段则判定 invalid manifest 并抛错支持通过text_processing子配置做标点分离、小写化、去标点等预处理use_punct_erTrue时用DatasetPunctuationErrorRate计算标点错误率scores_per_sampleTrue时对每条样本单独计算 wer/cer/punct_er 并写回 manifest最后调用word_error_ratenemo/collections/asr/metrics/wer.py分别计算 WER 与 CER并输出Dataset WER/CER xx%/xx%日志。大规模并行转写 transcribe_speech_parallel.pytranscribe_speech_parallel.py 支持多 GPU / 多节点推理同时支持 tarred 与非 tarred 数据集适合大数据集场景。每个 GPU/worker 的结果写入predictions_{rank}.json所有 worker 聚合结果写入predictions_all.json。非 tarred 数据集示例python transcribe_speech_parallel.py \ modelstt_en_conformer_ctc_large \ predict_ds.manifest_filepath/dataset/manifest_file.json \ predict_ds.batch_size16 \ output_path/tmp/混合 RNNT/CTC 模型示例指定解码头python transcribe_speech_parallel.py \ modelstt_en_fastconformer_hybrid_large \ decoder_typectc \ predict_ds.manifest_filepath/dataset/manifest_file.json \ predict_ds.batch_size16 \ output_path/tmp/tarred 数据集示例python transcribe_speech_parallel.py \ predict_ds.is_tarredtrue \ predict_ds.manifest_filepath/tarred_dataset/tarred_audio_manifest.json \ predict_ds.tarred_audio_filepaths/tarred_dataset/audio__OP_0..127_CL_.tar \ ...默认使用全部可用 GPU、FP32 精度可通过trainer.precision、trainer.devices控制例如只用 2 块 GPU 且开启 AMPpython transcribe_speech_parallel.py \ trainer.precision16 \ trainer.devices2 \ ...也可调整 dataloader 配置python transcribe_speech_parallel.py \ predict_ds.num_workers8 \ predict_ds.min_duration2.0 \ predict_ds.sample_rate16000 \ modelstt_en_conformer_ctc_small \ ...训练侧执行流程以 CTC / RNNT 为例原文档指出该目录涵盖 CTC 与 RNN Transducer 两种训练方法。以 asr_ctc/README.md 给出的训练脚本执行顺序为参照训练/微调脚本统一遵循如下流程编写自己的从零训练或微调脚本时也应按此顺序graph TD A[Hydra Overrides Yaml Config] -- B{Config} B -- |Init| C[Trainer] C -- D[ExpManager] B -- D[ExpManager] C -- E[Model] B -- |Init| E[Model] E -- |Constructor| F1(Change Vocabulary) F1 -- F2(Setup InterCTC if available) F2 -- F3(Setup Adapters if available) F3 -- G(Setup Train Validation Test Data loaders) G -- H(Setup Optimization) H -- I[Maybe init from pretrained] I -- J[trainer.fit(model)]即Hydra 配置同时初始化 Trainer 与 Model → ExpManager 管理日志与检查点 → 模型构造函数依次完成词汇表切换、InterCTC 设置如有、适配器设置如有、训练/验证/测试 dataloader 构建、优化器与调度器配置→ 可选从预训练权重初始化 → 最后trainer.fit(model)。同样地恢复模型时可以把 Trainer 传入restore_from/from_pretrained或在初始化后调用model.set_trainer(Trainer)。对应的训练入口脚本包括CTCspeech_to_text_ctc.py字符级、speech_to_text_ctc_bpe.py子词级RNNTspeech_to_text_rnnt.py、speech_to_text_rnnt_bpe.py、多说话人 speech_to_text_mt_rnnt_bpe.py、prompt 版本 speech_to_text_rnnt_bpe_prompt.py混合 RNNTCTCspeech_to_text_hybrid_rnnt_ctc_bpe.py、字符级、prompt 版本以及 helpers/convert_nemo_asr_hybrid_to_ctc.py 转换工具预训练speech_pre_training.py、masked_token_pred_pretrain.pyVAD/分类speech_to_text_with_vad.py、frame_vad_infer.py、vad_infer.py、speech_to_frame_label.py、speech_to_label.py。所有训练脚本的模型架构配置集中在 examples/asr/conf 下按模型家族组织conformer含 HAT、multiblank、TDT、多语言、混合、缓存感知流式、fastconformer含长音频 long_fastconformer、混合流式、hybrid、TDT、lstm、marblenet、transformerstacking、wav2vec_ctc、sslconformer/fastconformer/nest/wav2vec 自监督配置、vad、speech_multitask、speech_translation等。微调脚本 speech_to_text_finetune.pyexamples/asr/speech_to_text_finetune.py 用于在不改动模型核心架构的前提下微调任意语音转文本模型支持更换数据集、优化器、spec_augment 以及词汇表/分词器。该脚本仅支持两种初始化方式init_from_nemo_model或init_from_pretrained_model不支持init_from_ptl_ckpt且二者不可同时传入。# 从本地 .nemo 模型初始化 python NEMO_ROOT/examples/asr/speech_to_text_finetune.py \ init_from_nemo_modelpath_to_nemo_model # 从预训练模型名初始化 python NEMO_ROOT/examples/asr/speech_to_text_finetune.py \ init_from_pretrained_modelpretrained_model_name从源码speech_to_text_finetune.py看get_base_model实现了关键细节多卡场景下仅 rank 0 下载预训练权重其余 rank 至少休眠 60 秒等待下载完成再从缓存恢复避免多进程并发下载冲突。配套配置文件 conf/asr_finetune/speech_to_text_finetune.yaml 展示了微调的核心字段model.train_dsmanifest、batch_size、tarred 开关、bucketing、model.char_labels.update_labels字符模型换词表、model.tokenizer.update_tokenizer与dir/typeBPE/WordPiece 分词器更换、model.spec_augmentfreq/time mask、model.optimadamw CosineAnnealingwarmup_steps: 5000、trainerDDPStrategy、precision 可选 16/32/bf16以及exp_manager日志目录设置。Slurm 集群多节点运行模板slurm_example.sh 提供了在 Slurm 集群上以多节点多 GPU 方式运行训练脚本的参考模板仓库明确标注该脚本未被完整测试需按集群环境调整。核心要素包括SBATCH 资源申请单节点、8 任务/节点一任务一 GPU、--gpus-per-node8、4 小时墙钟时间、--exclusive --overcommit --mem0容器与环境使用 NGC 容器镜像nvcr.io/nvidia/nemo:25.02.rc4通过srun --container-image与--container-mounts挂载代码目录与数据目录环境变量WANDB_API_KEY、PYTHONPATH、TOKENIZERS_PARALLELISMfalse、LHOTSE_AUDIO_DURATION_MISMATCH_TOLERANCE0.3以及HYDRA_FULL_ERROR1 TORCH_CUDNN_V8_API_ENABLED1动态参数注入trainer.num_nodes${SLURM_JOB_NUM_NODES}、trainer.devices${SLURM_NTASKS_PER_NODE}把 Slurm 环境变量映射到 Hydra 配置示例任务为复现 canary-1b配置 conf/speech_multitask/fast-conformer_aed.yaml。提交方式调整占位符后执行sbatch slurm_example.sh。此外 conf/run_local.yaml 提供了本地运行的 Hydra 启动配置骨架script、results_dir、num_tasks_per_node、executor: local。推理执行顺序的实践建议结合源码实现编写或修改推理脚本时建议遵循以下要点对应执行总览中的顺序约束先建 Trainer 再绑模型无论用restore_from/from_pretrained传入 Trainer 还是事后set_trainer必须保证模型在调用transcribe前已绑定 Trainer解码策略要在加载数据之前设置change_decoding_strategy贪婪/beam、时间戳类型、语言 ID、置信度应在prepare_audio_data之前完成transcribe_speech.py正是按此顺序实现presort 后必须还原顺序开启presort_manifestTrue会改变推理顺序以提速务必在写结果前用restore_transcription_order映射回原始顺序否则输出 manifest 与输入 manifest 无法对齐输入二选一、输出可叠加model_path/pretrained_name与audio_dir/dataset_manifest各自二选一append_predTrue时向既有 json 追加预测而非覆盖配合pred_name_postfix可区分多个模型的预测结果。总结examples/asr目录以统一的配置驱动模式组织 ASR 全流程示例推理侧以 transcribe_speech.py 及其执行顺序为骨架串联模型加载、Trainer 绑定、解码策略切换、数据准备、转写、结果写出与 WER/CER 评估评估与并行转写脚本在其上扩展出指标门禁与多卡吞吐能力训练侧则由 CTC、RNNT、混合、预训练、VAD 等子目录覆盖主流方法并统一遵循Trainer/ExpManager/Model → 词汇表与适配器 → dataloader → 优化器 → fit的构造顺序。无论是单机快速推理、大规模集群转写还是模型微调都可以在保持执行顺序不变的前提下通过 Hydra override 灵活适配自己的数据与模型。【免费下载链接】SpeechA scalable generative AI framework built for researchers and developers working on Large Language Models, Multimodal, and Speech AI (Automatic Speech Recognition and Text-to-Speech)项目地址: https://gitcode.com/GitHub_Trending/nem/Speech创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表