omote-ai/ctc-aligner
~2.4 MB conv-CTC forced-alignment student. Input mfcc [1,T,39]
(16 kHz Rust-parity MFCC: 13 cepstra + ฮ + ฮฮ) โ output logits [1,T,40]
(39 ARPABET phones + blank). Consumed by the Omote runtime's phoneme-timing
tier; staggered Viterbi decoding happens in the runtime.
Files: ctc_aligner.onnx uses ONNX external data โ ctc_aligner.onnx.data
is required alongside it, plus ctc_aligner.meta.json (phone table).
Distilled from facebook/wav2vec2-lv-60-espeak-cv-ft (Apache-2.0, offline
teacher โ never ships) via frame-level cross-entropy on a mixed
synthetic (Supertonic + Kokoro) + natural (LibriSpeech train-clean-100,
CC-BY 4.0) corpus.
Evaluation (held-out, vs teacher alignments)
| Metric | Value |
|---|---|
| Median phone-onset abs error (ms) | 7 |
| Mean / p90 onset error (ms) | 17 / 16 |
| Onsets within 20 ms | 94 % |
| Onsets within 50 ms | 99 % |
| Onsets within 100 ms | 99 % |
| Degenerate-span rate (>600 ms), raw | 1.8 % (177/9,650) |
| โ of which teacher-pause artifacts | 173 |
| โ real student errors | 4 (0.04 %) |
Evaluation-set provenance (read before comparing numbers): the original
held-out set from the training run was lost (data-custody RCA, 2026-07-22, in
the Omote repo). These figures come from a regenerated held-out set,
synthesized 2026-07-22: 150 committed evaluation sentences
(scripts/train-ctc-aligner/eval_texts_v2.txt in the source repo) rendered
through both TTS engines โ 300 utterances / 9,650 phone onsets, none of which
the student ever saw. They are therefore a genuine unseen-data measurement,
but they are not numerically comparable to development-time figures. The
real-degenerate rate (0.04 %) independently reproduces the rate recorded
during original development.
Full provenance: provenance.json in this repo.