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 ms | nvidia/nemotron-3.5-asr-streaming-0.6b |
| Nemotron Speech Streaming (английский) | Только английский — меньший бандл, меньшая задержка по умолчанию | 160 ms | nvidia/nemotron-speech-streaming-en-0.6b |
Общие свойства
- Нативная пунктуация и регистр — пост-процессор не нужен; точки, запятые и регистр — часть словаря
- 600M параметров — 24-слойный cache-aware FastConformer-энкодер + 2-слойный LSTM RNN-T декодер + joint-сеть
- Cache-aware стриминг — кэши attention и conv передаются между чанками, сохраняя контекст через границы чанков
- Разные размеры чанков — многоязычная: 80, 320, 560, 1120 мс (по умолчанию 320 мс); английская: 80, 160, 560, 1120 мс (по умолчанию 160 мс)
- Только в многоязычной: prompt kernel (Linear 1152→2048→1024) встраивает one-hot языковой слот в каждый закодированный фрейм, поэтому одни и те же веса обслуживают все 40 локалей. У англоязычной вариации prompt kernel отсутствует.
Архитектура
Три 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 kernel | Linear(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 не выдаёт отдельный токен конца высказывания. Два способа сегментировать непрерывное аудио на высказывания:
- Внешний VAD — сочетайте сессию с Silero VAD; при длительной тишине вызывайте
finalize(), чтобы зафиксировать текущее высказывание, иcreateSession()для следующего. - Граница пунктуации — когда частичная транскрипция оканчивается на
.,?или!, считайте это естественным сигналом коммита. Без дополнительной модели, но зависит от того, что аудио действительно индуцирует конечную пунктуацию.
Бандлы
Четыре опубликованных варианта 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 |
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.6B | Parakeet-EOU 120M | |
|---|---|---|
| Параметры | 600M | 120M |
| Энкодер | 24-слойный FastConformer, 1024 hidden | 17-слойный FastConformer, 512 hidden |
| Декодер | 2-layer LSTM, RNN-T | 1-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 ms | 320 ms |
| Размер бандла | 612 МБ (CoreML INT8); 473 МБ (MLX 4-bit) | ~150 МБ |
…вам нужна многоязычная потоковая транскрипция (любая из 40 локалей) с пунктуацией и регистром из коробки, и вы готовы сами сегментировать высказывания (через VAD или сигнал пунктуации). Для ограниченной iOS-диктовки только на английском со встроенным сигналом EOU Parakeet-EOU остаётся более компактным выбором.