FuseAlign: Forced Alignment in the Wild
Paper โข 2609.33650 โข Published
Word-level forced aligner: given a recording and its transcript, it predicts each word's start and end on a 1 ms grid plus a presence probability. A reproduction of FuseAlign (Vaidya et al., 2026) by Zyphra: the multilingual model (100,000 steps), fine-tuned 2,500 steps on CJK junction-corrected labels.
Code, usage, long-form alignment and the C++/ggml CLI: github.com/Zyphra/fusealign-multilingual.
| File | Size | Use |
|---|---|---|
fusealign-multilingual-cjkft-step2500.safetensors |
1.34 GB | PyTorch package (torch.hub, fusealign_hub): FuseAlign fp32, Dia text encoder bf16 |
fusealign-multilingual-cjkft-step2500-f32.gguf |
1.35 GB | ggml port: FuseAlign F32, Dia BF16, Silero VAD F32 |
fusealign-multilingual-cjkft-step2500-q8_0.gguf |
0.51 GB | ggml port: transformer matmuls Q8_0, other Dia tensors BF16, the rest F32 |
import soundfile as sf
import torch
aligner = torch.hub.load("Zyphra/fusealign-multilingual", "fusealign", trust_repo=True, device="cuda")
wav, sr = sf.read("speech.wav", dtype="float32")
words = aligner.align(torch.from_numpy(wav), sr, "the transcript of the recording")
# [WordAlignment(word='the', start=..., end=..., presence=..., placed=True), ...]
% of word boundaries off by more than 50 ms (the paper's asymmetric error):
| Corpus | % >50 |
|---|---|
| TIMIT | 16.55 |
| Buckeye | 24.58 |
| AMI-silver | 49.38 |
| TIMIT-long | 17.25 |
| BZNSYP Mandarin (gold) | 15.94 |
| FLEURS Mandarin | 17.95 |
| FLEURS Japanese | 14.02 |
| FLEURS Korean | 8.39 |
| FLEURS Spanish | 19.66 |
| FLEURS Portuguese | 9.30 |
| FLEURS French | 13.15 |
| FLEURS German | 13.29 |
| FLEURS Russian | 12.74 |
Apache-2.0. The checkpoint and GGUFs include the Dia text encoder weights from nari-labs/Dia-1.6B-0626 (Apache-2.0); the GGUFs include Silero VAD weights (MIT).
@article{vaidya2026fusealign,
title = {FuseAlign: Forced Alignment in the Wild},
author = {Vaidya, Mithilesh and Bailey, Stephen and Badam, Sumukh and Bendel, Matthew and He, Xingzhe},
journal = {arXiv preprint arXiv:2609.33650},
year = {2026}
}
8-bit
32-bit