Nemotron 流式识别

两个 NVIDIA 流式 ASR 模型共享同一个 NemotronStreamingASR Swift target。两者均为 6 亿参数的缓存感知 FastConformer 编码器配 RNN-T 解码器,标点和大小写以普通 BPE token 原生输出,通过 CoreML 在 Apple Neural Engine 上运行;多语言版本另外提供用于 GPU 常驻推理的 MLX bundle。请根据应用场景选择:

变体覆盖范围默认 chunk上游
Nemotron 3.5 多语言版40 个语言-地区(en-US、en-GB、es-ES、fr-FR、de-DE、ja-JP、ko-KR、zh-CN、hi-IN、ar、…)320 msnvidia/nemotron-3.5-asr-streaming-0.6b
Nemotron Speech Streaming(英语版)仅英语 — bundle 更小,默认延迟更低160 msnvidia/nemotron-speech-streaming-en-0.6b

共有属性

架构

每个音频 chunk 流经三个 CoreML 模型:

组件描述
编码器24 层缓存感知 FastConformer,1024 隐层。输入是 32 帧 mel chunk(默认 320 ms)外加六个状态张量 — attention KV 缓存 [24, 1, 56, 1024]、depthwise conv 缓存 [24, 1, 1024, 8]、pre_cache mel 回环,以及驱动 prompt kernel 的 128 槽位 one-hot language_mask
Prompt kernelLinear(1152→2048) → ReLU → Linear(2048→1024) — 将语言 one-hot 融入每一帧编码,因此同一套 6 亿权重服务全部 40 个语言-地区。
解码器2 层 LSTM 预测网络,640 隐层。输入上一个非 blank token,输出 embedding 和更新后的 (h, c) 状态。
Joint融合编码器和解码器输出,生成 13 087 BPE token + blank 的 logits。标点、大小写和按语言的 tag 都只是 BPE 词表里的额外 token — 没有专用 head。

无 EOU head

与 Parakeet-EOU 不同,Nemotron 不输出专门的语句结束 token。把连续音频切分为语句有两种方式:

  1. 外部 VAD — 将 session 与 Silero VAD 配合;持续静音时调用 finalize() 提交当前语句,再 createSession() 准备下一句。
  2. 标点边界 — 部分转录以 .?! 结尾时,视为自然的提交信号。无需额外模型,但依赖音频确实会触发末尾标点。

Bundles

Nemotron-3.5-ASR-Streaming-0.6B 已发布四个变体,外加同一 Swift target 上的旧版英语专用模型:

变体磁盘大小流式峰值(M5 Pro)HuggingFace
CoreML INT8 (默认)612 MB1238 MBaufklarer/Nemotron-3.5-ASR-Streaming-0.6B-CoreML-INT8
MLX bf161217 MB1474 MBaufklarer/…MLX-bf16
MLX 8-bit732 MB997 MBaufklarer/…MLX-8bit
MLX 4-bit473 MB747 MBaufklarer/…MLX-4bit
英语专用(CoreML INT8)~580 MBaufklarer/Nemotron-Speech-Streaming-0.6B-CoreML-INT8

上游: nvidia/nemotron-3.5-asr-streaming-0.6b(多语言)和 nvidia/nemotron-speech-streaming-en-0.6b(英语专用)。

量化基本无损:CoreML INT8、MLX bf16 和 MLX 8-bit 相对于 fp32 NeMo 源在 WER ±0.3 pp 以内。MLX 4-bit 平均 WER 损失约 6 pp,换取最小磁盘占用和流式 RSS。

快速开始 — 批量转录

遵循 SpeechRecognitionModel 协议,因此可以直接落入任何接受通用 STT 模型的代码路径:

import NemotronStreamingASR

let model = try await NemotronStreamingASRModel.fromPretrained()
let text = try model.transcribeAudio(audioSamples, sampleRate: 16000, language: "en-US")

快速开始 — 异步流式

for await partial in model.transcribeStream(audio: samples, sampleRate: 16000, language: "ja-JP") {
    if partial.isFinal { print("FINAL: \(partial.text)") }
    else               { print("... \(partial.text)") }
}

每个 PartialTranscript 携带 textisFinal(仅在 finalize() 之后的最后一个部分结果为 true)、confidence,以及单调递增的 segmentIndex

长生命周期 session API(麦克风输入)

let session = try model.createSession(language: "en-US")

// each mic chunk:
let partials = try session.pushAudio(float32Chunk16kHz)
for p in partials { showPartial(p.text) }   // isFinal is false mid-stream

// when the utterance ends (VAD silence or explicit stop):
let trailing = try session.finalize()
for p in trailing { commit(p.text) }

命令行

speech transcribe recording.wav --engine nemotron --language en-US                    # batch
speech transcribe recording.wav --engine nemotron --language en-US --stream           # streaming final
speech transcribe recording.wav --engine nemotron --language ja-JP --stream --partial # partials
speech transcribe meeting.wav   --engine nemotron --language de-DE                    # any of the 40 locales

Nemotron 与 Parakeet-EOU 对比

Nemotron Streaming 0.6BParakeet-EOU 120M
参数600M120M
编码器24 层 FastConformer,1024 隐层17 层 FastConformer,512 隐层
解码器2-layer LSTM, RNN-T1-layer LSTM, RNN-T
EOU 检测外部(VAD 或标点)内置 <EOU> token
标点原生 BPE token无(后处理)
语言40 个语言-地区(en-US、en-GB、es-ES、fr-FR、de-DE、ja-JP、ko-KR、zh-CN、hi-IN、ar、…)25 种欧洲语言
默认 chunk320 ms320 ms
Bundle 大小612 MB(CoreML INT8);473 MB(MLX 4-bit)~150 MB
在以下情况选 Nemotron…

…你需要多语言流式转录(40 个语言-地区中的任意一个),开箱即用的标点和大小写,并且接受自己切分语句(VAD 或标点信号)。如果是受限设备上的仅英语 iOS 听写、需要内置 EOU 信号,那么 Parakeet-EOU 仍然是更小的选择。