Instructions to use dys-asr/parakeet-ctc-0.6b-sapc2 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use dys-asr/parakeet-ctc-0.6b-sapc2 with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("automatic-speech-recognition", model="dys-asr/parakeet-ctc-0.6b-sapc2")# Load model directly from transformers import AutoModelForCTC model = AutoModelForCTC.from_pretrained("dys-asr/parakeet-ctc-0.6b-sapc2", device_map="auto") - Notebooks
- Google Colab
- Kaggle
parakeet-ctc-0.6b-sapc2
nvidia/parakeet-ctc-0.6b fine-tuned on the Speech Accessibility Project
corpus 2 (SAPC2) train split for recognition of dysarthric and otherwise
disordered speech.
On the SAPC2 dev split it removes about 53% of the generic model's word errors:
| WER | CER | |
|---|---|---|
nvidia/parakeet-ctc-0.6b |
24.62% | 15.78% |
dys-asr/parakeet-ctc-0.6b-sapc2 |
11.51% | 6.85% |
Both rows are the same evaluation: all 47,929 dev utterances (106.6 h, 451,437 reference words), greedy CTC decoding, no language model, no duration cap on scoring, both sides through the same normaliser.
An earlier release of this model reported 13.46% WER, and that figure should be
discarded. It was scored against references that still contained the bracketed
interview prompt, which the audio does not contain, and that release had been
trained on the same inflated labels -- so it was rewarded for reproducing a
question nobody asked. Scored against corrected references it measures 22.29%,
and on Codabench Track 1 Test1 it scored 32.08 WER while the stock
nvidia/parakeet-ctc-0.6b it was fine-tuned from scored 17.45. This release
fixes the labels. See Transcript markup.
This is not comparable to parakeet-ctc-0.6b-sapc1's 10.32% WER. That figure
is on the SAPC1 dev split, a different and easier set of speakers. See
Relationship to the SAPC1 model.
Output text convention
This model writes numbers as words and emits upper-case, unpunctuated text.
audio: "lower the temperature three degrees"
output: LOWER THE TEMPERATURE THREE DEGREES # not "... 3 DEGREES"
The tokeniser has 1,025 tokens and no digit characters, so numerals cannot be
produced. Training transcripts are therefore verbalised before tokenisation:
"2" becomes TWO, "$45" becomes FORTY FIVE DOLLARS, "1949" becomes
NINETEEN FORTY NINE, and dash-joined digit groups are read digit by digit
(053-621 becomes OH FIVE THREE DASH SIX TWO ONE).
This matters for scoring. An earlier model in this series was trained on labels
that kept numerals, which the tokeniser mapped to <unk>; it emitted <unk>
wherever a number belonged and could never produce one. Fixing that was worth
3.29 WER points. If you score this model, apply the same verbalisation to
your references, or numerals will dominate your error count.
Transcript markup
SAPC2 wraps the canonical interview prompt, and PII redactions, in square brackets. The prompt was shown to the speaker, not read to them, so none of it is in the audio. Left in the labels it trains the model to transcribe a question nobody asked. It affects 41,553 train records -- 230.3 h, 31% of the corpus by duration -- and inflates the labels 11.6% in words.
The first release of this model was trained that way. Bracketed spans and the
#ts / #dis provenance tags are now stripped before normalisation, which is
what this release retrains on.
The evidence is a cross-check of the two corpus releases rather than inspection:
SAPC2 re-releases 182,575 of SAPC1's train recordings and 28,253 of its dev
recordings under the same filenames and identical durations, and for 3,589 of the
3,601 re-released dev records carrying a bracket, SAPC2's text with the bracket
removed is character-identical to SAPC1's. The clinching case reads
[Talk about some of your hobbies.] while the speaker audibly says "Tell us
about some of your hobbies" -- the bracket does not match the audio it precedes,
because it is the prompt as written rather than as read. SAPC1 has 15 bracketed
records out of 218,898 and is unaffected.
Training data
SAPC2 train split, filtered to 0.5-30 s to match the SAPC1 recipe: 327,168 of 336,075 utterances, dropping 8,903 over 30 s and 4 that normalise to empty.
| train | dev (evaluation) | |
|---|---|---|
| speakers | 875 | 124 |
| utterances, total | 336,075 | 47,929 |
| utterances, used | 327,168 | 47,929 |
| audio used | 621.2 h | 106.6 h |
Speakers by aetiology:
| train | dev | |
|---|---|---|
| Parkinson's Disease | 311 | 35 |
| ALS | 167 | 29 |
| Cerebral Palsy | 167 | 28 |
| Down Syndrome | 145 | 20 |
| Stroke | 85 | 12 |
No speaker appears in both splits (verified: zero speaker-id overlap). SAPC2 is noticeably better balanced than SAPC1, whose dev split is 48% Parkinson's against 28% here, so the aggregate is less dominated by one aetiology.
What the 30 s cap costs
The first release trained on the corpus uncapped, on the argument that a 30 s cap discards 121.5 h — 16.4% of the audio — in only 2.6% of the utterances, because SAPC2's long tail is read passages rather than short prompts. Durations are heavily skewed: median 5.6 s, 99th percentile 47 s, maximum 180 s. Gradient checkpointing made the uncapped run possible, since a full batch of 32 at 181 s needs 48.8 GiB against the 59 GiB that 60 s reaches without it.
This release caps at 30 s anyway, so that the SAPC1 and SAPC2 models differ in their corpus and not in their recipe.
Two things therefore changed at once, and the improvement over the first release is not attributed to either alone: the labels were corrected, and 16.4% of the audio was dropped. The label fix is very likely the larger part -- CER falls from 17.30% to 6.85% against corrected references, which is the signature of removing text the model should never have emitted rather than of a better acoustic model -- but the two have not been separated by an ablation.
Training hyperparameters
The learning rate and effective batch size are inherited from the 20-cell grid
tuned for parakeet-ctc-0.6b-sapc1; they were not re-searched on SAPC2.
| base model | nvidia/parakeet-ctc-0.6b |
| optimizer | AdamW, weight decay 0.01 |
| learning rate | 1e-4 |
| schedule | tri-stage, 10% warmup, 40% hold |
| per-device batch | 16 x 2 GPUs, SyncBatchNorm over all 32 |
| gradient accumulation | 1 |
| effective batch | 32 |
| epochs | 10 (102,240 optimizer updates, 10,224 per epoch) |
| precision | bf16 mixed |
| layerdrop | 0.05 |
| gradient clipping | 1.0 |
| max audio duration | 0.5-30 s (as SAPC1) |
| feature encoder | trainable (not frozen) |
| gradient checkpointing | off |
| batch sampling | length-grouped |
| seed | 42 |
| hardware | 2x NVIDIA A100-SXM4-80GB, ~7.4 h |
Per-device batch size is not a free choice. Parakeet's Conformer normalises
over the per-device batch in 24 BatchNorm1d layers, so it behaves as a
hyperparameter in its own right: holding the learning rate and effective batch
fixed and changing only per-device batch was worth about a WER point. The SAPC1
model got its statistics from a single GPU holding all 32 examples. Splitting
across two GPUs would ordinarily drop that to 16 and change the model, so
SyncBatchNorm is applied to all 24 layers, which all-reduces the statistics and
restores them to the same 32 examples. The run logs this directly:
sync_batch_norm converted=24 processes=2 per_device_batch=16 statistics_over=32
Dev WER was still falling on the final epoch (11.43% to 11.33% on the trainer's own metric), so this recipe has not saturated and more epochs would likely gain further.
| epoch | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| WER | 15.06 | 14.17 | 13.31 | 13.13 | 12.98 | 12.47 | 11.97 | 11.71 | 11.43 | 11.33 |
| CER | 9.25 | 8.63 | 8.01 | 7.90 | 7.94 | 7.49 | 7.16 | 7.03 | 6.85 | 6.76 |
The trainer's metric reads slightly optimistic against a standalone pass: it reports 11.33% where the full evaluation above gives 11.51%.
Results by speaker
The 11.51% aggregate is pooled over words, so it is dominated by the speakers who talk most. Scored per speaker and averaged with equal weight the figure is 13.84%, and the spread behind it is very wide:
| min | 25th | median | 75th | max |
|---|---|---|---|---|
| 1.24% | 4.37% | 9.71% | 17.10% | 71.50% |
65 of 124 dev speakers are under 10% WER; 12 are above 30%. Broken down by aetiology, averaging over speakers:
| aetiology | speakers | mean WER | median WER |
|---|---|---|---|
| Down Syndrome | 20 | 21.64% | 16.31% |
| Cerebral Palsy | 28 | 20.38% | 17.04% |
| Stroke | 12 | 14.80% | 12.90% |
| ALS | 29 | 9.42% | 4.61% |
| Parkinson's Disease | 35 | 7.49% | 5.03% |
Any single number for this model is therefore a poor description of what a given speaker should expect.
Relationship to the SAPC1 model
SAPC2 re-releases and extends SAPC1, so the two models are related, and the overlaps matter if you intend to compare them.
| speakers in common | |
|---|---|
sapc1_train and sapc2_train |
483 |
sapc1_dev and sapc2_dev |
76 |
sapc1_train and sapc2_dev |
0 |
sapc2_train and sapc2_dev |
0 |
The last two rows are the ones that make a comparison legitimate: neither model was trained on any SAPC2 dev speaker, so SAPC2 dev is a fair test set for both. The first row is why they are not independent models.
Do not compare this model's 11.51% against the SAPC1 model's published 10.32%. Those are different test sets. Score both on the same manifest.
Usage
import torch
from transformers import AutoModelForCTC, AutoProcessor
model_id = "dys-asr/parakeet-ctc-0.6b-sapc2"
processor = AutoProcessor.from_pretrained(model_id)
model = AutoModelForCTC.from_pretrained(model_id).eval()
# audio: 16 kHz mono float32
inputs = processor(audio, sampling_rate=16_000, return_tensors="pt")
with torch.inference_mode():
logits = model(**inputs).logits
print(processor.batch_decode(logits.argmax(dim=-1)))
Greedy CTC decoding, no language model.
Limitations
- Numerals are written as words, not digits. See the convention above.
- No punctuation or casing. Output is upper-case and unpunctuated.
- Accuracy is very uneven across speakers, from 1.2% to 71.5% WER, and tracks aetiology and severity: Down Syndrome and Cerebral Palsy speakers average roughly three times the error of Parkinson's speakers.
- Not trained to convergence. Dev WER was still improving at epoch 10.
- Hyperparameters were inherited, not re-tuned for this corpus, which is 1.5x the size of the one they were selected on after the 30 s cap.
- The gain over the first release mixes two changes, corrected labels and the 30 s cap, which have not been separated.
- English only, 16 kHz mono.
- Single training seed. No variance estimate on the reported figures.
- Downloads last month
- 86
Model tree for dys-asr/parakeet-ctc-0.6b-sapc2
Base model
nvidia/parakeet-ctc-0.6bEvaluation results
- WER on SAPC2 dev (Speech Accessibility Project)self-reported11.510
- CER on SAPC2 dev (Speech Accessibility Project)self-reported6.850