Nemotron Streaming

Nemotron-Speech-Streaming-0.6B — это низколатентное потоковое ASR для английского языка от NVIDIA: cache-aware FastConformer-энкодер в паре с RNN-T-декодером; пунктуация и регистр выводятся прямо в виде обычных BPE-токенов. Поставляемый здесь CoreML-бандл включает энкодер с INT8-палитризацией и работает на Apple Neural Engine.

Обзор

Архитектура

На каждый аудиочанк последовательно запускаются три CoreML-модели:

ComponentDescription
Энкодер24-layer cache-aware FastConformer, 1024 hidden. Takes a 17-frame mel chunk (160 ms default) plus five state tensors — attention KV cache [24, 1, 70, 1024], depthwise conv cache [24, 1, 1024, 8], and a pre_cache mel loopback that prepends recent-past audio so chunk boundaries stay continuous.
ДекодерTwo-layer LSTM prediction network, 640 hidden. Consumes the previous non-blank token, emits an embedding plus updated (h, c) state.
JointFuses encoder and decoder outputs into logits over 1024 BPE tokens + blank. Punctuation and capitalization are just more tokens in the BPE vocab — no extra heads.

Нет EOU-головы

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

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

Модель

ComponentSizeHuggingFace
Encoder (INT8)562 MBaufklarer/Nemotron-Speech-Streaming-0.6B-CoreML-INT8
Decoder14 MB
Joint3.3 MB

Upstream: nvidia/nemotron-speech-streaming-en-0.6b (NeMo .nemo-чекпоинт).

Быстрый старт — пакетная транскрипция

Реализует SpeechRecognitionModel, поэтому встраивается в любой путь кода, принимающий обобщённую STT-модель:

import NemotronStreamingASR

let model = try await NemotronStreamingASRModel.fromPretrained()
let text = try model.transcribeAudio(audioSamples, sampleRate: 16000)

Быстрый старт — асинхронный стриминг

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

Каждый PartialTranscript содержит text, isFinal (true только для последнего частичного результата после finalize()), confidence и монотонный segmentIndex.

Долгоживущий API сессии (вход с микрофона)

let session = try model.createSession()

// 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) }

CLI

audio transcribe recording.wav --engine nemotron                    # batch
audio transcribe recording.wav --engine nemotron --stream           # streaming final
audio transcribe recording.wav --engine nemotron --stream --partial # with partials

Nemotron и Parakeet-EOU

Nemotron Streaming 0.6BParakeet-EOU 120M
Параметры600M120M
Encoder24-layer FastConformer, 1024 hidden17-layer FastConformer, 512 hidden
Decoder2-layer LSTM, RNN-T1-layer LSTM, RNN-T
Определение EOUВнешнее (VAD или пунктуация)Встроенный токен <EOU>
ПунктуацияНативные BPE-токены прямо в словареНет (постобработка)
ЯзыкиТолько английский25 европейских
Чанк по умолчанию160 ms320 ms
Размер пакета~580 MB~150 MB
Выберите Nemotron, когда…

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