Nemotron Streaming

Две модели потокового ASR от NVIDIA используют общий Swift-target NemotronStreamingASR. Обе — это FastConformer-энкодеры с cache-aware вниманием на 600M параметров в паре с RNN-T декодером, обе нативно выдают пунктуацию и регистр обычными BPE-токенами, обе работают на Apple Neural Engine через CoreML, а многоязычная вариация дополнительно имеет MLX-бандлы для GPU-резидентного инференса. Выбирайте подходящую под вашу задачу:

ВариантПокрытиеЧанк по умолчаниюUpstream
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 (английский)Только английский — меньший бандл, меньшая задержка по умолчанию160 msnvidia/nemotron-speech-streaming-en-0.6b

Общие свойства

Архитектура

Три CoreML-модели в pipeline на каждый аудио-чанк:

КомпонентОписание
Энкодер24-слойный cache-aware FastConformer, 1024 hidden. Принимает 32-фреймовый mel-чанк (по умолчанию 320 мс) плюс шесть тензоров состояния — кэш attention KV [24, 1, 56, 1024], depthwise conv-кэш [24, 1, 1024, 8], mel loopback pre_cache и 128-слотный one-hot language_mask, управляющий prompt kernel.
Prompt kernelLinear(1152→2048) → ReLU → Linear(2048→1024) — встраивает one-hot языка в каждый закодированный фрейм, так что одни и те же 600M веса обслуживают все 40 языковых локалей.
ДекодерДвухслойная LSTM-сеть предсказания, 640 hidden. Принимает предыдущий не-blank токен, выдаёт embedding и обновлённое (h, c) состояние.
JointСливает выходы энкодера и декодера в logits по 13 087 BPE-токенов + blank. Пунктуация, регистр и языковые тэги — просто дополнительные токены в BPE-словаре, отдельных голов нет.

Без EOU-головы

В отличие от Parakeet-EOU, Nemotron не выдаёт отдельный токен конца высказывания. Два способа сегментировать непрерывное аудио на высказывания:

  1. Внешний VAD — сочетайте сессию с Silero VAD; при длительной тишине вызывайте finalize(), чтобы зафиксировать текущее высказывание, и createSession() для следующего.
  2. Граница пунктуации — когда частичная транскрипция оканчивается на ., ? или !, считайте это естественным сигналом коммита. Без дополнительной модели, но зависит от того, что аудио действительно индуцирует конечную пунктуацию.

Бандлы

Четыре опубликованных варианта 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

Upstream: nvidia/nemotron-3.5-asr-streaming-0.6b (многоязычная) и nvidia/nemotron-speech-streaming-en-0.6b (только английский).

Квантизация по сути без потерь: CoreML INT8, MLX bf16 и MLX 8-bit укладываются в ±0,3 п.п. WER от fp32-исходника NeMo. MLX 4-bit обходится примерно в 6 п.п. среднего WER в обмен на наименьший размер на диске и стриминг-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 (true только для последнего частичного результата после finalize()), confidence и монотонно возрастающий segmentIndex.

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 hidden17-слойный FastConformer, 512 hidden
Декодер2-layer LSTM, RNN-T1-layer LSTM, RNN-T
Детекция EOUВнешняя (VAD или пунктуация)Встроенный токен <EOU>
ПунктуацияНативные inline BPE-токеныНет (пост-обработка)
Языки40 языковых локалей (en-US, en-GB, es-ES, fr-FR, de-DE, ja-JP, ko-KR, zh-CN, hi-IN, ar, …)25 европейских
Чанк по умолчанию320 ms320 ms
Размер бандла612 МБ (CoreML INT8); 473 МБ (MLX 4-bit)~150 МБ
Выбирайте Nemotron, когда…

…вам нужна многоязычная потоковая транскрипция (любая из 40 локалей) с пунктуацией и регистром из коробки, и вы готовы сами сегментировать высказывания (через VAD или сигнал пунктуации). Для ограниченной iOS-диктовки только на английском со встроенным сигналом EOU Parakeet-EOU остаётся более компактным выбором.