--- license: apache-2.0 library_name: onnxruntime tags: [forced-alignment, ctc, phoneme, lipsync, omote] --- # 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.