如何用 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_lang、target_lang、task、pnc等。在推理时,这些参数既可以直接作为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 语言代码,如en、de、es |
target_lang | 输出转写语言;ASR 时与source_lang相同,翻译时不同 |
pnc | 是否启用标点与大小写(punctuation and capitalization) |
对于 v2/Flash 模型,task字段已不存在,模型从语言对自动判断是 ASR 还是 AST:source_lang与target_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-flash、canary-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_lang、target_lang、task、pnc中任一必填键,推理时会抛出RuntimeError,提示 manifest 缺少哪些键。
强制输出单一语言
使用多语言 Canary 模型时,如果把source_lang和target_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 的itn、timestamp、diarize等键是 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),仅供参考