Author: Claude (Anthropic), for Swaroop G N ·
Date: June 10, 2026 Code & data:
~/work/lyrics_transcription (scripts, transcripts, and
per-song scores included)
We benchmark ten local lyrics-transcription pipelines on 12
Creative-Commons songs in four languages (English, French, German,
Spanish) drawn from the JamendoLyrics MultiLang dataset, entirely on a
consumer Mac (Apple M5, MLX framework). The pipelines combine two
preprocessing strategies (none; Demucs htdemucs vocal separation) with
three Whisper models (large-v2, large-v3, large-v3-turbo) and
decode-setting ablations, plus a separation-as-VAD segmentation pipeline
from recent literature. The best configuration —
Demucs-separated vocals → Whisper large-v3 with
condition_on_previous_text=False and an explicit language
hint — achieves 22.1% WER (10.1% CER), in line with published
state-of-the-art open-source results on comparable material. We find
that (1) vocal separation reliably helps large-v3 (−2.2 WER points on
average, −15 to −54 points on hallucination-prone songs); (2)
condition_on_previous_text=True is catastrophic for music
(+28 WER points); (3) the popular large-v3-turbo is a strong
speed/accuracy tradeoff (22.8% WER at 2.4× the speed); and (4) contrary
to some published results on older benchmarks, large-v2 is clearly worse
than large-v3 in this setting (+8 to +10 points). We provide a concrete
recommended setup and discuss failure modes. In a follow-up hillclimbing
round we test two literature-recommended levers: swapping the ASR to
Qwen3-ASR-1.7B fails to transfer to this multilingual material
(27.4% WER, worse than Whisper large-v3 on 11 of 12 songs despite its
published 14.6% English-songs result), while LLM line-by-line
reconciliation of the top three Whisper configs reaches 15.9% WER / 6.4%
CER — improving every song, beating a 13-config oracle (19.1%)
by 3.2 points, and matching the best published commercial system on
comparable material.
Transcribing lyrics from produced music is much harder than transcribing speech: background instruments are spectrally correlated with the voice, sung phonemes are stretched by melody (melisma) and vibrato, pronunciation is stylized, and production effects (reverb, doubling, harmonies) smear the signal. Speech models that achieve single-digit WER on clean audio degrade to 25–45% WER on full mixes (Jam-ALT benchmark, arXiv 2311.13987). Whisper in particular exhibits music-specific failure modes: repetition loops and hallucinated text during instrumental passages — in our experiments, including invented GPS-navigation directions (“We are turning right to Park Road”) inserted into a pop song’s instrumental outro.
This paper asks a practical question: what is the best lyrics-transcription setup that runs locally on a Mac today? We survey the literature (Section 2), then empirically compare ten pipelines on multilingual CC-licensed music (Sections 3–4).
A full research brief with citations accompanies this paper
(results/research_brief.md). Key prior findings that shaped
our experiment design:
condition_on_previous_text=False is the consensus
anti-repetition-loop setting; explicit language hints help; LyricWhiz
(arXiv 2306.17103) adds multi-run + LLM ensembling.Data. 12 songs from JamendoLyrics MultiLang (arXiv 2306.17103’s evaluation set lineage; github.com/f90/jamendolyrics): 3 each in English, French, German, Spanish, spanning pop, rock, indie, reggae, country, hip-hop, and Christmas pop. Reference lyrics ship with the dataset.
Hardware/runtime. Apple M5 MacBook, mlx-whisper (Metal GPU) for ASR, Demucs v4 (htdemucs, MPS) for separation. Separation cost ~21 s/song.
Pipelines. All Whisper runs use the default
temperature fallback ladder and, unless noted,
condition_on_previous_text=False and the song’s true
language as a hint.
| ID | Input | Model | Notes |
|---|---|---|---|
| large3_mix | full mix | large-v3 | baseline |
| large3_vocals | Demucs vocals | large-v3 | |
| turbo_mix / turbo_vocals | mix / vocals | large-v3-turbo | speed-oriented |
| large2_mix / large2_vocals | mix / vocals | large-v2 | literature favorite |
| large2_vadmix / large3_vadmix | mix, segmented | v2 / v3 | RMS-VAD on vocal stem → cut mix into sung windows (arXiv 2506.15514 recipe) |
| large3_vocals_cond | Demucs vocals | large-v3 | ablation: condition_on_previous_text=True |
| large3_vocals_nolang | Demucs vocals | large-v3 | ablation: language auto-detect |
| qwen_mix / qwen_vocals | mix / vocals | Qwen3-ASR-1.7B | round 2: open-weights song-trained ASR (mlx) |
| qwen_vocals_ctx | Demucs vocals | Qwen3-ASR-1.7B | round 2: “song lyrics” context-prompt ablation |
| ensemble_llm | — | LLM merge | round 2: Claude reconciles large3_vocals + turbo_vocals + large3_mix line-by-line, no reference access |
Metric. Word error rate (WER) and character error
rate (CER) via jiwer, after normalization: lowercase,
Unicode NFC, punctuation stripped, apostrophes unified, whitespace
collapsed. Note: these scores are computed against the original
JamendoLyrics references with our own normalization, so they are
indicative rather than directly comparable to Jam-ALT-published numbers
(the Jam-ALT revision changed ~11% of reference tokens).
| Rank | Config | WER | CER | s/song |
|---|---|---|---|---|
| — | ensemble_llm (round 2) | 0.159 | 0.064 | 36 + LLM merge |
| 1 | vocals → large-v3 (best single pass) | 0.221 | 0.101 | 36 |
| 2 | vocals → turbo | 0.228 | 0.102 | 40* |
| 3 | mix → large-v3 | 0.243 | 0.125 | 53* |
| 4 | VAD-mix → large-v3 | 0.255 | 0.173 | 20 |
| 5 | vocals → large-v3, auto-lang | 0.264 | 0.136 | 20 |
| 6 | mix → turbo | 0.271 | 0.181 | 15 |
| 7 | vocals → Qwen3-ASR-1.7B (round 2) | 0.274 | 0.133 | 228 |
| 8 | vocals → Qwen3-ASR + “song lyrics” context (round 2) | 0.293 | 0.151 | — |
| 9 | mix → Qwen3-ASR-1.7B (round 2) | 0.300 | 0.155 | — |
| 10 | vocals → large-v2 | 0.324 | 0.177 | 34 |
| 11 | mix → large-v2 | 0.326 | 0.200 | 29 |
| 12 | VAD-mix → large-v2 | 0.341 | 0.345 | 65* |
| 13 | vocals → large-v3, conditioning ON | 0.502 | 0.391 | 75* |
* timings marked with an asterisk were measured while other transcription processes shared the GPU and overstate cost; unloaded turbo runs at ~15 s/song, large-v3 at ~20–36 s/song. Add ~21 s/song for Demucs where applicable.
| Config | English | French | German | Spanish |
|---|---|---|---|---|
| ensemble_llm (round 2) | 0.168 | 0.217 | 0.083 | 0.166 |
| vocals → large-v3 | 0.226 | 0.252 | 0.152 | 0.255 |
| vocals → Qwen3-ASR (round 2) | 0.234 | 0.314 | 0.233 | 0.316 |
| vocals → turbo | 0.260 | 0.279 | 0.140 | 0.233 |
| mix → large-v3 | 0.320 | 0.260 | 0.155 | 0.236 |
| mix → large-v2 | 0.416 | 0.270 | 0.197 | 0.423 |
German is consistently easiest in this sample (clear rock/pop vocals); English and Spanish are hardest, driven by individual hard songs rather than the language itself.
F1 — Vocal separation helps large-v3, decisively on hard
songs. Mean WER drops from 24.3% (mix) to 22.1% (vocals). The
mean understates the effect: on the two hallucination-prone songs,
separation cut WER from 92%→44% (large-v2 numbers: a pop song whose
instrumental outro induced fabricated navigation directions) and 72%→19%
(Spanish reggae). Separation’s main value is not cleaner phonetics but
hallucination suppression — removing the instrumental bed
removes the trigger. This nuances the Jam-ALT authors’ negative finding:
with htdemucs-class separation and
condition_on_previous_text=False, separation was never
materially harmful in our runs.
F2 — condition_on_previous_text=True is
catastrophic on music. 50.2% vs 22.1% WER (+28 points), with
degenerate repetition loops on 4 of 12 songs. This single flag matters
more than model choice, separation, or anything else we tested. It is
the first thing to check in any Whisper-based lyrics system.
F3 — large-v3 beats large-v2 for lyrics in our setting (24.3 vs 32.6 mix; 22.1 vs 32.4 vocals), the opposite of the published Jam-ALT ordering (27.9 v2 vs 32.6 v3). Possible reconciliation: those numbers predate decode-setting tuning (the Jam-ALT paper used default conditioning), and v3’s known fragility is exactly conditioning-induced looping — which our settings disable. Lesson: with tuned decoding, prefer large-v3; don’t import model rankings measured under different decode settings.
F4 — turbo is the value pick. 22.8% WER on vocals (0.7 points behind large-v3) at ~2.4× the speed of large-v3 — despite literature warnings about turbo on music. For bulk processing, vocals → turbo is the sweet spot.
F5 — Language hint is cheap insurance. Auto-detect matched the hinted config on 11/12 songs but misdetected one Spanish reggae track as English (82% WER on that song), costing +4.3 mean WER points. If the language is known (e.g., user-supplied at upload), always pass it.
F6 — Our simple RMS-VAD pipeline underperformed its billing (25.5% vs the literature’s expectation of beating plain transcription). The published recipe includes careful gap-merging, padding, and window-concatenation choices our minimal reimplementation lacks; segment-boundary word truncation likely added errors (its CER, 17.3%, is notably worse relative to its WER). We consider this a floor on the approach, not a refutation.
F7 (round 2) — LLM reconciliation is the single biggest lever we measured: −6.2 points, improving all 12 songs. We had Claude merge the three best Whisper transcripts (vocals/large-v3, vocals/turbo, mix/large-v3) line by line — choosing the most phonetically and lyrically plausible variant, normalizing repeated choruses, and deleting hallucination-shaped text — with no access to reference lyrics. Result: 15.9% WER / 6.4% CER, vs 22.1% for the best single pass and 19.1% for an oracle picking the best whole transcript per song. The merge beats the oracle because it fuses within songs: chorus normalization exploits lyrics’ repetition structure, and cross-candidate disagreement is itself a reliable hallucination detector. Largest gains: Spanish reggae 28%→12%, German rock 14%→2%. This validates the LyricWhiz pattern with a modern LLM at roughly double the published effect size.
F8 (round 2) — Qwen3-ASR-1.7B’s published song numbers do not transfer to this material. Despite a reported 14.6% English full-song WER (internal eval) that motivated this experiment, Qwen3-ASR-1.7B on Demucs vocals scored 27.4% — worse than Whisper large-v3 on 11 of 12 songs, with the largest deficits on French (31.4% vs 25.2%) and German (23.3% vs 15.2%) — and 6× slower (228 s/song vs 36 via MLX). A “song lyrics” context prompt made it slightly worse (29.3%). It also added nothing to the ensemble oracle. Plausible explanation: its singing training distribution (Chinese/English commercial pop) doesn’t cover European-language indie production. Lesson: vendor-reported numbers on internal song evals are weak evidence for your material — benchmark before switching.
Even the best pipeline shows characteristic sung-speech errors: “lay awake” → “They awake”, “stayed committed like a soldier” → “sink a minute like a soldier” (melisma), systematic deletion of backing vocals and ad-libs, and occasional merged/split lines. These match the failure modes documented across the ALT literature and are the residual gap to commercial systems (~16% WER) and clean-stem performance (~14%).
How far is 22.1% WER from the best possible today? Published reference points (full survey in the headroom report accompanying this paper): the best open-source no-training pipeline reaches 20.35% on the full Jam-ALT benchmark (Whisper large-v2 + separation-based RMS-VAD, arXiv 2506.15514); the best commercial system, AudioShake v3, reports 16.1%; and the strongest 2026 audio models — Qwen3-ASR-1.7B (open weights, trained on speech and song) and Gemini 2.5 Pro — report 14.6% and 12.2% English full-song WER respectively on internal evals (arXiv 2601.21337). The Whisper-class floor on clean vocal stems is ~15% (MUSDB-ALT), and roughly 3–4 points of error from backing-vocal and non-lexical deletions are shared by all current systems.
Three observations from our own data locate the headroom precisely:
The ranked levers, with expected gains from 22.1%: (1) swapping the ASR to Qwen3-ASR-1.7B, predicted 4–8 points; (2) the full RMS-VAD segmentation recipe, 2–3 points; (3) multi-run + LLM line-by-line reconciliation, predicted 2–4 points; (4) an audio-LLM ensemble member (Gemini Pro / Music Flamingo), 2–6 points standalone; (5) dual-pass mix+vocals reconciliation, 1–2 points; (6) singing fine-tuning, ~3 points at high effort; (7) a RoFormer-class separator, 0–2 points.
We then tested the top two levers empirically (round 2, Section 4.3 F7–F8). The predictions inverted: lever 1 (Qwen3-ASR) failed on this material (27.4%, worse than baseline), while lever 3 (LLM reconciliation) over-delivered at −6.2 points, reaching 15.9% WER — already inside the 10–14% “best possible today” band’s neighborhood and matching the best published commercial system (AudioShake v3, 16.1% on Jam-ALT) on comparable material. The remaining unexploited levers from 15.9%: an audio-LLM ensemble member, proper RMS-VAD segmentation, a RoFormer-class separator, and re-scoring against Jam-ALT references (~2–3 apparent points of our residual error is reference noise).
For a local song-upload → lyrics service on Apple Silicon:
htdemucs
two-stem (~21 s/song). A BS-RoFormer-class separator (e.g., via
python-audio-separator) is the most promising upgrade —
literature suggests separator quality is the binding constraint.mlx-community/whisper-large-v3-mlx — 22.1% WER, ~36
s/song.mlx-community/whisper-large-v3-turbo — 22.8% WER, ~15
s/song.condition_on_previous_text=False; pass
language= whenever known; keep the default
temperature-fallback ladder.Expected quality: ~20–25% WER on typical produced songs; near-perfect on clear solo-vocal passages; worst on dense mixes, stacked choruses, and non-lexical vocables. Budget human review for display-quality lyrics.
12 songs per config (statistical noise on per-language splits is
large); original JamendoLyrics references and hand-rolled normalization
rather than the Jam-ALT revision + alt-eval package; single
run per config; no commercial-API or LLM-audio baselines; our RMS-VAD
reimplementation is minimal. WER also under-credits useful formatting
(line breaks, case, punctuation) that production lyrics need.
Anchor citations; full linked bibliography in
results/research_brief.md.