SingAlign β released checkpoints
Weights for SingAlign, a unified forced-alignment toolkit for singing voice. The code lives in the GitHub repository; this repository holds only the checkpoints it downloads.
Files here are named exactly as configs/models/<name>.yaml declares them, so
the toolkit's resolver (modules/common/api/checkpoints.py) fetches them by
name and verifies the pinned SHA256 before it puts anything on disk.
| File | Family | Size | SHA256 |
|---|---|---|---|
hfa-mandarin-fullweak-v1.ckpt |
HubertFA | 54.2 MB | d38f7d5839e2cd93e8dec5b77b6bd3ed28aa1318d5ed069c2cd81c899dd3c057 |
hfa-mandarin-fullweak-v1
A HubertFA alignment head over a frozen chinese-hubert-base front-end,
trained in-repo with train_hfa.py. It is SingAlign's default model.
- Recipe:
configs/hfa/train_fullweak_v1.yaml, dataconfigs/hfa/binarize_fullweak.yaml. - Training data: 51.4 h full-label (GTSinger, M4Singer, Opencpop) + 7627 h weak-label Mandarin singing (lyrics only, no phoneme durations).
- Step 15000, selected by CBER on a held-out validation set β not the final step-60000 weights, whose validation curve had already degraded.
- Phoneme inventory: 117 phones,
sofa-expanded-v1profile (identity against the toolkit's canonical Mandarin inventory). - G2P: G2pW β no pronunciation dictionary to configure.
Results
Scored on cloudtest-verified-v1: 8 recently released original songs
(90 clips, 1971 phones, 535.6 s) with hand-verified word + ph tiers, none
of whose song IDs or "artist β title" pairs appear in any training manifest.
Every system was fed the same gold phoneme sequence with G2P and breath
detection off, so this measures acoustic alignment only.
| System | VER20 β | VER50 β | mIoU β | CBER β |
|---|---|---|---|---|
hfa-mandarin-fullweak-v1 |
0.2265 | 0.0571 | 0.8030 | 0.1737 |
| HubertFA v0.0.7 (upstream ONNX) | 0.2075 | 0.0786 | 0.7734 | 0.2223 |
| SOFA ConvNeXt (in-repo) | 0.2519 | 0.0835 | 0.7747 | 0.2159 |
SOFA pretrained_mandarin_singing |
0.2575 | 0.0946 | 0.7501 | 0.2901 |
| STARS (Chinese) | 0.3379 | 0.1674 | 0.6072 | 0.6547 |
VER20/VER50 are vlabeler edit ratios at 20 ms / 50 ms boundary tolerance and
include SP; mIoU and CBER exclude it. Point estimates, no confidence
intervals.
Read this as an error profile, not a ranking. This model leads on VER50, mIoU and CBER but trails upstream v0.0.7 by ~9% on VER20: it makes fewer large errors and more small ones. If your criterion is a 20 ms tolerance, the upstream model is the better pick.
Runtime dependency
The torch path does not carry its own SSL front-end. The checkpoint records
hubert_config.model_path, and those encoder weights
(TencentGameMate/chinese-hubert-base,
~380 MB) must be present. python scripts/download_assets.py in the toolkit
fetches this checkpoint, the encoder and the G2pW model together.
Usage
git clone https://github.com/pymaster17/SingAlign && cd SingAlign
uv sync --extra pitch && source .venv/bin/activate
python scripts/download_assets.py # this checkpoint + encoder + G2pW
python infer_one.py -a audio.wav -t "δΈζζθ―" --out_formats textgrid,json
from modules.api import HubertFATorchAligner
aligner = HubertFATorchAligner() # resolves to this checkpoint
results = aligner.align([{"id": "x", "audio_path": "a.wav", "text": "δΈζζθ―"}])
Caveats
confidencedoes not transfer across models. SOFA scores land in ~[0.79, 1] and HubertFA in ~[0.67, 0.95], and the score is a top-2 pairwise margin. Any threshold inherited from another model has to be re-calibrated.- Mandarin only. The inventory and the frozen encoder are both Chinese; there is no released multilingual checkpoint.
- The weak-label half of the training data is scraped Mandarin singing whose underlying recordings are third-party copyrighted works. The weights are released for non-commercial research (CC-BY-NC-4.0) for that reason; the toolkit's source code is MIT and licensed separately.