Modeltiming · disfluency

The nyra forced aligner

20.6 ms
word-boundary error on conversational speech (Buckeye) · 19% below the best of ten baselines
2.7×
fewer catastrophic misalignments (>200 ms) than the best Montreal Forced Aligner model
140×
faster than real time on a single NVIDIA L40 GPU

Give it audio and a verbatim transcript, and the nyra forced aligner returns where every word, vocal sound and phoneme sits in time. It is built for speech as it is actually spoken, conversational, disfluent and recorded in noisy conditions, and purpose-built for the transcripts CrisperWhisper 2.0 produces.

Accurate word and phoneme timings are a fundamental technology in speech processing. Clinical speech analysis, speech corpus construction, subtitling, dubbing and speech editing all depend on them, and many training objectives are built on them. Anything that relies on timestamps gets better when the timestamps get better, and inherits their errors when they do not.

Existing aligners work well on clean, read-aloud speech. In real-world conditions their accuracy degrades, most of all on spontaneous speech with its stutters, fillers, laughter and other vocal sounds. The root of the problem is the transcript. An aligner has to account for every frame of audio using only the units the transcript gives it: the phones of the transcribed words, plus optional silence between them. If a filler or a laugh was left out of the transcript, the audio it occupied has no unit of its own, so the aligner must explain it as silence or as part of a neighbouring word. Both are wrong, and the boundaries around the event shift. If a repetition was collapsed (I I think written as I think), one token faces two spoken instances and the alignment is not even well-defined; timing only becomes well-defined when the transcript is verbatim, an argument we make in Turning emergent cross-attention into a precise aligner. Most aligners are nevertheless trained on non-verbatim transcripts, so their silence and phone models absorb the acoustics of every untranscribed event and become less reliable, and they carry no units for fillers or vocal sounds at inference. On top of that, their features were never made robust to noise.

The nyra forced aligner addresses all three. It is a GMM-HMM aligner in the Montreal Forced Aligner (MFA) tradition, in which we changed only what the model observes and what it is allowed to model. Trained on 159 hours of verbatim speech without any manual boundary labels, it sets a new state of the art on conversational and disfluent speech against ten existing aligners. It is “the when” of the measuring line of our research program.

Where aligners break

A laugh has to go somewhere

A forced aligner turns the transcript into a chain of phone states and finds the most likely path through the audio that visits them in order. Every frame of audio has to be explained by some state. If the transcript reads so that was fun but the speaker laughed after so and said uh before fun, the laugh and the filler still have to be assigned to something. The aligner could assign them to silence, but in practice we observe that it smears their acoustics into the neighbouring words, and the boundaries of those words end up hundreds of milliseconds off.

Two aligners, one laughanimation
audio · reference boundaries
0.0s0.5s1.0s1.5s2.0s2.5s3.0s
standard aligner · words only
sothatwasfun
nyra forced aligner · words + event units
so[laughter]thatwas[uh]fun

One spontaneous utterance: a laugh after the first word, a filler before the last. The reference boundaries are the outlines.

Noise breaks the same search in a different place. To see where, it helps to see how boundaries are actually extracted. Each 10 ms frame of audio is turned into a feature vector, MFCCs in MFA's case. Every phone state owns a Gaussian mixture model (GMM) fitted to the feature vectors of the frames it was trained on, and for a new frame each state's GMM returns a likelihood: how probable this frame's features are under this phone. Laying the transcript's states out as rows and the frames as columns gives a grid of these likelihoods. The aligner then searches for the most likely path through the grid that visits the states in order, moving only forward in time, and each step of the path from one state to the next is a boundary. Timestamps are never predicted directly; they fall out of the path.

Everything therefore rests on how decisively the GMMs assign likelihood to the right phone for each frame. That is a property of the features: a GMM can only be decisive if the frames of one phone form a tight cluster that does not overlap the clusters of other phones. Clean MFCCs form such clusters and MFA aligns read speech well. Under noise the MFCC clusters spread and overlap, the GMMs of several states assign similar likelihood to the same frame, the most likely path is no longer the correct one, and boundaries drift. MFA compounds this with its default search beam of 10: it prunes any path that falls more than the beam behind the momentary best, and under noise that is exactly what happens to the correct path. Widening the beam recovers part of the loss (see the results below). Features whose phone clusters stay tight under noise fix it at the source: the GMMs fitted on them keep assigning likelihood decisively, and the path stays put whatever the beam. That is what our front end is built for.

