如何用 prompt 参数控制 NeMo Canary 多任务模型的任务与输出语言
2026/9/14 2:13:15 网站建设 项目流程

如何用 prompt 参数控制 NeMo Canary 多任务模型的任务与输出语言

【免费下载链接】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 的 Canary 系列是多任务语音模型,同一个 checkpoint 既可以做语音转写(ASR),也可以做语音翻译(AST),还能控制是否加标点、输出哪种语言。控制这些行为的不是独立的模型分支,而是一组 prompt 参数:source_langtarget_langtaskpnc等。在推理时,这些参数既可以直接作为model.transcribe()的入参传入,也可以写在 manifest 文件里逐条指定。本文以nvidia/canary-1b-v2为例,说明这两种传参方式、v1 与 v2/Flash 模型对参数的差异,以及如何强制模型只输出单一语言。

准备:加载 Canary 多任务模型

Canary 使用EncDecMultiTaskModel加载(参见 ASR 推理文档 的 Multi-task Inference 一节):

from nemo.collections.asr.models import EncDecMultiTaskModel canary = EncDecMultiTaskModel.from_pretrained("nvidia/canary-1b-v2") decode_cfg = canary.cfg.decoding decode_cfg.beam.beam_size = 1 canary.change_decoding_strategy(decode_cfg)

change_decoding_strategy中把beam_size设为 1 是文档示例给出的做法,用于在批量转写时控制解码方式。可下载的 Canary checkpoint(见 Featured Models 文档)包括:

  • nvidia/canary-1b-v2— 25 种语言,支持 PnC 与 timestamps;
  • nvidia/canary-1b-flash/nvidia/canary-180m-flash— 面向速度优化;
  • nvidia/canary-qwen-2.5b— 仅英文。

注意模型代际:Canary v1 与 Canary Flash / v2 的 manifest 字段要求不同(下文会区分)。

方式一:把 prompt 参数直接传给 transcribe()

最简单的路径是把语言参数直接作为transcribe()的实参,无需 manifest:

results = canary.transcribe( audio=["audio.wav"], batch_size=4, source_lang="en", target_lang="en", pnc=True, )

各参数的含义(来自 Canary Manifest Format 文档):

参数作用
source_lang输入音频语言,ISO 语言代码,如endees
target_lang输出转写语言;ASR 时与source_lang相同,翻译时不同
pnc是否启用标点与大小写(punctuation and capitalization)

对于 v2/Flash 模型,task字段已不存在,模型从语言对自动判断是 ASR 还是 AST:source_langtarget_lang相同即转写,不同即翻译。例如德语音频翻译成英语,就把source_lang="de"target_lang="en";反之两者都写"de"就是德语转写。

方式二:通过 manifest 逐条指定 prompt 字段

批量处理时,可以把同样的 prompt 字段写进 manifest(每行一个 JSON 对象),然后直接把 manifest 传给transcribe()

results = canary.transcribe("manifest.json", batch_size=16)

文档明确说明:这些键在微调时从 manifest 读取并编码为 prompt tokens,推理时则既可以写在 manifest 里,也可以作为model.transcribe()的实参传入,两者等价。

Canary v1(如canary-1b)manifest 中四个键全部必填:

{"audio_filepath": "audio.wav", "text": "hello world", "duration": 3.5, "source_lang": "en", "task": "asr", "target_lang": "en", "pnc": "yes"}

其中task"asr"(转写)或"ast"(翻译),pnc"yes""no"

Canary Flash / v2(如canary-1b-flashcanary-1b-v2)去掉了task键,pnc变为可选(默认"yes"),并新增了若干可选键(默认值均来自文档):

{"audio_filepath": "audio.wav", "text": "hello world", "duration": 3.5, "source_lang": "en", "target_lang": "en", "pnc": "yes"}
必填默认值说明
source_lang输入音频语言(ISO 代码)
target_lang输出语言;ASR 与 source 相同,翻译时不同
pnc"yes""yes"/"no",标点与大小写
itn"no"逆文本正则化
timestamp"no"预测词级时间戳
diarize"no"说话人分离
decodercontext""上下文偏置,如上一段转写文本
emotion"undefined"说话人情绪提示,取值"neutral""angry""happy""sad""undefined"

如果 v1 模型的 manifest 缺少source_langtarget_langtaskpnc中任一必填键,推理时会抛出RuntimeError,提示 manifest 缺少哪些键。

强制输出单一语言

使用多语言 Canary 模型时,如果把source_langtarget_lang都显式设为同一种语言,模型只按该语言转写:

results = canary.transcribe( audio=["audio.wav"], source_lang="de", target_lang="de", )

文档指出这可以防止 phonetic drift——即模型在转写中途擅自切换语言的情况。处理混合语言环境中的德语音频时,用这种写法而不是留空参数,是更稳妥的选择。

可选分支:流式解码时用 +prompt 前缀传参

如果你的推理路径是文档中的流式脚本 speech_to_text_aed_streaming_infer.py,prompt 参数不走transcribe()实参,而是在命令行用+prompt.前缀追加:

python3 examples/asr/asr_chunked_inference/aed/speech_to_text_aed_streaming_infer.py \ pretrained_name=nvidia/canary-1b-v2 \ dataset_manifest="<path to manifest>" \ left_context_secs=10 \ chunk_secs=1 \ right_context_secs=0.5 \ batch_size=32 \ decoding.streaming_policy=waitk \ +prompt.pnc=yes \ +prompt.task=asr \ +prompt.source_lang=en \ +prompt.target_lang=en

文档特别提醒:用+prompt管理这些参数对 AST 任务尤其重要。注意此脚本示例中task仍作为+prompt.task传入(asr/ast),与 Python API 下 v2 模型"由语言对推断任务"的行为不完全相同,按所用脚本的文档执行即可。

结果验证与限制

  • 验证方式transcribe()返回的每个结果可通过.text属性读取转写文本(文档 Basic Transcription 一节展示了print(outputs[0].text)的读法)。对单语言强制场景,检查返回文本是否为预期语言即可;pnc生效时文本应带标点与首字母大写。
  • v1 与 v2 不可混用:v1 的必填task键在 v2/Flash 中已移除,反之 v2 的itntimestampdiarize等键是 v1 文档未列出的。建 manifest 前先确认所用 checkpoint 的代际。
  • 音频要求:NeMo ASR 推理要求 16 kHz 单声道音频(ASR 推理文档)。
  • 长音频:Canary-1b-v2 支持长音频转写,转写单个文件或batch_size=1时会自动启用带重叠窗口的动态分块;也可以用 asr_chunked_inference 脚本按chunk_len_in_secs(默认 40 秒)手动分块。

需要进一步调解码行为(beam、时间戳)时可继续参考 ASR 推理文档与 ASR 配置文档;manifest 的完整字段定义见 Datasets 文档 的 Canary Manifest Format 一节。

【免费下载链接】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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询