Where Words Begin and End
Organizations: Scicom (MSC) Berhad, Malaysia
Abstract
Forced aligners locate each word of a known transcript in the audio, and many speech pipelines depend on them. In our own data, a widely used CTC aligner inserts a pause at nearly every word boundary, and we found almost no aligner evaluated on telephone audio. We compare nine aligner configurations against human word boundaries on read, conversational and telephone English. The Montreal Forced Aligner (MFA) is the most precise, while CTC aligners consistently start words late, because most frames inside a word go to the blank token. We then fine-tune Whisper with LoRA to predict each word's start and end as timestamp tokens, training only on boundaries placed by people: 47 hours in 87 languages. The resulting aligner is more precise than MFA on every English test condition, and than MFA's own Korean and Dutch models. With FA-Bench's protocol and code on TIMIT, its word-boundary error is 11.6 ms, against 18.2 ms for the best published system. Two choices matter most on telephone conversations: placing the timestamp slots after the word they time, and training on noisy transcripts, which also makes the aligner nearly insensitive to errors in the transcript. The released model reaches 16.0 ms on real landline calls, against 36.5 ms for MFA. The models are available at https://huggingface.co/collections/Scicom-intl/force-alignment
Figures & tables
| aligner | family | grid, ms | lang. | ms | id | en | zh | yue | ta | lexicon |
|---|---|---|---|---|---|---|---|---|---|---|
| Qwen3-ForcedAligner-0.6B | NAR LLM | 80 | 11 | no | ||||||
| FunASR fa-zh | NAR LLM | – | 1 | no | ||||||
| torchaudio MMS_FA | CTC | 20 | 1,130 | no | ||||||
| ctc-forced-aligner | CTC | 20 | 1,130 | no | ||||||
| MMS-1B-all | CTC | 20 | 1,162 | no | ||||||
| Omnilingual ASR CTC | CTC | 20 | 1,600 | no |
| set | languages | speech | channel | boundaries | size | access |
| TIMIT | en | read | wideband | corrected | 5.4 h | LDC93S1 |
| Buckeye | en | conversation | wideband | corrected | 38.1 h | registration |
| AlignBench | en | in the wild | wideband | manual, 3x | 0.83 h | not released |
| NTIMIT | en | read | landline | TIMIT’s | 5 h | LDC93S2 |
| STC-TIMIT | en | read | phone line | TIMIT’s | 6,300 utt. | LDC2008S03 |
| CTIMIT | en | read | cellular | TIMIT’s | 3,367 utt. | LDC96S30 |
| condition | kbit/s | tool | delay, ms | residual, ms |
|---|---|---|---|---|
| band-limited only | 128 | – | 0.000 | 0.0 |
| G.711 -law | 64 | ffmpeg | 0.000 | 0.0 |
| G.726 ADPCM | 32 | ffmpeg | 0.000 | 0.0 |
| GSM 06.10 full rate | 13 | sox | 0.000 | 0.0 |
| Opus (SILK, VoIP mode) | 12 | ffmpeg | 0.125 | 0.0 |
| MP3 (LAME) | 16 | ffmpeg | 138.125 | 0.0 |
| within, % | bias, ms | |||||||
|---|---|---|---|---|---|---|---|---|
| aligner | MAE, ms | 20 ms | 50 ms | 100 ms | start | end | fail | RTF |
| MFA, arpa | 19.1 | 68.2 | 91.9 | 98.3 | 0 | 0.021 | ||
| MFA, mfa | 21.3 | 64.5 | 90.2 | 97.9 | 0 | 0.011 | ||
| MMS, CFA edges | 29.2 | 45.5 | 85.9 | 97.1 | 0 | 0.007 | ||
| Qwen3-FA | 30.1 | 41.0 | 84.6 | 97.5 | 0 | 0.028 | ||
| MMS, STT-API | 35.6 | 35.4 | 76.4 | 96.2 | 0 | 0.044 | ||
| aligner | clean | 8 kHz | G.711 | G.726 | GSM | Opus | MP3 |
|---|---|---|---|---|---|---|---|
| MFA, arpa | 19.1 | 25.3 | 25.3 | 26.8 | 25.8 | 25.5 | 25.4 |
| MFA, mfa | 21.3 | 28.1 | 27.9 | 37.2 | 29.5 | 29.2 | 27.3 |
| MMS, CFA edges | 29.2 | 29.8 | 29.8 | 29.8 | 30.9 | 30.2 | 30.4 |
| Qwen3-FA | 30.1 | 52.7 | 50.1 | 54.4 | 52.6 | 52.3 | 64.8 |
| MMS, STT-API | 35.6 | 36.5 | 36.4 | 36.6 | 37.2 | 37.1 | 36.9 |
| MMS, torchaudio | 37.5 | 37.9 | 37.9 | 37.9 | 38.2 | 38.1 | 38.1 |
| aligner | TIMIT | +G.711 | Buckeye | +G.711 | SWB | SWB, 20 ms |
|---|---|---|---|---|---|---|
| MFA, arpa | 19.1 | 25.3 | 21.0 | 26.6 | 36.5 | 64.2 |
| MFA, mfa | 21.3 | 27.9 | 24.4 | 29.4 | 40.5 | 60.6 |
| MMS, CFA edges | 29.2 | 29.8 | 37.0 | 44.0 | 56.4 | 39.7 |
| Qwen3-FA | 30.1 | 50.1 | 30.9 | 42.2 | 42.3 | 36.9 |
| MMS, STT-API | 35.6 | 36.4 | 40.3 | 42.4 | 46.9 | 35.9 |
| MMS, torchaudio | 37.5 | 37.9 | 41.4 | 43.9 | 47.8 | 33.8 |
| corpus | speech | channel | edges | grid | lang. | train h | words | test h | unseen h | licence |
|---|---|---|---|---|---|---|---|---|---|---|
| TIMIT, train | read | clean | corrected | 4% | 1 | 2.8 | 28,578 | – | – | LDC |
| Buckeye, s05–s20 | conversation | clean | corrected | 6% | 1 | 8.7 | 119,438 | 1.4 | – | NC |
| Switchboard, WS97 | conversation | phone | manual | 18% | 1 | 2.1 | 26,231 | – | – | LDC |
| Seoul Corpus | interviews | clean | corrected | 0% | 1 | 27.1 | 197,712 | 3.1 | – | CC BY-NC |
| IFA | read, stories | clean | corrected | 0% | 1 | 5.2 | 44,616 | 0.5 | – | GPL-3.0 |
| VoxAngeles | single words | field | corrected | 24% | 95 | 0.9 | 3,858 | 0.1 | 0.1 | CC BY-NC |
| axis | values | question | stage |
|---|---|---|---|
| head | CTC over characters with Viterbi, plus a frame target from human word edges; Whisper-Scicom’s decoder predicting word start and end timestamps; MMS-300M with CTC | which head places boundaries best from the same encoder? | 2 |
| fine-tuning | LoRA; full fine-tune | is LoRA enough? | 2 |
| adapter rank | LoRA of 8, 16, 32, 64, 128 with | how much capacity does timing need? | 3 |
| adapter modules | attention projections; attention and MLP | does the MLP matter for timing? | 3 |
| adapter placement | decoder only; encoder and decoder | does the encoder have to move? | 3 |
| adapter scale | of 2; 0.2 | does the ratio that protects transcription help? | 3 |
| CTC, MMS-300M | CTC, Whisper-Scicom | timestamps | |||||
|---|---|---|---|---|---|---|---|
| set | MFA bar | LoRA | full | LoRA | full | LoRA | full |
| TIMIT | 19.1/68.2 | 17.2/74.0 | 16.9/74.0 | 16.4/76.0 | 16.2/76.5 | 10.5 / 89.1 | 10.7/88.7 |
| TIMIT, six codecs | 25.7/62.7 | 17.2/73.6 | 16.9/74.2 | 16.4/75.8 | 16.4/75.7 | 11.1 / 88.0 | 11.4/87.4 |
| Buckeye s01–s04 | 21.5/70.7 | 15.7/77.9 | 15.4/77.6 | 14.0/80.6 | 13.9/80.5 | 12.1 / 85.8 | 12.4/85.5 |
| Buckeye, three codecs | 26.6/64.5 | 16.2/76.0 | 15.9/77.1 | 14.7/78.9 | 14.6/79.5 | 13.0 / 84.6 | 13.3/84.5 |
| Switchboard (telephone) | 36.5/64.2 | 22.6/74.7 | 21.8 /75.2 | 22.3/78.0 | 22.4/78.0 | 23.0/ 80.7 | 22.7/80.5 |
| aligner | word times from | seeds | our harness | FA-Bench |
| Whisper’s own word timestamps | cross-attention + DTW | 41.2 / 41.5 | 96.8 / 0.18 | |
| MFA 3.4 | HMM-GMM, English ARPA | 19.1 / 68.2 | 21.8 / 0.64 | |
| MAPS | frame classifier | – | 25.5 / 0.71 | |
| Olign (commercial API) | not published | – | 18.2 / 0.78 | |
| ours, CTC on MMS-300M | LoRA, CTC forced path | 17.2 / 74.0 | 19.2 / 0.76 | |
| ours, CTC on Whisper-Scicom | the same | 16.4 / 76.0 | 18.2 / 0.79 |
| set | MFA bar | untrained | English only | multilingual |
|---|---|---|---|---|
| TIMIT | 19.1/68.2 | 41.2/41.5 | 10.8/89.0 | 10.5 / 89.1 |
| TIMIT, G.711 | 25.3/63.1 | 41.6/40.9 | 11.1/88.3 | 10.8 / 88.4 |
| Buckeye s01–s04 | 21.5/70.7 | 36.8/40.1 | 12.1/85.2 | 12.1 / 85.8 |
| Switchboard (telephone) | 36.5/64.2 | 54.6/39.4 | 27.1/78.5 | 23.0 / 80.7 |
| TIMIT, 20–28 s windows | 19.5/68.1 | 50.4/39.2 | 10.4/89.2 | 10.3 / 89.5 |
| Seoul (ko) | 21.3/70.2 | 87.2/37.8 | 24.2/79.1 | 11.3 / 90.0 |
| MAE, ms | mean | |||||||||||
| run | trainable | TIMIT | codecs | Buckeye | SWB | 20–28 s | Seoul | IFA | VoxAng. | MAE | 20 ms | |
| default (seed 0) | 58 | 10.5 | 11.1 | 12.1 | 23.0 | 10.3 | 11.3 | 15.3 | 15.9 | 14.06 | 84.82 | |
| seed 1 | 58 | 10.5 | 11.2 | 12.1 | 23.6 | 10.5 | 11.5 | 15.3 | 15.5 | 14.15 | 84.91 | |
| seed 2 | 58 | 10.5 | 11.2 | 12.2 | 23.2 | 10.2 | 11.5 | 14.9 | 15.3 | 13.97 | 85.07 | |
| seed 3 | 58 | 10.4 | 11.1 | 11.9 | 23.1 | 10.2 | 11.4 | 14.9 | 14.8 | 13.82 | 84.97 | |
| seed 4 | 58 | 10.6 | 11.3 | 12.0 | 23.1 | 10.2 | 11.5 | 15.5 | 15.1 | 14.00 | 84.80 | |
| decoding | MAE | median | 10 ms | 20 ms | TIMIT | Switchboard |
|---|---|---|---|---|---|---|
| arg-max bin (the 20 ms grid) | 15.5 | 8.4 | 58.4 | 82.5 | 12.2/87.4 | 24.1/77.9 |
| expectation within 1 bin | 14.1 | 6.3 | 66.7 | 84.7 | 10.6/89.0 | 23.0/80.6 |
| expectation within 2 bins (default) | 14.1 | 6.5 | 66.1 | 84.8 | 10.5/89.1 | 23.0/80.7 |
| expectation within 5 bins | 14.1 | 6.8 | 64.2 | 83.7 | 10.6/88.0 | 23.2/79.1 |
| expectation over all bins | 17.0 | 9.5 | 52.6 | 76.1 | 15.8/74.7 | 25.6/72.7 |
| tokens | setting | seeds | mean | median | 10 ms | 20 ms |
|---|---|---|---|---|---|---|
| 20 ms | best recipe (baseline) | 2 | 12.68 | 6.51 | 65.9 | 85.2 |
| 10 ms | best recipe, 1,500 new tokens | 1 | 12.74 | 6.41 | 66.1 | 84.6 |
| 20 ms | Whisper’s tokens | 5 | 13.02 | 6.56 | 65.8 | 85.0 |
| 10 ms | 1,500 new tokens | 5 | 12.99 | 6.47 | 66.0 | 84.8 |
| 5 ms | 4,500 new tokens | 1 | 13.14 | 6.47 | 65.6 | 84.4 |
| 10 ms | new tokens initialised at random | 1 | 13.03 | 6.33 | 66.5 | 84.9 |
| decoder input | seeds | mean | TIMIT | Buckeye | SWB | Seoul | IFA | VoxAng. |
|---|---|---|---|---|---|---|---|---|
| slots around the word (Whisper’s order) | 5 | 14.00/84.9 | 10.7/10.3 | 13.1/11.0 | 29.5/16.9 | 12.6/10.3 | 14.1/16.3 | 9.3/21.4 |
| slots after the word | 5 | 13.02/85.0 | 10.8/10.3 | 11.5/11.1 | 20.3/16.5 | 10.8/10.0 | 13.7/16.0 | 9.4/21.3 |
| around the word, rounded targets | 2 | 14.26/84.5 | 11.2/10.6 | 13.1/11.2 | 29.7/17.4 | 12.8/10.6 | 14.4/16.3 | 9.4/21.5 |
| Whisper’s own layout | 2 | 19.12/83.2 | 12.9/10.7 | 27.4/24.0 | 36.8/26.0 | 24.3/21.2 | 14.6/16.7 | 9.5/20.7 |
| extra targets | seeds | TIMIT | Buckeye | SWB | Seoul | IFA | VoxAng. | mean |
|---|---|---|---|---|---|---|---|---|
| none (default) | 5 | 10.5/89.1 | 12.0/86.1 | 23.2/80.8 | 11.4/89.9 | 15.2/78.5 | 15.4/80.5 | 14.00/84.91 |
| word edges | 2 | 10.5/89.2 | 12.2/86.2 | 24.2/80.4 | 11.3/90.1 | 14.8/78.6 | 15.7/79.6 | 14.15/84.79 |
| word and phone edges | 2 | 10.5/89.4 | 12.1/86.0 | 23.4/80.6 | 11.3/90.2 | 15.0/78.6 | 15.5/80.2 | 14.01/84.96 |
| runs | clean | TIMIT, six codecs | TIMIT, unseen | Buckeye, three codecs | Buckeye, unseen | Switchboard | |
|---|---|---|---|---|---|---|---|
| 0 | 3 | 12.5/85.4 | 17.1/74.6 | 17.6/73.8 | 15.4/81.3 | 15.8/80.4 | 24.5/80.0 |
| 0.25 | 3 | 12.4 /85.6 | 11.2/87.8 | 12.3/86.3 | 13.0/84.8 | 13.3/84.1 | 23.3/80.5 |
| 0.5 (default) | 5 | 12.5/85.6 | 11.2/88.0 | 12.2/86.4 | 12.9 /84.9 | 13.2 /84.3 | 23.2/80.8 |
| 0.75 | 1 | 12.6/85.1 | 11.0 /88.1 | 12.1 /86.8 | 13.1/84.3 | 13.3/83.9 | 23.0 /80.7 |
| 1 | 1 | 13.0/84.8 | 11.1/88.2 | 12.1 /86.9 | 13.1/84.6 | 13.4/83.9 | 23.0 /80.5 |
| MFA (bar) | – | 25.7/62.7 | 25.4/63.1 | 26.6/64.5 | 26.0/64.9 | 36.5/64.2 |
| input | length (s) | speech share | SNR (dB) | floor (dBFS) | level (dBFS) | low edge (Hz) | high edge (Hz) | tilt (dB/oct) | above 4 kHz |
|---|---|---|---|---|---|---|---|---|---|
| real call legs | 29.9 | 38% | 50.9 | 81 | 26 | 94 | 3,281 | 10.7 | 0% |
| our windows, clean | 2.5 | 82% | 30.5 | 58 | 30 | 62 | 4,578 | 9.1 | 64% |
| six conditions | 2.5 | 77% | 31.5 | 63 | 33 | 250 | 3,312 | 9.1 | 3% |
| call-centre degrader | 2.5 | 78% | 33.2 | 50 | 19 | 156 | 3,000 | 10.4 | 8% |
| TIMIT test | Buckeye | |||||
|---|---|---|---|---|---|---|
| aligner | clean | codecs | degrader | clean | codecs | degrader |
| released, large-v3 | 10.6 / 89 | 11.8 / 86 | 13.4 / 83 | 11.2 / 86 | 12.5 / 85 | 13.5 / 82 |
| released, large-v3-turbo | 10.9 / 88 | 11.8 / 86 | 14.1 / 82 | 11.3 / 86 | 12.7 / 84 | 14.5 / 81 |
| slots after + transcript noise | 10.7 / 89 | 11.3 / 87 | 16.4 / 78 | 11.1 / 86 | 11.7 / 86 | 15.9 / 80 |
| slots after the word, six conditions | 10.5 / 89 | 11.2 / 88 | 16.3 / 78 | 11.3 / 86 | 12.0 / 86 | 15.9 / 80 |
| default, six conditions | 10.5 / 89 | 11.2 / 88 | 16.6 / 79 | 12.0 / 86 | 12.9 / 85 | 17.0 / 79 |
| checkpoint | seeds | TIMIT | codecs | Buckeye | SWB | Seoul | IFA | VoxAng. | mean | RTF |
|---|---|---|---|---|---|---|---|---|---|---|
| Whisper-Scicom | 5 | 10.5/89.1 | 11.2/88.0 | 12.0/86.1 | 23.2/80.8 | 11.4/89.9 | 15.2/78.5 | 15.4/80.5 | 14.00/84.91 | 0.0090 |
| Whisper large-v3 | 3 | 10.4/89.3 | 11.1/88.2 | 12.0/86.2 | 24.2/80.4 | 11.4/89.9 | 15.4/78.7 | 15.5/80.4 | 14.16/84.93 | 0.0094 |
| Whisper large-v3-turbo | 3 | 10.4/89.4 | 11.1/88.1 | 12.2/85.7 | 23.1/80.5 | 11.5/89.8 | 14.7/79.3 | 15.7/80.4 | 14.01/84.94 | 0.0079 |
| aligner | long stretches | 30 s windows | RTF |
|---|---|---|---|
| timestamps, LoRA, through the wrapper | 12.2 / 5.4 / 90.0 / 0.19 | 11.3 / 5.3 / 90.0 / 0.09 | 0.008 |
| seed 1 | 11.6 / 5.4 / 90.0 / 0.15 | 11.5 / 5.3 / 89.9 / 0.10 | 0.007 |
| seed 2 | 11.8 / 5.3 / 89.9 / 0.16 | 11.5 / 5.3 / 89.9 / 0.10 | 0.008 |
| CTC, Whisper-Scicom encoder, through the wrapper | 13.9 / 7.0 / 86.3 / 0.18 | 13.5 / 7.3 / 86.0 / 0.06 | 0.006 |
| CTC, MMS-300M fine-tuned, whole recording | 15.6 / 7.9 / 82.9 / 0.19 | 16.2 / 8.3 / 81.0 / 0.13 | 0.003 |
| MFA, korean_mfa | 19.0 / 10.7 / 71.2 / 0.11 | 21.3 / 10.9 / 70.2 / 0.21 | 0.013 |
| set | noise | timestamps | +10% in training | released, large-v3 | CTC | MFA |
|---|---|---|---|---|---|---|
| TIMIT | none | 10.4/89.2/0.01 | 10.6/88.9/0.00 | 10.6/89.0/0.00 | 16.3/76.1/0.00 | 19.1/68.2/0.00 |
| 10% substituted | 19.8/86.4/0.60 | 17.9/86.8/0.41 | 10.8/89.0/0.01 | 18.7/73.9/0.02 | 32.2/63.4/0.72 | |
| 10% deleted | 28.2/84.8/1.21 | 24.8/85.0/0.86 | 10.7/88.9/0.01 | 32.3/72.7/1.04 | 64.7/59.8/3.36 | |
| 10% inserted | 18.9/86.1/0.33 | 14.3/87.8/0.18 | 10.7/89.0/0.01 | 25.2/69.2/0.07 | 35.0/60.9/0.57 | |
| 20% mixed | 34.9/82.1/1.42 | 28.5/84.1/1.15 | 10.9/88.9/0.02 | 36.1/67.6/0.86 | 73.0/54.1/3.83 | |
| Seoul | none | 11.6/89.8/0.10 | 11.9/89.7/0.11 | 10.7/90.0/0.03 | 13.7/85.8/0.06 | 21.7/69.9/0.24 |
| checkpoint | augmentation | seeds | mean | TIMIT | codecs | unseen | Buckeye | SWB | Seoul | IFA | VoxAng. |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Whisper-Scicom, earlier | six conditions | 5 | 13.02 / 85.0 | 10.5 | 11.2 | 12.2 | 11.3 | 18.4 | 10.4 | 14.8 | 15.3 |
| Whisper-Scicom, newer | six conditions | 2 | 13.05 / 85.0 | 10.6 | 11.2 | 12.2 | 11.4 | 18.6 | 10.4 | 14.6 | 15.3 |
| large-v3 | six conditions | 2 | 12.88 / 85.2 | 10.4 | 11.0 | 12.1 | 11.3 | 18.3 | 10.4 | 14.6 | 15.0 |
| large-v3-turbo | six conditions | 2 | 12.99 / 84.9 | 10.4 | 11.0 | 12.0 | 11.5 | 17.7 | 10.5 | 14.8 | 15.5 |
| Whisper-Scicom, earlier | six conditions + noise | 2 | 12.68 / 85.2 | 10.7 | 11.3 | 12.6 | 11.1 | 16.4 | 10.4 | 14.6 | 15.2 |
| Whisper-Scicom, newer | call-centre degrader | 2 | 13.02 / 84.8 | 10.8 | 11.8 | 12.8 | 11.3 | 17.7 | 10.4 | 14.6 | 15.6 |
Appendix figures & tables1 asset
Supplementary material from the paper’s appendix.
Appendix
| within 20 ms (%) | MAE (ms) | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| language | code | clips | bound. | trained | Whisper | English | all | English | all | |
| Korean (Seoul Corpus) | kor | 1,294 | 44,540 | yes | yes | 79 | 90 | 24.2 | 11.3 | |
| Dutch (IFA) | nld | 333 | 5,028 | yes | yes | 72 | 78 | 22.1 | 15.5 | |
| Abkhazian | abk | 5 | 10 | yes | no | 100 | 100 | 0 | 8.3 | 6.1 |
| Achinese | ace | 8 | 16 | yes | no | 50 | 75 | 49.9 | 22.3 | |
| Adamawa Fulfulde | fub | 1 | 2 | yes | no | 0 | 0 | 0 | 35.4 | 37.2 |