NVIDIA 发布了开放权重语音模型 Nemotron 3.5 Transcribe,同时推出 Granary v2 多语言数据清单和可复用的数据整理流水线。单个模型即可完成语音转写、说话人归属标注、翻译和音频问答。

该模型支持 40 种语言转写、其中 31 种语言与英语的双向翻译,以及 13 种语言的说话人归属标注。不同任务支持的语言有所不同,音频问答使用英语数据训练。

该模型可处理最长一小时的录音,标注最多八位说话人,并支持词级时间戳。针对同一段录音,可通过自然语言指令获得不同输出,例如“转写这段录音并标注每位说话人”“将这段音频翻译成英语”,或“这次会议做出了哪些决定?”

开源地址

模型合集:https://modelscope.cn/collections/nv-community/Nemotron-35-Transcribe

Granary v2 数据集:https://modelscope.cn/datasets/nv-community/Granary-v2

01、开始使用 Nemotron 3.5 Transcribe 和 Granary v2

通过 ModelScope 创空间体验 Nemotron 3.5 Transcribe 交互式演示,然后从 ModelScope 下载模型权重,并参照 vLLM 部署指南部署服务。若要适配您的领域,可从 ModelScope 上的 Granary v2 数据清单和医疗 ASR 案例研究入手,也可借助微调智能体技能,让编程智能体驱动整个流程。

模型与数据集

代码仓库与教程

本地 AI:

NVIDIA RTX 台式机笔记本电脑和 DGX Spark 上的本地 AI 最新进展:https://blogs.nvidia.com/blog/local-ai-rtx-spark-laptops-updates-models-agents-games/


02、多语言转写基准测试与推理效率

Nemotron 3.5 Transcribe 在英语转写、多语言说话人区分、重叠语音和真实通话评测中取得领先成绩。凭借约 40 亿激活参数,其转写准确率也接近开放权重模型中的最佳水平,兼顾识别性能与参数效率。

Open ASR:英语转写排名第一

Nemotron 3.5 Transcribe 在英语排行榜的开放权重模型中排名第一,平均词错误率(WER)为 5.33%。在模型卡所列的对比中,其七种语言的平均 WER 为 4.62%,长音频 WER 为 10.98%,两项均为参评开放权重模型中的最低值:

Artificial Analysis:以约 40 亿激活参数实现接近最佳水平的准确率

该模型以约 40 亿激活参数实现了 2.81% 的 AA-WER,与开放权重模型的最佳成绩仅相差 0.04 个百分点,而激活参数量约为其六分之一:

David AI:多语言说话人区分错误率最低

在覆盖 21 种语言的说话人区分评测中,该模型以 18.26% 的说话人区分错误率(DER)位列 14 个系统之首。在转写与说话人归属标注联合赛道中,该模型在开放权重模型中排名第一、总体排名第二:

VoiceArena:在完整会话与重叠语音中表现领先

在包含重叠语音及 2–8 位说话人的英语完整会话评测中,该模型以 32.4% 的 cpWER 在 14 个系统中排名第一,同时取得最低的词删除率:

Cekura:真实通话评测中在开放权重模型中排名第一

在包含噪声和不同口音的真实通话私有评测中,该模型使用推荐提示词时的 WER 为 2.48%,在开放权重模型中排名第一:WER 衡量转写错误,DER 衡量说话人归属标注与时间定位错误,cpWER 则在匹配说话人标签后统计转写错误。这三项指标均为数值越低越好。


03、模型架构与 Granary v2 数据流水线

Nemotron 3.5 Transcribe 将语音编码器与采用 Mamba–Transformer 混合架构的混合专家语言模型相结合。模型总参数量为 300 亿,每个 token 激活约 40 亿参数。

Sortformer 提供的说话人线索与声学特征一同输入语言模型,使模型能够在生成文本时标注每一轮发言的说话人。

要根据提示词生成不同形式的转写文本,模型还需要具有明确书面目标形式的训练数据。因此,基于 NVIDIA NeMo Curator 构建的 Granary v2 会为同一段录音生成三种相互对齐的转写形式:tn_raw 为经过文本规范化的逐字转写;

itn_raw 将数字等表达转换为常规书面形式,同时保留口语中的不流畅表达;itn_clean 则在此基础上进一步去除不流畅表达:除了转写文本,该流水线还会生成音频描述、语码混用语音中的外来词还原、音频问答对、上下文术语,以及带质量评分的译文,为不同任务提供训练标签。公开数据清单覆盖 48 种语言、16 个源语料库,共计 463,062 小时。

这些数字描述的是此次发布的数据集,并非 Transcribe 的完整训练数据组合或采样权重。源音频需遵循各语料库的原始许可单独下载,并遵守此次发布所公布的条款。