From features to boundariesschematic · live viterbi
frames (10 ms) · shade = likelihood of the frame under each state's GMMsilsoʊðætsilboundsevery boundary on the reference
reference path / boundariesmost likely path the aligner findscorrect path pruned by a narrow beam

Clean read speech: for each frame one phone's GMM assigns clearly the highest likelihood, the most likely path hugs the reference, and every boundary lands on it.

The recipe

Three changes to a classical aligner

We kept the Kaldi GMM-HMM architecture MFA uses: every unit is a three-state left-to-right HMM, trained monophone-first and then triphone, each stage supervised only by its own alignments. No external aligner, manual segmentation or boundary label is used as a training target at any stage. Once the WavLM features are extracted on a GPU, training takes hours on CPU. What changed is the features, the unit inventory and the data.

1. Self-supervised features instead of MFCCs

A frozen WavLM-Large encoder replaces the MFCC front end. WavLM is pretrained for robustness to acoustic corruption, and its layer-22 hidden states are the ones that correspond most closely to phonemes. We linearly interpolate them from their native 20 ms stride to the 10 ms grid the HMM works on and reduce them to 39 dimensions with PCA, matching MFA's MFCC dimensionality; the bottleneck is also necessary, since flat-start GMM training on the 1024-d features was unstable. After the monophone stage we return to the WavLM features, splice them over ±1 frame, and fit a 39-d linear discriminant (LDA) projection supervised by the monophone model's own per-frame state labels. The triphone model is trained in that space.

2. Explicit units for fillers and vocal sounds

Words are phonemized with espeak-ng onto a canonical inventory of 39 English phones. We extend that inventory with dedicated units for the fillers [UH] and [UM] and twelve non-lexical vocal events: laughter, breath, cough, sigh, and so on. Transcripts follow the verbatim conventions of CrisperWhisper 2.0, so each event appears inline as a bracketed tag, and each tag maps to a one-phone lexicon entry with its own acoustics and duration statistics. Where a standard aligner must ignore a laugh or smear it into the neighbouring words, ours assigns it a unit with matching acoustics. The aligner is built for exactly the transcripts CrisperWhisper 2.0 produces: give it that output and every filler and vocal sound in the audio has a unit to align to.

3. A projection that has already seen noise

WavLM already gives us fairly noise-robust features: swapping MFCCs for WavLM alone roughly halves the error at 0 dB SNR. The LDA projection is where that robustness is refined. LDA picks the directions in feature space along which the phone states are furthest apart relative to how much each state's own frames scatter: it maximises between-class over within-class variance. We fit it on the clean training features together with noise-corrupted copies of the same utterances (MUSAN music at 5–15 dB SNR), both carrying identical frame labels, since additive noise does not move a boundary. Because a clean frame and its noisy copy now belong to the same class, whatever the noise does to the features counts as within-class scatter, and any direction in which noise moves a frame is penalised. What survives are the directions in which phones differ but noise barely registers. In that space the frames of a phone form a tight cluster whether or not the audio is noisy, so the GMMs fitted there keep assigning likelihood decisively under noise. That is what holds the boundaries in place at 0 dB SNR, where the noise is as loud as the speech itself.

Verbatim training data

The event units are supervised only by tag occurrences in the training transcripts, so those transcripts have to be verbatim. We assembled 159 hours from eight sources, roughly half conversational, all transcribed verbatim with fillers and, where annotated, vocal sounds. To widen the event inventory we also insert clips from VocalSound and Nonspeech7k into detected pauses in clean LibriSpeech audio and add the tags at the same transcript positions.

Training corpora · 159.1 h · 98.1k utterances · verbatim throughout
sourcehoursuttscontents
ICSI meetings39.224.7kmulti-party meetings
NSC part 624.54.0kconversational, accented
LibriSpeech + events21.24.9kaudiobooks, event overlay
Common Voice 1420.111.5kcrowd-read prompts
AMI meetings19.927.3kmulti-party meetings
VCTK15.016.2kstudio-read, many speakers
DisfluencySpeech9.24.9kacted disfluent speech
Results

Accurate where speech is messy

We score word boundaries against manual annotations on three held-out sets: TIMIT (read), Buckeye (conversational) and FluencyBank Timestamped (speech from people who stutter). Per word, the error is the mean of its onset and offset error; we report the mean over words (MAE, lower is better). Event tokens are excluded from word metrics for every system, and ASR-based systems are scored only on correctly recognised words, so timing is judged independently of transcription errors.

