Skip to content

feat[notask]: add RNN-T (Transducer) support to transcription-parakeet#3228

Draft
rends-east wants to merge 2 commits into
tetherto:mainfrom
rends-east:pr/transcription-parakeet-rnnt
Draft

feat[notask]: add RNN-T (Transducer) support to transcription-parakeet#3228
rends-east wants to merge 2 commits into
tetherto:mainfrom
rends-east:pr/transcription-parakeet-rnnt

Conversation

@rends-east

@rends-east rends-east commented Jul 12, 2026

Copy link
Copy Markdown

What problem does this PR solve?

transcription-parakeet supports CTC / TDT / EOU / Sortformer GGUFs, but not plain RNN-T (Transducer) checkpoints — e.g. the Transducer branch of NeMo hybrid EncDecHybridRNNTCTCBPEModel models such as the Georgian stt_ka_fastconformer_hybrid_large_pc. The vendored converter mis-detects such checkpoints as tdt and crashes on the missing model_defaults.tdt_durations, and the addon has no rnnt model type.

How does it solve it?

  • converter (vendored convert-nemo-to-gguf.py + convert-nemo.sh): detect hybrid / plain RNN-T checkpoints, emit parakeet.rnnt.* metadata + rnnt.predict.*/rnnt.joint.* tensors; --type rnnt override with convert-time shape guards (joint rows must equal vocab+1). Mirrors the engine-side converter change hunk-for-hunk; the vendoring header records the divergence, to be re-pinned once the engine PR merges.
  • addon: ModelType::RNNT + mapping of the engine's "rnnt" model_type string.
  • JS: 'rnnt' added to the public ModelType; JSDoc/README/CHANGELOG updated; RTF benchmark accepts rnnt.

Depends on the engine PR: tetherto/qvac-ext-lib-whisper.cpp#90 (plain RNN-T head in parakeet-cpp). Draft until that merges and the registry parakeet-cpp port pin is bumped past it — no registry/overlay changes are included here, so the new model type is inert against the currently pinned engine.

Engine-side verification (2026-06-09, nvidia/stt_ka_fastconformer_hybrid_large_pc): the C++ greedy decoder reproduces NeMo greedy RNN-T token IDs 75/75 bit-for-bit on a FLEURS ka clip; CPU == Metal at f16; Metal == NeMo at q8_0; FLEURS ka WER matches NeMo within 0.31%.

Developed with AI assistance (disclosed in the commit trailers); reviewed and verified by the author.

Breaking changes

None — additive: new model type; existing ctc/tdt/eou/sortformer paths are untouched.

Adds the `rnnt` model type for plain RNN-T (Transducer) ASR -- e.g. the Georgian
stt_ka_fastconformer_hybrid_large_pc hybrid transducer head -- running entirely
in QVAC/GGML.

- converter (vendored convert-nemo-to-gguf.py + convert-nemo.sh): emit the rnnt
  GGUF (parakeet.rnnt.* metadata + rnnt.predict/joint tensors); `--type rnnt`.
- addon: ModelType::RNNT + map the engine's "rnnt" model_type string.
- JS: 'rnnt' added to the public ModelType.

Requires a parakeet-cpp engine that ships the RNN-T head (companion
qvac-ext-lib-whisper.cpp PR); the registry parakeet-cpp port pin should be
bumped past that merge before this lands.

Engine verified standalone: the C++ greedy decoder reproduces NeMo greedy RNN-T
token IDs bit-for-bit (75/75 on a FLEURS ka clip; CPU==Metal at f16;
Metal==NeMo at q8_0).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Review Status

Current Status: ❌ PENDING
Approvals so far: none

Pending reviews: Needs 1 Management or Team Lead, and 1 more from Management, Team Lead, or Member.

@victorchimakanu victorchimakanu added the community-contribution PR or issue from an external contributor label Jul 13, 2026
Post-review polish of the transcription-parakeet rnnt support; no
behaviour changes to the addon mapping itself.

- Converter (vendored copy stays hunk-identical with the engine-side
  script): guard --type rnnt on non-transducer checkpoints, assert joint
  rows == vocab+1 and joint.num_classes == decoder.vocab_size, warn when
  NeMo's uncapped max_symbols is baked to 10, fix the wrong
  "label vocab + blank" comment, document the rnnt flavour in the module
  docstring; vendoring header now states the rnnt divergence ahead of the
  pinned commit (re-pin + resync once the engine PR merges).
- convert-nemo.sh: the missing-.nemo hint no longer points rnnt users at
  download-models.sh (which has no rnnt entry and exits 2) -- it says to
  place the HF checkpoint manually.
- Docs: package README (binding intro, convert-nemo.sh usage line,
  source-repos table, auto-detect list, examples, Model Variants row),
  index.js / parakeet.js JSDoc enumerations, ParakeetModel.cpp and
  ParakeetTypes.hpp comments.
- CHANGELOG: [Unreleased] entry for the rnnt model type.
- rtf-benchmark: accept 'rnnt' in VALID_MODEL_TYPES.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

community-contribution PR or issue from an external contributor

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants