← Tech
▚Tech

YuE2 Field Report 2: One Retraction, Three Confirmations

Replication kills the style-prompt-length claim; score duration predicts audio duration within 2%; score edits measure local to the hertz; decoder choice is inert.

TL;DR — Second field report on local YuE2: one prior finding retracted on a 20-run replication, three capabilities confirmed including sample-accurate score editing, two expected levers measured as inert.

Forty-nine generations, ten experiments, one RTX 5080, official yue2-infer runtime. Reporting date: 16 September 2026. Findings ordered by what changes an operator's behaviour.

Retraction: style-prompt length is not a lever

Prior claim, published three days ago: a long prose style prompt outperforms the documentation's compact comma-separated form, 47% vs 25% lyric fidelity. Sample size: one pair. Replication: four prompt lengths, five seeds each, everything else held.

  • 27 words — 32 / 34 / 39 / 43 / 65 → mean 42.6%, 128.0 s
  • 65 words — 20 / 33 / 42 / 47 / 65 → mean 41.4%, 136.8 s
  • 124 words — 26 / 39 / 46 / 49 / 84 → mean 48.8%, 145.0 s
  • 233 words — 26 / 39 / 49 / 61 / 78 → mean 50.6%, 138.8 s

Between-cell spread of the means: 9.2 points. Mean within-cell standard deviation: 17.9 points.

Noise exceeds signal by roughly 2:1. No demonstrable effect. The original claim was seed variance. Length of the generated song trends upward from 27 to 124 words but within-group spread is 9-19 seconds; not claimed.

Confirmed: score duration predicts audio duration

nominal_duration_seconds from score inspection, against measured audio, 16 songs: all inside 2%. Samples — 107.8 vs 105.6 s; 139.7 vs 139.5 s; 127.3 vs 126.8 s; 156.4 vs 155.8 s.

Operational consequence: planning costs ~20 s, rendering ~120 s. Plan first, filter on predicted duration, render survivors only. Implemented as a four-candidate picker that also discards takes returning an empty transcript.

Confirmed: score edits are local and exact

Method: export score from a completed generation, transpose 32 vocal notes in the final chorus, resubmit as the composition. Source-separated vocal, pitch measured per window.

Window Original Edited Delta
125-138 s (edited) 417 Hz 463 Hz +1.8 st
100-120 s 415 Hz 415 Hz 0.0
0-60 s 415 Hz 415 Hz 0.0

32 of 276 notes changed, indices 214-245. Control windows identical to the hertz.

Baseline render, seed 832010.
Same request, edited score: notes 214-245 transposed. Measured delta +1.8 semitones at 125-138 s, 0.0 elsewhere.

Caveat on our side: intended delta was a uniform +2 st; realised +1.8 because our transposition script did not implement the native accidental-propagation rule (an accidental carries across octaves by letter within the bar). Documented behaviour; our reader was non-conformant.

Confirmed: notes-per-syllable predicts cover failure

Covers rerun correctly — chords stripped with the project tool, cot="melody". Still failing, now with an attributable cause.

  • Song A: 643 melody notes / 185 supplied syllables = 3.5 → fidelity 5%
  • Song B: 440 / 185 = 2.4 → fidelity 14%
  • Normal generation, same lyrics: 1.0-1.3 → fidelity 50-84%
Melody-only cover, cot=melody, 643 notes against 185 supplied syllables. Lyric fidelity 5%.

Transcript of the 5% case returns English-sounding filler against a Korean lyric input. Released pop melodies are denser than a section-tagged lyric sheet; the model fills the surplus. Covers require a lyric written to the source syllable count.

Negative results

Decoder selection — inert. Same cached latents decoded through both shipped VAEs. Band energy delta ≤0.4 pp, dynamics identical to one decimal, waveform correlation 0.954-0.991, spectral centroid +2-3% on the benchmark decoder. Benchmark decoder identity does not affect interpretation of local output.

Score validity — no defects. 18/18 of our scores pass the project validator. A structural concern raised in the prior report (compressed multi-bar rests carrying a chord symbol) is not flagged; that concern was overstated.

FAQ

What is the cheapest way to reject a bad YuE2 generation?

Read the planned score's nominal duration before rendering. It predicted final audio length within 2% on 16 of 16 songs, and the planning stage costs roughly one sixth of a full render.

How precise is YuE2 score editing in practice?

Sample-accurate in the tested case: 32 of 276 notes altered, the edited 13-second window moved +1.8 semitones, and control windows measured identical frequencies.

How many seeds are needed before a YuE2 A/B is meaningful?

More than five. At n=5 per cell, within-cell standard deviation of lyric fidelity was 17.9 points against a 9.2-point spread between conditions.

What is the correct notes-per-syllable ratio for YuE2?

Between roughly 1.0 and 1.3. At 3.5 the model abandoned the supplied lyric entirely; at 2.0 it filled surplus notes with vocalisations.

Reference: request schema and the 16 GB patches

Operator-facing extracts. Full prompt set and score tooling: Axortex.

The request

{
  "id": "kongkong",
  "style": "Korean, K-pop girl group dance, bright confident female vocals, 126 BPM, punchy kick, deep synth bass, crisp claps, glossy synth plucks, catchy repeated hook, no electric guitar",
  "lyrics": "[Intro]\n\n[Verse]\n...",
  "cot": "full",
  "seed": 831001
}

cot is full (melody and chords), melody (melody only) or off (no score). There is no bpm, negative_prompt or reference_audio field. Put the tempo in the style as a single number, never a range: a range breaks it, a number is followed to within about 3.5 BPM.

Running a 24 GB pipeline on a 16 GB card

# 1. Windows torch wheels ship without a FlashAttention kernel, but the auto-detection only
#    checks that the operator exists - so it picks flash and dies at execution.
from yue2 import cuda_graph, nar
_g = cuda_graph.GraphAR.__init__
cuda_graph.GraphAR.__init__ = lambda s, *a, **k: _g(s, *a, **dict(k, attention_backend="cudnn"))

# 2. NAR attention hands the whole query sequence to SDPA at once (3.77 GiB in one allocation).
_n = nar.CachedNAR.__init__
nar.CachedNAR.__init__ = lambda s, m, c, a="sdpa", q=None: _n(s, m, c, a, q or 2048)

pipe = YuE2Pipeline.from_pretrained(MODEL, vae=VAE, device="cuda", local_files_only=True,
                                    memory_budget_gib=15, offload_ar=True)

References: benchmarks · generation · abc-editing · repo.

Image: Klaus-Dieter Keller, Galton box, Public domain, via Wikimedia Commons.

#yue2#music-generation#local-ai#reproducibility#ab-testing#seed-variance

← Back to all posts