20.6 ms
mean word-boundary error on conversational speech (Buckeye), 19% below the best existing aligner, MFA us_arpa at 25.3 ms.
Buckeye · conversational speech · word-boundary MAE · lower is betterBoundary error on conversational speech (Buckeye)
nyra forced alignerother aligners and ASR systems with timestamps
nyra forced aligner
20.6 ms
20.6 ms
MFA our_data
24.2 ms
24.2 ms
MFA us_arpa
25.3 ms
25.3 ms
MFA english_mfa
35.6 ms
35.6 ms
CrisperWhisper 2.0 · ASR
38.7 ms
38.7 ms
Qwen3-FA-0.6B
39.5 ms
39.5 ms
xAI Grok Speech-to-Text · ASR
45.5 ms
45.5 ms
MMS-FA
53.0 ms
53.0 ms
ElevenLabs Scribe v2 · ASR
57.8 ms
57.8 ms
Charsiu
70.3 ms
70.3 ms
NeMo FA
72.6 ms
72.6 ms
WhisperX
80.9 ms
80.9 ms
CTC-Segmentation
81.0 ms
81.0 ms
Deepgram Nova-3 · ASR
86.9 ms
86.9 ms
Cartesia Ink-Whisper · ASR
124.8 ms
124.8 ms
MFA rows use a widened search beam (400 / retry 4000); at its package defaults MFA us_arpa scores 48.0 ms here. ASR systems produce their own words and are scored on the words they got right. The four hosted ASR systems come from the model repository's benchmark table.

On read speech we are on par with the best classical configuration: MFA's us_arpamodel leads by 1.9 ms on TIMIT. The difference shows once the speech is no longer read. MFA rises to 25.3 ms on Buckeye and 122 ms on FluencyBank, 6.6× its read-speech error. Our error barely moves between read and conversational speech (20.5 vs. 20.6 ms) and rises far more gently on stuttered speech (76.9 ms, 17% below CrisperWhisper 2.0, the next best). Retraining MFA's unmodified recipe on our data (MFA our_data) helps on Buckeye but not on FluencyBank, so the data alone does not explain the full performance gap.

Word-boundary MAE in ms · lower is better · TIMIT, Buckeye and FluencyBank fully held out
systemBuckeye (conv.)TIMIT (read)FluencyBank
nyra forced aligner20.620.576.9
MFA our_data24.218.8136.7
MFA us_arpa25.318.6122.0
MFA english_mfa35.623.2162.9
CrisperWhisper 2.038.731.293.2
Qwen3-FA-0.6B39.530.0109.5
MMS-FA53.037.2158.8
Charsiu70.326.6198.3
NeMo FA72.660.0124.0
WhisperX80.977.0156.8
CTC-Segmentation81.049.3206.6

Fewer catastrophes, not just a better average

Averages hide the errors that break downstream use. For typical words the HMM systems are nearly indistinguishable; MFA is even marginally sharper at the median (13.2 vs. our 14.0 ms). The profiles separate in the tail. 99% of our words land within 97 ms of the reference versus 196 ms for MFA's best configuration; errors beyond 200 ms are 2.7× rarer (0.37% vs. 0.98%) and errors beyond one second 3× rarer. Averaged over each system's worst 5% of words, our error is 122 ms against MFA's 220.

Buckeye · conversational · share of words misaligned by more than t · lower is betterThe tail of the error distribution
nyra alignerMFA us_arpaQwen3-FACrisperWhisper 2.0NeMo FA
0.10.20.51%2%5%10%20%50%100%1020501002005001 s2 sper-word boundary error t
words off by more than 200 ms
  • nyra aligner0.37%
  • MFA us_arpa0.98%
  • Qwen3-FA1.2%
  • CrisperWhisper 2.01.1%
  • NeMo FA1.9%
2.6×rarer than MFA's best model at this threshold
Log–log complementary CDF of the per-word error δ (mean of onset and offset error), all aligners at converged wide-beam search, laughter tokens excluded. Hover or drag to move the threshold. The dotted line is 1%: ours is the only curve that crosses it before 100 ms.

Left of about 30 ms the two HMM systems overlap; from there our curve runs below every other at every severity. The other baselines fail in characteristic ways: NeMo is imprecise everywhere but rarely catastrophic, Qwen3-FA has an MFA-like mid-tail with 3× our rate beyond 200 ms, and CrisperWhisper 2.0's tail sits above ours at every threshold. The result is typical-word precision on par with the best classical system, with far fewer severe errors.

A note on MFA's search beam

