Nemotron 스트리밍
Nemotron-Speech-Streaming-0.6B는 NVIDIA의 저지연 영어 스트리밍 ASR입니다. 캐시 인식 FastConformer 인코더와 RNN-T 디코더가 결합되어 구두점과 대소문자를 일반 BPE 토큰으로 직접 출력합니다. 본 사이트의 CoreML 번들은 INT8 팔레트화 인코더를 포함하며 Apple Neural Engine에서 실행됩니다.
개요
- 네이티브 구두점 및 대소문자 — 후처리 불필요. 마침표, 쉼표, 대소문자가 모두 어휘의 일부
- 6억 파라미터 — Parakeet-EOU(120M)보다 크며 까다로운 오디오에서 전사 품질이 크게 향상
- 캐시 인식 FastConformer — 24층 인코더. 어텐션과 컨볼루션 캐시가 청크 사이를 흘러 지속적인 컨텍스트 유지
- 네 가지 청크 크기 — 추론 단계당 80, 160, 560, 1120 ms (160 ms가 기본이며 현재 공개된 버전)
- 영어 전용 — 영어 음성으로 학습됨. 다국어 용도는 Qwen3-ASR 또는 Omnilingual ASR
아키텍처
오디오 청크마다 세 개의 CoreML 모델이 파이프라인으로 실행됩니다:
| Component | Description |
|---|---|
| 인코더 | 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. |
| Joint | Fuses 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은 전용 발화 종료 토큰을 출력하지 않습니다. 연속 오디오를 발화로 분할하는 두 가지 방법:
- 외부 VAD — 세션을 Silero VAD와 결합. 지속적인 무음 시
finalize()로 현재 발화를 커밋하고createSession()으로 다음 세션을 생성. - 구두점 경계 — 부분 전사가
.,?,!로 끝나면 자연스러운 커밋 신호로 처리. 추가 모델 불필요하지만 오디오가 실제로 종결 구두점을 유도하는지에 의존.
모델
| Component | Size | HuggingFace |
|---|---|---|
| Encoder (INT8) | 562 MB | aufklarer/Nemotron-Speech-Streaming-0.6B-CoreML-INT8 |
| Decoder | 14 MB | |
| Joint | 3.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(finalize() 이후 마지막 부분 결과에서만 true), 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) }
커맨드라인
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 vs Parakeet-EOU
| Nemotron Streaming 0.6B | Parakeet-EOU 120M | |
|---|---|---|
| 파라미터 | 600M | 120M |
| Encoder | 24-layer FastConformer, 1024 hidden | 17-layer FastConformer, 512 hidden |
| Decoder | 2-layer LSTM, RNN-T | 1-layer LSTM, RNN-T |
| EOU 감지 | 외부 (VAD 또는 구두점) | 내장 <EOU> 토큰 |
| 구두점 | 네이티브 인라인 BPE 토큰 | 없음 (후처리) |
| 언어 | 영어 전용 | 유럽 25개 언어 |
| 기본 청크 | 160 ms | 320 ms |
| 번들 크기 | ~580 MB | ~150 MB |
Nemotron을 선택해야 할 때…
구두점과 대소문자가 기본으로 제공되는 더 높은 품질의 영어 전사가 필요하고 발화 분할을 직접 처리(VAD 또는 구두점 큐)할 수 있을 때. 내장 EOU 신호가 있는 제약된 iOS 받아쓰기에는 여전히 Parakeet-EOU가 더 작고 단순한 선택입니다.