
NeMo 流式 / 缓冲 / 分块 ASR 推理实战AED 与 Transducer 模型的 chunked 与 streaming 解码指南【免费下载链接】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_chunked_inference目录下的推理脚本系统讲解 Streaming流式、Buffered缓冲、Chunked分块三种长音频 ASR 推理方式的原理、参数与实战用法。读完本文你将掌握 TransducerRNNT/TDT模型与 MultitaskAED如 Canary 系列模型各自的分块推理脚本、流式解码策略Wait-k / AlignAtt / Middle-Token / LCS以及 chunk 大小与延迟、准确率之间的权衡方法可直接复现仓库中的命令行示例。三种推理模式的定位与区别该目录同时承载了三类推理脚本分别面向 Transducer 模型RNNT、TDT和 MultitaskAED 模型如nvidia/canary-1b系列推理模式适用模型核心脚本Chunked InferenceMultitaskAEDCanary 等aed/speech_to_text_aed_chunked_infer.pyAED 流式推理MultitaskAEDCanary 等aed/speech_to_text_aed_streaming_infer.pyBuffered InferenceRNNT / TDT / Hybridrnnt/speech_to_text_buffered_infer_rnnt.py流式 / 缓冲推理新RNNT / TDT / Hybridrnnt/speech_to_text_streaming_infer_rnnt.py对于 CTC 模型本目录不适用README 明确指引使用独立的 asr_streaming_inference.py 脚本。Streaming 与 Buffered 的本质差异README 指出streaming ASR 与 buffered ASR 的主要区别在于 chunk size块大小和总上下文缓冲区total context buffer的大小二者只是同一套“滑动窗口”机制的不同参数配置减小 chunk size首个预测结果的延迟更低模型输出文本的“滞后感”更短但由于每个块内携带的信息变少会导致更高的 WER词错误率。增大 chunk size语音与转写之间的延迟增加这正是 buffered ASR 的形态但模型拥有更多上下文来正确转写能获得更准确的转录文本。这一权衡贯穿本目录全部四个脚本所有脚本都通过chunk块与left/right context左右上下文两个维度来控制“延迟 vs 准确率”的平衡点。Chunked InferenceAED 模型的长音频分段推理对于 MultitaskAED 模型仓库提供 speech_to_text_aed_chunked_infer.py 执行分块推理。该脚本将输入音频切分为不重叠的chunk_len_in_secs秒片段对每个片段单独执行推理最后将各片段结果拼接成完整转录文本。输入方式audio_dir 与 dataset_manifest脚本支持两种输入且优先 audio_dir从源码main()可见audio_dir存在时manifest会被置为None见 speech_to_text_aed_chunked_infer.pyaudio_dir音频文件目录脚本会以audio_type默认wav递归匹配目录下所有音频文件dataset_manifestJSON manifest 文件路径。README 特别强调推荐使用 manifest 输入否则模型只会执行带标点和大小写的英文 ASR。manifest 每行格式如下{ audio_filepath: /path/to/audio.wav, # path to the audio file duration: 10000.0, # duration of the audio taskname: asr, # use s2t_translation for AST source_lang: en, # Set source_langtarget_lang for ASR. Currently supported for 25 EU languages. target_lang: de, # See https://huggingface.co/nvidia/canary-1b-v2 }其中taskname为asr时执行语音识别为s2t_translation时执行语音翻译ASTsource_lang与target_lang相等时即 ASR仓库源码注释显示当前支持 25 种欧盟语言。命令行示例与核心参数python examples/asr/asr_chunked_inference/aed/speech_to_text_aed_chunked_infer.py \ model_pathnull \ pretrained_namenvidia/canary-1b-flash \ audio_dir(optional) path to folder of audio files \ dataset_manifest(optional) path to manifest \ output_filename(optional) specify output filename \ chunk_len_in_secs40.0 \ batch_size16 \ decoding.beam.beam_size1核心参数依据脚本中TranscriptionConfigdataclass见 speech_to_text_aed_chunked_infer.py参数默认值说明model_path/pretrained_nameNone二者必填其一本地.nemo文件路径或 Hugging Face 预训练模型名如nvidia/canary-1b-flashaudio_dir/dataset_manifestNone二者必填其一音频目录或 manifest 路径chunk_len_in_secs40.0每个分块的时长秒model_stride8模型下采样因子FastConformer 为 8Conformer 为 4batch_size8并行处理的 chunk 数量timestampsFalse输出词级与段级时间戳仅部分模型支持compute_langsFalse输出语言 ID 信息output_filenameNone输出文件名为None时输出到输入文件同目录cudaNone指定 CUDA 设备负数表示纯 CPU 推理amp/amp_dtypeFalse/float16自动混合精度开关amp_dtype可为float16或bfloat16overwrite_transcriptsTrue是否覆盖已存在的转录结果文件calculate_werTrue计算词错误率需要 manifest 中含text字段时间戳与长音频的注意事项源码在main()入口处有一个重要约束当timestampsTrue而chunk_len_in_secs ! 10.0时脚本会打警告并强制将chunk_len_in_secs重置为 10.0见 speech_to_text_aed_chunked_infer.py。即开启时间戳时建议使用 10 秒分块以获得最优结果。Canary-1b-v2 长文推理该模型可通过.transcribe()方法进行长文推理内部采用带重叠窗口的动态分块以获得更好性能。这一行为在转写单个音频文件或batch_size1时自动启用。底层原理FrameBatchMultiTaskAED从源码看chunked 推理的核心类为 FrameBatchMultiTaskAED它接收frame_lenchunk_len_in_secs、total_bufferchunk_len_in_secs、batch_size三个参数——注意此处frame_len与total_buffer相等即各 chunk 之间互不重叠与 README 中“non-overlapping chunks”的描述一致。真正的推理循环由 get_buffered_pred_feat_multitaskAED() 驱动它先根据preprocessor_cfg构建一个不执行归一化的预处理器归一化在 frame_bufferer 内按 buffer 完成逐条读取音频/ manifest调用asr.read_audio_file()与asr.transcribe()得到假设结果。脚本在推理前还会把preprocessor.dither与preprocessor.pad_to置零并要求模型使用per_feature归一化见 speech_to_text_aed_chunked_infer.py。推理完成后结果通过write_transcription()写入输出 manifest若calculate_werTrue则调用cal_write_wer()计算并输出 WER/CER 汇总。AED 流式推理Wait-k 与 AlignAtt 解码策略面向实时场景仓库提供 speech_to_text_aed_streaming_infer.py 支持 AEDCanary模型的流式解码目前支持Wait-k与AlignAtt两种策略Wait-k 策略每个新的语音 chunk 只预测一个 token整体延迟较高。由于不清楚在有限缓冲区下何时可以丢弃左侧上下文建议将左上下文设为最大可能值无限左上下文。AlignAtt 策略根据每次下一个 token 预测时的交叉注意力cross-attention条件决定若条件满足则无需增加音频输入即可继续预测下一个 token否则需要扩大音频缓冲区。相比 Wait-k该策略延迟更低也适合固定左上下文的窗口识别但可能损失部分准确率。音频缓冲区推荐配置脚本 docstring 给出推荐的缓冲区设置以1.5s 延迟进行流式推理10-1-0.5左上下文 10s、chunk 1s、右上下文 0.5s。命令行示例与关键参数python examples/asr/asr_chunked_inference/aed/speech_to_text_aed_streaming_infer.py \ pretrained_namenvidia/canary-1b-v2 \ model_pathnull \ audio_diroptional path to folder of audio files \ dataset_manifestoptional path to manifest \ output_filenameoptional output filename \ right_context_secs0.5 \ chunk_secs1.0 \ left_context_secs10.0 \ batch_size32 \ clean_groundtruth_textFalse \ langiden \ decoding.streaming_policyalignatt该脚本的配置在TranscriptionConfig中定义见 speech_to_text_aed_streaming_infer.py关键参数如下参数默认值说明chunk_secs2流式 chunk 时长秒left_context_secs10.0左上下文增大可提升质量且不影响理论延迟right_context_secs2右上下文直接影响延迟decoding.streaming_policy—必须是alignatt或waitk否则脚本抛ValueError见 speech_to_text_aed_streaming_infer.pydecoding.alignatt_thr8AlignAtt 策略的交叉注意力阈值decoding.waitk_lagging2起始等待的 chunk 数对两种策略均生效decoding.exclude_sink_frames8计算 xatt 分数时排除的帧数AlignAtt 专用decoding.xatt_scores_layer-2获取交叉注意力分数的层AlignAtt 专用decoding.hallucinations_detectorTrue检测预测 token 中的幻觉两种策略均生效calculate_bleuFalseAST 任务下计算 BLEUcalculate_latencyTrue计算 LAAL 解码延迟解码过程的工程细节从源码看该脚本对上下文做了帧级对齐处理先由make_divisible_by()将“音频采样数→特征帧→编码器帧”的换算因子对齐到编码器下采样因子的整数倍再通过ContextSize把 left/chunk/right 三个秒级配置换算成编码器帧数与音频采样数见 speech_to_text_aed_streaming_infer.py。脚本会在日志中输出“修正后的上下文秒”与理论延迟Theoretical latency: {latency_secs:.2f} seconds即(chunk right_context)对应的音频时长。解码主循环使用StreamingBatchedAudioBuffer维护滑动音频缓冲区每次向模型送入完整的[left | chunk | right]缓冲随后仅解码 chunk 对应帧的编码器输出并滑动窗口继续处理下一个 chunk见 speech_to_text_aed_streaming_infer.py。延迟评估LAAL 指标脚本内置延迟评估calculate_latencyTrue时按策略调用compute_waitk_lagging()或compute_alignatt_lagging()输出基于Length-Adaptive Average Lagging (LAAL)度量的平均解码延迟毫秒。两种策略的取舍可概括为Wait-k准确率更高需要更大的左上下文延迟更高AlignAtt延迟更低每个 chunk 可预测多个 token更适合生产环境。更多参数细节可参考仓库配套文档 canary_chunked_and_streaming_decoding.rst其中还强调了 AST 任务下应使用prompt.pnc、prompt.task、prompt.source_lang、prompt.target_lang等 prompt 参数控制模型行为。RNNT Buffered 推理Middle Token、LCS 与 TDT 合并算法对于 Transducer 系模型speech_to_text_buffered_infer_rnnt.py 提供缓冲推理。缓冲推理是音频片段长于 2030 秒时的首选转写方式——尤其对 Conformer 这类时间与内存随音频时长二次增长的模型至关重要。它与流式推理的区别同样是 chunk 大小缓冲推理使用大 chunk510 秒加额外上下文缓冲流式推理使用小 chunk0.10.25 秒加额外右上下文缓冲。Middle Token 合并算法python examples/asr/asr_chunked_inference/rnnt/speech_to_text_buffered_infer_rnnt.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 \ total_buffer_in_secs4.0 \ chunk_len_in_secs1.6 \ batch_size32 \ clean_groundtruth_textTrue \ langidenLonger Common Subsequence (LCS) 合并算法python examples/asr/asr_chunked_inference/rnnt/speech_to_text_buffered_infer_rnnt.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 \ total_buffer_in_secs4.0 \ chunk_len_in_secs1.6 \ batch_size32 \ merge_algolcs \ lcs_alignment_dirOPTIONAL: Some path to store the LCS alignments此外可用DEBUG1环境变量启动脚本打印模型预测与 manifest 中的真实文本如果存在。合并算法与模型类型的对应关系脚本在运行时自动检测模型类型并选择默认算法若模型损失为TDTLossNumbaTDT 模型默认merge_algotdt否则默认middleTDT 模型强制要求merge_algotdt否则抛异常见 speech_to_text_buffered_infer_rnnt.py。三种算法的底层实现类均位于 streaming_utils.pymiddle使用 BatchedFrameASRRNNT基于中间 token拼接相邻 chunk 的预测lcs使用 LongestCommonSubsequenceBatchedFrameASRRNNT基于最长公共子序列做文本对齐合并可指定lcs_alignment_dir保存中间对齐结果且需通过frame_asr.lcs_delay floor((total_buffer - chunk_len) / model_stride_in_secs)设置算法延迟tdt使用 BatchedFrameASRTDT。关键参数与解码配置参数默认值说明chunk_len_in_secs1.6chunk 时长秒total_buffer_in_secs4.0总缓冲区时长chunk 左右填充秒merge_algoNonemiddle/lcs/tdtNone时按模型类型自动选择max_steps_per_timestep5每个声学时间步最多解码的 token 数stateful_decodingFalse是否启用跨 buffer 的状态保持解码compute_timestampsFalse输出时间戳仅部分模型支持脚本会自动改写解码配置启用stateful_decoding或 TDT 时使用greedy策略否则使用greedy_batch同时强制preserve_alignmentsTrue计算中间 token 必需、fused_batch_size-1临时关闭融合批处理、beam.return_best_hypothesisTrue仅返回最优假设见 speech_to_text_buffered_infer_rnnt.py。注意该脚本运行时会打印弃用警告推荐改用新的speech_to_text_streaming_infer_rnnt.py。RNNT 新一代流式 / 缓冲推理脚本speech_to_text_streaming_infer_rnnt.py 是 RNNT 缓冲推理的替代与升级版本同时支持缓冲与流式两种模式。其理论延迟不含模型推理时间的纯延迟chunk 时长 右上下文时长保持较大的左上下文约 10s并非必需但可以提升转录质量。推荐设置脚本 docstring 给出的经验配置长文件转写多数场景下10-10-5左上下文 10s、chunk 10s、右上下文 5s可获得接近离线推理的结果4s 延迟流式10-2-2通常与10-0.16-3.84效果相当或更好且显著更快。命令行示例python examples/asr/asr_chunked_inference/rnnt/speech_to_text_streaming_infer_rnnt.py \ pretrained_namenvidia/parakeet-rnnt-1.1b \ model_pathnull \ audio_diroptional path to folder of audio files \ dataset_manifestoptional path to manifest \ output_filenameoptional output filename \ right_context_secs2.0 \ chunk_secs2 \ left_context_secs10.0 \ batch_size32 \ clean_groundtruth_textFalse \ langiden相比旧脚本的新增能力从TranscriptionConfig见 speech_to_text_streaming_infer_rnnt.py可以看出新脚本在旧脚本基础上扩展了多项能力上下文三要素独立配置left_context_secs/chunk_secs/right_context_secs脚本会打印修正后的上下文与理论延迟小 chunk 显存优化脚本在导入 PyTorch/NeMo 之前自动向PYTORCH_CUDA_ALLOC_CONF注入expandable_segments:True注释表明使用小 chunk 时最多可节省超过 10 倍的 GPU 显存解码策略支持greedy_batch含 Label-Looping、malsd_batch、maes_batch分别对应GreedyBatchedLabelLoopingComputerBase、ModifiedALSDBatchedRNNTComputer、ModifiedAESBatchedRNNTComputerPer-Stream Biasinguse_per_stream_biasingTrue时可按 manifest 中每条样本的biasing_request做上下文偏置模拟解码simulatedTrue时先按 chunk 计算编码器输出并拼接再一次性解码用于快速实验不同解码算法理论上应与支持流式解码的算法结果一致时间戳与置信度timestamps输出词级时间戳TDT 模型通过tdt_include_token_duration支持confidence输出词级置信度性能评估calculate_rtfxTrue时输出 RTFx实时率因子倒数calculate_werTrue时计算 WER/CER。流式主循环源码解析与 AED 脚本类似主循环按[left | chunk | right]窗口滑动StreamingBatchedAudioBuffer.add_audio_batch_()填充缓冲区 → 编码器一次性处理整段缓冲 → 裁掉左右上下文、仅保留 chunk 对应的编码器帧 → 解码器在上一 chunk 状态prev_batched_state基础上继续解码 → 假设通过merge_()与历史合并窗口前移一个 chunk见 speech_to_text_streaming_infer_rnnt.py。对于att_context_stylechunked_limited_with_rc的统一 ASR 模型脚本还会通过set_default_att_context_size()把注意力窗口与解码 chunk 对齐这是实现极低延迟的关键。参数速查与最佳实践总结通用输入约束四个脚本共同的约束均由源码校验model_path与pretrained_name必须至少提供一个否则抛ValueErroraudio_dir与dataset_manifest必须至少提供一个模型预处理器必须使用per_feature归一化否则脚本报错仅记录错误日志流式场景下dither0.0、pad_to0会被强制设置以保证分块特征一致性。不同场景的参数选型建议场景模型类型推荐配置预期延迟长音频离线转写RNNTleft10s, chunk10s, right5s接近离线流式转写4s 延迟RNNTleft10s, chunk2s, right2s约 4s流式转写1.5s 延迟Canary (AED)left10s, chunk1s, right0.5s约 1.5s高准确率流式Canary (AED)Wait-k 大左上下文较高低延迟生产流式Canary (AED)AlignAtt 固定窗口较低实践要点chunk 越小延迟越低、WER 越高chunk 大小是调节“首字延迟”与“准确率”的核心旋钮所有脚本的 README 与 docstring 都围绕这一点展开。左上下文只影响质量、不影响理论延迟左右上下文与 chunk 独立配置理论延迟恒为chunk right。manifest 优于裸音频目录manifest 可以指定taskname、source_lang、target_lang从而控制 ASR/AST 任务与语言方向避免默认英文 ASR。开启时间戳注意 chunk 限制AED chunked 脚本在timestampsTrue时会强制chunk_len_in_secs10.0。小 chunk 记得启用显存优化RNNT 新脚本默认注入expandable_segments如手动设置PYTORCH_CUDA_ALLOC_CONF请保留该选项。延伸阅读配套文档Canary Chunked and Streaming Decoding包含 Wait-k / AlignAtt 参数与prompt用法流式相关教程Streaming_ASR.ipynb、Buffered_Transducer_Inference.ipynb、Buffered_Transducer_Inference_with_LCS_Merge.ipynbCTC 模型流式推理asr_streaming_inference底层实现streaming_utils.pyFrameBatchMultiTaskAED、BatchedFrameASRRNNT、LongestCommonSubsequenceBatchedFrameASRRNNT、ContextSize、StreamingBatchedAudioBuffer、transcribe_utils.pyget_buffered_pred_feat_rnnt、get_buffered_pred_feat_multitaskAED。【免费下载链接】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),仅供参考