数据整理流程分为四个阶段:Metadata、ASR、Text 和 HiFi。Metadata 阶段对音频进行分段、跟踪说话人,并标注声学事件和语言。此次发布的源数据已完成分段,因此跳过了该阶段。

随后,ASR 阶段为每种语言指定主模型和回退模型;当主模型未通过幻觉检查时,切换至回退模型,并使用人工参考转写保留可信的拼写。

转写文本生成后,Text 阶段会衍生其他转写变体,并检查字符速率、幻觉模式和文本一致性。只有通过这些检查的记录,才会进入上下文术语和翻译生成环节。前三个阶段的关系如下图所示:

HiFi 阶段进一步过滤含有噪声、削波失真或多位说话人的片段,为 ASR 以外的任务保留高质量子集。


04、利用领域数据微调,提升医疗语音转写效果

医疗录音包含专业术语、药品名称和不同口音。即便通用语音模型能够识别发音,也未必能按要求准确写出术语。提示词可以提供上下文和书写规范,但对于仍然存在的识别错误,需要使用领域数据进行微调,让模型学习这些术语的发音和标准拼写。

NVIDIA 使用其语音模型训练与微调工具包 NeMo Speech,对 Nemotron 3.5 Transcribe 进行医疗语音适配。该案例研究测试了先优化提示词、再进行微调,能否提升印度医生和医学生录音的转写效果。

研究首先在提示词中明确英语、拉丁字母和转写格式,随后将约 153 小时合成语音、29 小时带口音英语和 63 小时医疗录音组合成适配数据。合成过程将标准书面形式与发音分开:例如,以“HbA1c”为标签,而将“H B A one C”输入语音合成器。

随后,训练会更新语音编码器和投影层,并通过 LoRA 适配语言模型,根据开发集结果选择检查点。完整流程在一块 NVIDIA GB300 上耗时约 14 GPU 小时。最终转写仅需一次模型前向处理,无需检索或后处理。

在完整的 Eka Care 基准测试中,WER 从开箱即用时的 30.8%,降至优化提示词后的 23.8%,再降至微调后的 11.8%:

完整基准包含 3,619 个片段,其中 855 个调优片段用于选择提示词和检查点,因此全量结果并非完全基于留出集的评测。在按说话人划分的 2,764 个留出片段上,微调将 WER 从最佳提示词基线的 22.44% 降至 12.17%,相对降低 45.8%,表明适配收益也能延伸至未参与调优的说话人。


05、本地部署与推理

Nemotron 3.5 Transcribe 可通过 NeMo Speech 插件配合 vLLM,部署为兼容 OpenAI API 的服务。以下采用官方单卡 H100 80GB BF16 配置,使用 Linux、Python 3.13 及兼容的 NVIDIA 驱动。

模型下载

从 ModelScope 下载模型


pip install modelscope
modelscope download \
  --model nv-community/NVIDIA-Nemotron-3.5-Transcribe-30B-A4B \
  --local_dir nv-community/NVIDIA-Nemotron-3.5-Transcribe-30B-A4B

MODEL_DIR="$PWD/nv-community/NVIDIA-Nemotron-3.5-Transcribe-30B-A4B"

环境安装

在同一终端中安装 NeMo Speech 和 vLLM。官方部署示例采用 vLLM 0.32.0 和 NeMo Speech 最新 main 分支,并安装仓库中锁定版本的依赖:

pip install uv
git clone https://github.com/NVIDIA-NeMo/Speech.git nemo-speech
cd nemo-speech
uv venv --python 3.13 .venv

UV_PROJECT_ENVIRONMENT=$PWD/.venv \
  uv sync --extra asr --extra vllm --locked --no-install-project

uv pip install --python .venv/bin/python --no-deps -e .
uv pip install --python .venv/bin/python --no-deps \
  opencv-python-headless==5.0.0.93
uv pip install --python .venv/bin/python openai
source .venv/bin/activate

启动 vLLM 服务

在同一终端中启动服务,并启用 MTP 推测解码:

export VLLM_PLUGINS=nemo_speechlm
export VLLM_MAX_AUDIO_DECODE_DURATION_S=3600
export VLLM_MAX_AUDIO_CLIP_FILESIZE_MB=180
export VLLM_USE_V2_MODEL_RUNNER=0

