Stop paying thousands of dollars for one-off listening studies. Let everyday users blind-battle two music generators on prompts they actually care about — and turn those clicks into a Bradley-Terry leaderboard plus a renewable stream of human preference data.
You built a text-to-music model. It takes a sentence — "dreamy lo-fi beat with rain in the background" — and produces 30 seconds of audio. You want to claim it's better than last year's model. How do you prove that?
You can't just compute a number. Music is a human endeavor. Whether a clip is "good" depends on whether a person likes it — which mixes objective fidelity (no clicks, no warble) with deeply subjective taste (is this groove fire or is it cheesy?). There is no ground-truth waveform to compare against, the way image models can compare to a real photo.
The field had three tools before Music Arena, and each breaks in a specific way:
| Approach | How it works | Why it fails |
|---|---|---|
| Automatic metrics (Fréchet Audio Distance, CLAP score) | A formula compares generated audio to a reference distribution | Correlates imperfectly with what humans actually prefer — and can't capture creativity or taste |
| Crowdsourced listening study (MTurk MOS) | Pay annotators to rate clips 1–5 | Costs hundreds to thousands of dollars per study; not renewable — the numbers freeze the moment you stop paying |
| Ad hoc in-house study | Each paper runs its own listening test | Protocols differ — different interfaces, different models compared, different annotators — so win rates from two papers are not comparable |
Read that table as three separate wounds: metrics are cheap but wrong, crowdsourced studies are right but expensive and frozen, and ad hoc studies are incomparable across labs. Nobody had a method that was simultaneously human-grounded, cheap, comparable, and renewable.
Why is human preference data so expensive? Because in a paid study, the annotator's only reason to be there is the money. They have no stake in the music. They'll rush, satisfice, and leave the moment the task ends. You're buying attention you don't really have.
Now flip it. Imagine someone who genuinely wants to make music from a prompt. They'd happily generate, listen carefully, and tell you which result they like — for free — because they're getting something they want (a track) in return. The preference is a byproduct of a self-motivated activity. That's the loophole the whole paper exploits.
The fix borrows a recipe that already worked for chatbots (Chatbot Arena), text-to-speech, image generation, and code assistants. The paper calls it live evaluation, and it has one defining move:
The structure is always the same three steps:
Because every model is scored under the same protocol and the same annotator population, the scores are finally comparable across systems. Because the data flows from genuine usage, it's realistic. Because users keep coming, it's renewable. That single design hits all four wounds from Chapter 0 at once.
Music Arena's real contribution is recognizing that you can't just copy Chatbot Arena. Music has three properties that text doesn't, and each forces a music-specific design choice. We'll build all three in this lesson:
| Music is special because… | …so Music Arena adds | Chapter |
|---|---|---|
| Models have wildly different I/O — some want lyrics, some want a duration, some are instrumental-only | An LLM routing system on a single text box | 5 |
| Music is consumed in real time — you can't glance at it like an image | Listening data: timestamps + a minimum-listen gate before voting | 6 |
| Models trade quality for latency (creative tools want speed) | RTF (real-time factor) reported alongside the score | 8 |
Before any math, let's trace exactly what happens, end to end, when one user runs one battle. This is the data lifecycle of Figure 1 in the paper. The platform has three modular pieces that talk over plain HTTP: a Frontend (the web UI), a Backend (the orchestrator), and a set of Model Endpoints (the TTM systems, each in its own Docker container).
Each box is a stage in one battle. Click to inspect the data flowing through it — the prompt text, the structured route, the two audio blobs, and the final vote record.
Let's trace the actual battle from the paper's appendix — prompt "Celtic punk song with prominent vocals and lyrics about an evaluation platform called Music Arena":
prompt = "Celtic punk song…". One text box. The user does not specify lyrics, duration, or whether it's instrumental.{instrumental: false, lyrics: null, duration: null}. "Vocals" is implied by "song with prominent vocals," so only vocal-capable models are eligible.riffusion-fuzz-1-0 and acestep. The backend dispatches both at the same time, and crucially waits for both before showing anything.44.1 kHz, 2-channel, 192.5 s; B is 48 kHz, 2-channel, 30.0 s. The UI hides both the durations and the model names.preference: "A" with free-text feedback. Only now are the model identities and generation speeds revealed.We have a pile of pairwise votes: "A beat B," "C beat A," "B beat C"… How do we turn that into a single score per model that we can rank? We need a model of how a "win" is generated. The 1952 Bradley-Terry model is that model, and it's beautifully simple.
Naive idea: just use raw win rate. Model A won 70% of its battles → score 0.70. Why is that broken? Because it ignores who you played. Beating a strong model 60% of the time is far more impressive than beating a weak model 60% of the time. Win rate has no notion of opponent strength. We need a score where each model has a hidden "strength," and the probability of winning depends on the difference in strengths.
Every symbol, with a plain analogy:
Suppose βA = 1.0 and βB = 0.0. Then the gap is 1.0, and:
So a model one strength-unit above another should win ~73% of head-to-head battles. Now invert it: if we observe A winning 73% of the time, the maximum-likelihood strength gap is ln(0.731/0.269) = ln(2.72) = 1.0. That inversion — going from observed win rates back to strengths — is exactly what fitting Bradley-Terry does. We choose the β values that make the observed battles most probable.
The raw β are tiny numbers around 0. To make them readable (and to match chess intuition), they're rescaled into an Arena Score on an Elo-like scale, anchored around ~1000–1200:
The factor 400/ln(10) ≈ 173.7 is the classic Elo convention: a 400-point gap means the stronger model wins ~10× as often (a 90.9% win probability). In the paper's first leaderboard, riffusion-fuzz-1-1 scored 1250.8 on instrumental music while sao-small scored 782.4 — a 468-point gap, i.e. the top model wins the head-to-head the overwhelming majority of the time.
This is the heart of the whole platform, made interactive. Below are five fictional TTM models with hidden true strengths (which you set with the sliders). Press Run battles to draw random pairs, simulate votes using Bradley-Terry, and fit the Arena Score live. Watch the estimated scores climb toward the truth — and watch the 95% confidence intervals (the thin error bars) shrink as votes pile up.
The ghost outline on each bar is the true Arena Score implied by the slider. The filled bar is the score fitted from your simulated votes; the whisker is its 95% confidence interval. Drag two sliders close together, then run only 50 battles — see how the CIs overlap so you can't rank them. Run 1000 and they separate.
preview-jerboa, 88 votes) has a CI of roughly ±85 points for exactly this reason.Here's a problem unique to music. In Chatbot Arena, every model has the same interface: text in, text out. You can route any prompt to any model. But TTM models are a zoo:
| Model | Wants lyrics? | Vocals? | Duration control? |
|---|---|---|---|
| MusicGen (Meta) | No | Instrumental only | No |
| Stable Audio Open | No | Instrumental only | Yes |
| SongGen / ACE-Step | Requires explicit lyrics | Yes | No |
| Riffusion FUZZ | Generates lyrics itself | Yes | No |
So if a user types "folk song about a cat named Chamomile," you can't send that to MusicGen (instrumental — no vocals). And you can't send it raw to SongGen either, because SongGen demands a lyrics field the user never provided. The single text box has to be adapted to each model's type signature.
Each prompt is parsed into structured fields, then matched against the model roster. Green = compatible (will be in the battle pool). Gray = filtered out. The copyrighted prompt is rejected at moderation before any model sees it.
Trace the types. Input: prompt: str. The LLM emits {instrumental: bool, lyrics: str|null, duration: float|null} plus a moderation verdict {allowed: bool, reason: str}. The router then computes, for each model, compatible = model.supports(parsed), and draws the battle pair uniformly from the compatible set. For a vocal prompt routed to a lyrics-required model like ACE-Step, the LLM is called a second time to synthesize lyrics — the missing field is filled in, not left null.
An image vote is honest by construction — you see the whole image at a glance before voting. Music isn't like that. It unfolds over time. A user could vote after hearing two seconds, or skip clip B entirely. A vote from someone who never heard B is garbage. Music Arena's response: measure the listening, and gate the vote.
The log is a list of (event, timestamp) pairs per clip. From the paper's example battle, clip A's log looks like:
Click Play A and Play B to accumulate listen time. The vote button unlocks only once both bars cross the 4-second threshold. This is the actual mechanism enforcing meaningful engagement.
Beyond the gate, users are asked for optional natural-language feedback — per-clip notes like the paper's real example: "The music quality was much higher overall, though the style wasn't quite what I asked for." Binary A-vs-B tells you which; the text tells you why, which is what you need to actually align a model.
Music Arena wants two things that sound contradictory. (1) Record linkage: recognize that 30 battles came from the same person — essential for spam detection and longitudinal "do preferences drift?" research. (2) Privacy: never store who that person actually is. How do you have a stable identity without storing the identity?
Symbol by symbol: IP is the raw identifier you must never store. salt is a secret random string known only to the server. ‖ is concatenation. HASH is a one-way function — easy forward, infeasible backward.
Without a salt, an attacker mounts a rainbow table attack: there are only ~4 billion IPv4 addresses, so you precompute HASH(every_ip) once, then reverse any stored hash by lookup. Trivial. The secret salt defeats this — the attacker would have to recompute the entire table per salt, and they don't know the salt. The hash you publish is useless to anyone but the server.
Three users hit the platform repeatedly. Same IP → same anonymized ID (linkable). Change the salt and all IDs change at once — so even if last month's table leaked, this month's hashes are unrelated. The raw IP is never stored; only the right-hand column survives.
A leaderboard with one number ("Arena Score") hides a decision every TTM provider must make. A model targeting consumption (you want a finished track) should maximize quality. A model targeting a creative workflow (a producer iterating live) should minimize latency, even at some quality cost. Ranking by score alone punishes the fast-and-good-enough model unfairly. So Music Arena reports a second axis.
Worked example: sao-small in the paper has RTF 12.79× (blazing fast, score 782) while riffusion-fuzz-1-1 has RTF 6.01× (slower, but score 1250). The fast model is roughly twice as fast yet ranks last on quality — a textbook speed-quality tradeoff. Neither number alone tells you which to pick; your application decides.
Each point is a real model from the paper's first leaderboard. X = median RTF (log scale, faster → right). Y = Arena Score. The frontier is the upper-right: high quality and fast. Toggle the highlight to see how open-weights vs proprietary models populate the space — and note no single model dominates both axes.
Music Arena is not a model — it's an evaluation methodology carefully adapted to a domain. Its lineage runs straight through the "Arena" family, and its real payload is the renewable preference dataset it produces.
| Equation | Symbols | When to use |
|---|---|---|
| P(i>j)=σ(βi−βj) | β = strength, σ = logistic | Model the probability one model beats another from a pairwise vote |
| Score = 1000 + 173.7·β | 173.7 = 400/ln(10) | Rescale fitted strengths into a readable Elo-like Arena Score |
| salted_id = HASH(salt ‖ IP) | salt = secret string | Link a user's sessions without storing their identity |
| RTF = audio_sec / wallclock_sec | — | Report length-invariant generation speed |