Add NVIDIA parakeet-unified-en-0.6b (fixed-window streaming, NPU) - #11
Conversation
parakeet-unified is a stateless FastConformer-RNNT (English, no caches/prompt) that streams via a fixed [left|chunk|right] attention window. Adds a window-streaming path to the eddy::nemotron backend (auto-detected from metadata): featurize a sliding window, run the static-shape encoder, keep the chunk's encoder frames, greedy RNNT decode carrying LSTM state. Reuses the decoder/joint/NPU BitwiseNot fix. - MelFeaturizer: optional NeMo per_feature normalization (mean/std per bin over valid frames) — parakeet-unified exports normalized features; Nemotron does not (gated by metadata feature_normalize). - Encoder cache inputs now auto-detected (has_cache); cache shapes required only when present. Featurizer geometry guard scoped to the cache-aware path. - model_configs: parakeet-unified -> FluidInference/parakeet-unified-en-0.6b-ov (streaming/fp16). Validated on Intel NPU: WER 5.9% / CER 1.8% on FLEURS en_us samples; Nemotron multilingual + English regression-checked unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Code ReviewThis PR adds parakeet-unified-en-0.6b (stateless FastConformer-RNNT) to the Bug: per-feature normalization includes zero-padded frames at window boundaries
I.featurizer->compute(window.data(), window.size(), static_cast<int>(window.size()),
mel_scratch, t_mel);
The fix is to compute the real non-padded count: // How many samples in [start, start+win_s) actually come from pcm[0..N)?
const long real_lo = std::max(0L, -start);
const long real_hi = std::min(win_s, N - start);
const int valid_n = static_cast<int>(std::max(0L, real_hi - real_lo));
I.featurizer->compute(window.data(), window.size(), valid_n, mel_scratch, t_mel);Middle windows are unaffected (all samples are real audio); only boundary windows carry the bug. Given WER 5.9% was reported on interior speech, the true WER at audio boundaries is likely higher. Bug: infinite loop when
|
- Per-feature mel normalization now excludes zero-padded boundary samples (compute real non-padded count for valid_samples) so stats match NeMo. - Guard chunk_enc / window_mel_frames in metadata: reject <= 0 at startup (missing chunk stride => infinite loop; missing window_mel => zero mel). - Add window-streaming featurizer geometry probe (window_mel_frames must match the featurizer's frame count for the full window). - Bounds-check empty joint logits before reading lg[0] in the decode loop. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Code ReviewThis PR adds the NVIDIA parakeet-unified-en-0.6b model to the 🔴 CONFIRMED —
|
| Severity | Count |
|---|---|
| 🔴 CONFIRMED correctness | 2 |
| 🟡 CONFIRMED accuracy / PLAUSIBLE correctness | 4 |
| 🔵 Cleanup | 1 |
The window_streaming && has_cache gap and the missing h_out/c_out guard are the highest priority — both are easily fixed and prevent silent failures on unexpected IR/metadata combinations.
🤖 Generated with Claude Code
Adds the NVIDIA parakeet-unified-en-0.6b model (English, unified offline/streaming FastConformer-RNNT) to the
eddy::nemotronbackend.What's new
[left|chunk|right]attention window. The backend auto-detects this from metadata and runs a sliding-window decode: featurize the window → static-shape encoder → keep the chunk's encoder frames → greedy RNNT, carrying LSTM state across windows. Distinct from Nemotron's cache-aware loop; reuses the decoder/joint and the NPUBitwiseNot→LogicalNotfix.MelFeaturizer(NeMoper_feature: mean/std per bin over valid frames), gated by afeature_normalizemetadata flag. parakeet-unified exports normalized features; Nemotron does not (defaults off — unchanged).has_cache); cache shapes required only when present; the featurizer geometry guard is scoped to the cache-aware path.parakeet-unified→FluidInference/parakeet-unified-en-0.6b-ov(streaming/fp16, static shapes for NPU).Static shapes → NPU
The offline (full-context) encoder is dynamic-length and won't compile on the NPU; the fixed-window streaming export (
mel[1,128,769]→encoded[1,1024,97]) is static and compiles + runs correctly on NPU.Validation (Intel NPU)
IR produced by the mobius OpenVINO export (
models/stt/parakeet-unified-en-0.6b/openvino/export_openvino.py) and published to the model repo (fp16/offline +streaming/fp16/NPU).🤖 Generated with Claude Code