vllm serve "$MODEL_DIR" \
  --served-model-name nvidia/NVIDIA-Nemotron-3.5-Transcribe-30B-A4B \
  --trust-remote-code --dtype bfloat16 --gpu-memory-utilization 0.94 \
  --max-model-len 65536 --max-num-batched-tokens 4096 --max-num-seqs 192 \
  --enable-chunked-prefill --no-enable-prefix-caching \
  --use-replayssm --mamba-backend flashinfer --mamba-cache-mode none \
  --mm-processor-cache-gb 0 --no-async-scheduling \
  --limit-mm-per-prompt '{"audio":{"count":6,"length":120000000}}' \
  --speculative-config '{"method":"mtp","num_speculative_tokens":8}' \
  --reasoning-parser nemotron_v3 \
  --trust-request-mm-kwargs \
  --middleware nemo.collections.speechlm2.vllm.salm.ctc_serving.ctc_timestamp_middleware

服务默认监听 127.0.0.1:8000。以上参数面向 H100 80GB;在其他设备上,请根据可用 GPU 显存调整上下文长度和并发数。

调用本地服务

在另一个终端中激活同一环境,然后使用 OpenAI SDK 上传本地 WAV 音频文件并获取转写文本:

import base64
from pathlib import Path
from openai import OpenAI

client = OpenAI(base_url="http://127.0.0.1:8000/v1", api_key="EMPTY")
audio = base64.b64encode(Path("audio.wav").read_bytes()).decode()

response = client.chat.completions.create(
    model="nvidia/NVIDIA-Nemotron-3.5-Transcribe-30B-A4B",
    messages=[{"role": "user", "content": [
        {"type": "text", "text": "Transcribe the following audio."},
        {"type": "audio_url", "audio_url": {
            "url": f"data:audio/wav;base64,{audio}"
        }},
    ]}],
    temperature=0,
    top_p=1.0,
    max_tokens=16384,
    extra_body={
        "chat_template_kwargs": {"enable_thinking": False},
        "skip_special_tokens": False,
    },
)
print(response.choices[0].message.content)

将 audio.wav 替换为实际的 WAV 文件。如需语音翻译,将提示词改为 Please translate the given speech to Chinese.(请将给定语音翻译为中文。)

转写和翻译任务请保持系统提示词为空。该模型面向离线音频处理,并非实时流式 ASR 服务。


06、模型训练

ms-swift 支持训练 Nemotron 3.5 Transcribe。ms-swift 是 ModelScope 官方的大模型训练框架。开源仓库:https://github.com/modelscope/ms-swift

环境准备:

pip install git+https://github.com/modelscope/ms-swift.git

pip install transformers -U
# 其他依赖的安装请参阅:https://swift.readthedocs.io/zh-cn/latest/Megatron-SWIFT/Quick-start.html
#id2

下面以 google/fleurs 数据集中的粤语数据为例,训练模型的粤语转写能力。SFT 脚本如下:

PYTORCH_CUDA_ALLOC_CONF='expandable_segments:True' \
SWIFT_AUDIO_LOAD_BACKEND=soundfile_pyav \
NPROC_PER_NODE=4 \
CUDA_VISIBLE_DEVICES=0,1,2,3 \
megatron sft \
    --model nv-community/NVIDIA-Nemotron-3.5-Transcribe-30B-A4B \
    --dataset 'google/fleurs:yue_hant_hk_train' \
    --val_dataset 'google/fleurs:yue_hant_hk_validation' \
    --load_from_cache_file true \
    --tuner_type lora_llm \
    --lora_rank 8 \
    --lora_alpha 16 \
    --target_modules linear_qkv linear_proj proj \
    --freeze_vit false \
    --freeze_aligner false \
    --tensor_model_parallel_size 1 \
    --expert_model_parallel_size 4 \
    --expert_tensor_parallel_size 1 \
    --context_parallel_size 1 \
    --mtp_num_layers 0 \
    --megatron_extra_kwargs '{"moe_router_bias_update_rate":0.0}' \
    --micro_batch_size 1 \
    --global_batch_size 16 \
    --num_train_epochs 3 \
    --max_length 8192 \
    --lr 5e-5 \
    --lr_warmup_fraction 0.05 \
    --min_lr 5e-6 \
    --recompute_granularity selective \
    --padding_free false \
    --packing false \
    --attention_backend flash \
    --logging_steps 1 \
    --eval_steps 200 \
    --save_steps 1000 \
    --save_safetensors true \
    --save_missing_weights true \
    --merge_lora true \
    --no_save_optim true \
    --no_save_rng true

训练曲线如下所示

训练完成后,在验证集上运行推理:


CUDA_VISIBLE_DEVICES=0 swift infer \
--model output/vx-xxx/checkpoint-xxx \
--max_new_tokens 256 \
--temperature 0 \
--stream false

将微调后的模型推送至 ModelScope:

swift export \    
  --adapters output/vx-xxx/checkpoint-xxx \
  --push_to_hub true \
  --hub_model_id '<your-model-id>' \
  --hub_token '<your-sdk-token>'