Views
No views yet
nvidia/parakeet-ctc-0.6b
(FastConformer-CTC, ~0.6 B params, English) adapted to Indian legal / court-proceeding
audio. On the held-out test set it reaches 18.27 % WER (greedy, no language model) versus
23.39 % for the base model — a 5.1-point (≈22 % relative) improvement.nvidia/parakeet-ctc-0.6b (BPE tokenizer kept unchanged)vanarp/legal2023_38hrs (train split, 35.66 h)⚠️ The transcripts are pseudo-labels (pipeline-derived, not human gold) and the audio is restricted court-proceeding data — read Limitations and License below before use.
vanarp/legal2023_38hrs is already silence-padded and matches the reported
number. The snippet below downloads the model, transcribes the test split greedily, and computes
corpus WER with the same normalizer used to produce 18.27 % (lowercase, keep [a-z0-9 ],
collapse whitespace; word-level Levenshtein; total edits ÷ total reference words).1pip install "nemo_toolkit[asr]==2.7.3" "datasets>=2.18" huggingface_hub
2# torch 2.8 (cu128) is pulled in by NeMo; a GPU is recommended.1import re
2from datasets import load_dataset
3from huggingface_hub import hf_hub_download
4from nemo.collections.asr.models import ASRModel
5
6# 1. model + test split (set REPO_ID to where you upload this model)
7REPO_ID = "vanarp/parakeet-ctc-0.6b-legal2023"
8ckpt = hf_hub_download(REPO_ID, "parakeet-ctc-0.6b-legal2023.nemo")
9model = ASRModel.restore_from(ckpt) # tokenizer is bundled in the .nemo
10
11ds = load_dataset("vanarp/legal2023_38hrs", split="test") # 2258 padded segments, 26 speakers
12
13# 2. transcribe (greedy) — audio is stored inline as 16 kHz float arrays
14audio = [row["array"].astype("float32") for row in ds["audio"]]
15hyps = model.transcribe(audio, batch_size=32)
16hyps = [h.text if hasattr(h, "text") else h for h in hyps] # NeMo may return Hypothesis objects
17
18# 3. normalize exactly like the original pipeline
19_PUNCT, _WS = re.compile(r"[^a-z0-9 ]+"), re.compile(r"\s+")
20def norm(t): return _WS.sub(" ", _PUNCT.sub(" ", t.lower())).strip()
21
22# 4. corpus WER = total word-level edits / total reference words
23def word_edits(r, h):
24 dp = list(range(len(h) + 1))
25 for i, rw in enumerate(r, 1):
26 prev, dp[0] = dp[0], i
27 for j, hw in enumerate(h, 1):
28 prev, dp[j] = dp[j], min(dp[j] + 1, dp[j - 1] + 1, prev + (rw != hw))
29 return dp[-1]
30
31edits = words = 0
32for ref, hyp in zip(ds["text"], hyps):
33 r, h = norm(ref).split(), norm(hyp).split()
34 edits += word_edits(r, h); words += len(r)
35
36print(f"corpus WER = {100 * edits / words:.2f}%") # -> ~18.27%model.transcribe([...]).legal2023_38hrs test (2258 segments, padded, greedy, no LM)| Model | Corpus WER | mean-utt WER |
|---|---|---|
base nvidia/parakeet-ctc-0.6b | 23.39 % | 32.41 % |
| this fine-tune | 18.27 % | 24.28 % |
nvidia/parakeet-rnnt-1.1b (independent judge) | 20.03 % | 27.99 % |
nvidia/parakeet-ctc-0.6b; pretrained BPE tokenizer kept (no vocab rebuild).max_duration 16 s.val_wer (patience 8); best at
epoch 14, dev WER 13.59 %. ~23 epochs / ~5.1 h on one NVIDIA RTX A4500 (20 GB).nvidia/parakeet-ctc-0.6b, released under CC-BY-4.0 — this fine-tune
is distributed under the same license, with attribution to NVIDIA.vanarp/legal2023_38hrs)
is restricted court-proceeding audio; using this model or reproducing these numbers is
subject to that dataset's terms. Ensure you have the right to use the data accordingly.