MFA ships with a Viterbi beam of 10. On spontaneous speech that default silently prunes the optimal path: widening it to 400 improves us_arpa on Buckeye from 48.0 to 25.3 ms, and under noise most utterances fail to align at all at the default. All MFA numbers in this post therefore use the wide beam. Our aligner is essentially beam-independent (20.3 ms across a sweep from 5 to 2000): its emission likelihoods keep the correct path near the top at every frame, whereas overlapping MFCC densities let it fall behind on disfluent or noisy frames, where it gets pruned.

Around disfluencies

What the event units buy

The direct test of the unit inventory is the regular words next to a laugh, a filler or a word cutoff. Ours stays within 10 ms of its dataset-wide error next to fillers and cutoffs (26.3 and 28.7 ms) and reaches 52.8 ms next to laughter. Every MFA configuration inflates next to a filler, to 1.6–2.1× its own dataset-wide error, and lands at 120–230 ms next to laughter.

Buckeye · regular words adjacent to a laugh (n = 722) · MAE · lower is betterBoundary error next to laughter
nyra forced alignerother aligners
nyra forced aligner
52.8 ms
52.8 ms
CrisperWhisper 2.0 · ASR
82.3 ms
82.3 ms
NeMo FA
105.8 ms
105.8 ms
MFA our_data
120.4 ms
120.4 ms
WhisperX
137.9 ms
137.9 ms
MMS-FA
154.2 ms
154.2 ms
MFA us_arpa
173.8 ms
173.8 ms
Qwen3-FA-0.6B
180.4 ms
180.4 ms
CTC-Segmentation
227.6 ms
227.6 ms
MFA english_mfa
230.2 ms
230.2 ms
Charsiu
269.5 ms
269.5 ms
Only CrisperWhisper 2.0, the one other system that models vocal events, comes close.

The component ladder separates the causes. Fillers have a spelling, so with verbatim transcripts they can already be represented as words; dedicated filler units add a small gain (47.5 to 41.9 ms in the MFCC arm) and the front end contributes the rest. Laughter has no spelling. There the units halve the error in the WavLM arm (107.8 to 52.4 ms) and cut it 2.7× with MFCCs (215.6 to 79.7 ms).

Under noise

Boundaries that stay put at 0 dB SNR

We mix Buckeye with held-out MUSAN noise and with Gaussian noise at signal-to-noise ratios of 20, 10, 5 and 0 dB; at 0 dB SNR the added noise is as loud as the speech. Gaussian noise never appears in training (the noise-paired projection only saw MUSAN music), so it measures generalisation to an unseen noise family.

50 ms
boundary error at 0 dB SNR under MUSAN noise. MFA us_arpa: 281 ms. WhisperX: 468 ms. MFA english_mfa: 481 ms.
Buckeye · additive MUSAN noise · word-boundary MAE in ms vs. SNR · lower is betterBoundary error as the noise gets louder
nyra forced alignerours without noise-paired LDACrisperWhisper 2.0Qwen3-FAMFA us_arpa
Boundary error as the noise gets louder015030020 dB10 dB5 dB0 dB50 ms74 ms56 ms154 ms281 ms
MFA at the wide beam; at its defaults most utterances fail to align under heavy noise. CrisperWhisper 2.0 transcribes rather than aligns and is scored only on the words it recognises.

The ablation shows where the robustness comes from. Swapping MFCCs for WavLM roughly halves the error at 0 dB SNR (170 to 74 ms under MUSAN, 273 to 136 under Gaussian noise), and the noise-paired projection improves it again, to 50 and 96 ms. At 0 dB SNR with Gaussian noise, MFA english_mfa misplaces words by 2.0 s on average, us_arpa by 417 ms and WhisperX by 2.7 s; ours by 96 ms.

Get the model

Use it

The aligner takes audio and a verbatim transcript and returns word- and phoneme-level timings, with fillers and vocal events as segments of their own, and runs at roughly 140× real time on a single NVIDIA L40 GPU. It is designed to run on the verbatim transcripts CrisperWhisper 2.0 produces: transcribe with CrisperWhisper 2.0, align with the nyra forced aligner, and every laugh and uh in the audio has a segment to belong to.

Weights and code: model on Hugging Face · alignment pipeline on GitHub. Paper: Aligning What Was Actually Said: Noise-Robust Forced Alignment for Spontaneous Speech, coming soon.

English only for now. Multilingual verbatim transcription withCrisperWhisper 2.0 makes extending the recipe beyond English feasible, and that is the next step.