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 ms | nvidia/nemotron-3.5-asr-streaming-0.6b |
| Nemotron Speech Streaming(英语版) | 仅英语 — bundle 更小,默认延迟更低 | 160 ms | nvidia/nemotron-speech-streaming-en-0.6b |
共有属性
- 原生标点和大小写 — 无需后处理;句号、逗号和大小写都是词表的一部分
- 6 亿参数 — 缓存感知的 24 层 FastConformer 编码器 + 2 层 LSTM RNN-T 解码器 + Joint 网络
- 缓存感知流式 — attention 和 conv 缓存在 chunk 之间流动,跨 chunk 边界保持连续上下文
- 多种 chunk 大小 — 多语言版:80、320、560、1120 ms(默认 320 ms);英语版:80、160、560、1120 ms(默认 160 ms)
- 仅多语言版:prompt kernel(Linear 1152→2048→1024)将 one-hot 语言槽位融入每一帧编码,因此同一套权重服务全部 40 个语言-地区。英语专用版本没有 prompt kernel。
架构
每个音频 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 kernel | Linear(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。把连续音频切分为语句有两种方式:
- 外部 VAD — 将 session 与 Silero VAD 配合;持续静音时调用
finalize()提交当前语句,再createSession()准备下一句。 - 标点边界 — 部分转录以
.、?或!结尾时,视为自然的提交信号。无需额外模型,但依赖音频确实会触发末尾标点。
Bundles
Nemotron-3.5-ASR-Streaming-0.6B 已发布四个变体,外加同一 Swift target 上的旧版英语专用模型:
| 变体 | 磁盘大小 | 流式峰值(M5 Pro) | HuggingFace |
|---|---|---|---|
| CoreML INT8 (默认) | 612 MB | 1238 MB | aufklarer/Nemotron-3.5-ASR-Streaming-0.6B-CoreML-INT8 |
| MLX bf16 | 1217 MB | 1474 MB | aufklarer/…MLX-bf16 |
| MLX 8-bit | 732 MB | 997 MB | aufklarer/…MLX-8bit |
| MLX 4-bit | 473 MB | 747 MB | aufklarer/…MLX-4bit |
| 英语专用(CoreML INT8) | ~580 MB | — | aufklarer/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 携带 text、isFinal(仅在 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.6B | Parakeet-EOU 120M | |
|---|---|---|
| 参数 | 600M | 120M |
| 编码器 | 24 层 FastConformer,1024 隐层 | 17 层 FastConformer,512 隐层 |
| 解码器 | 2-layer LSTM, RNN-T | 1-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 种欧洲语言 |
| 默认 chunk | 320 ms | 320 ms |
| Bundle 大小 | 612 MB(CoreML INT8);473 MB(MLX 4-bit) | ~150 MB |
…你需要多语言流式转录(40 个语言-地区中的任意一个),开箱即用的标点和大小写,并且接受自己切分语句(VAD 或标点信号)。如果是受限设备上的仅英语 iOS 听写、需要内置 EOU 信号,那么 Parakeet-EOU 仍然是更小的选择。