05.6 · HeartMuLa vocals: implement vocal themes, settle the ACE/HeartMuLa seat split #19
Labels
No labels
bug
duplicate
enhancement
help wanted
invalid
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
cmoriarty/trog#19
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Follow-up to #16 (05.3 audio bench), which decided adopt on-demand for HeartMuLa-oss-3B: Apache-2.0, fp16-stable on Turing, 12.7GiB peak, RTF≈1.05 — and the only model on this hardware that can sing (ACE-Step's vocal path NaNs at every length on Turing fp16; instrumental untouched). This ticket is the "demand" side: wire vocals for real, and answer the seat-split question the bench opened.
Questions to answer before wiring (bench first, decide second):
[inst]lyrics and instrumental-style tags. If it makes good instrumental BGM, it's a candidate for the whole music seat, not just vocals.vocalkind in the audio profile, kind-routing like music/sfx today); (b) HeartMuLa takes the whole music seat and ACE keeps only sfx-adjacent task modes (lego intensity mixes for ticket 10 layering — those are proven and ACE-only); or (c) HeartMuLa proves out badly and vocals stay a documented manual recipe. Decide from the A/B evidence.vocal(orsong) asset kind in docs/08-assets.md parsing, lyrics block format (the audio Style block should carry vocal language/voice), variations cap, and critic coverage (does the 05.2 sound judge need a vocal mode?).Working material: recipes + drivers in
trog-games/audio-model-benchbench/(README covers ckpt symlink layout, the torchaudio→soundfile save shim, and GPU-window discipline); weights + venvs still live at/mnt/models/audio-benchon trogdor; 05.3 evidence at http://trogdor:3923/games/audio-model-bench/assets/review.html.Decision output: seat split chosen and wired (or explicitly rejected with reason in docs/audio-gen-research.md), vocal kind end-to-end through a drain if adopted.
05.6 complete — vocal seat live, seat split settled
Bench: trog-games/vocal-bench · ear test http://trogdor:3923/games/vocal-bench/assets/pick.html · decisions in
docs/audio-gen-research.md05.6.Two-lane GPU window (HeartMuLa GPU0 ∥ ACE-Step GPU1, both fit 16GB) ran the whole matrix in 6 minutes wall — ACE finished its three clips in ~30s, HeartMuLa was the critical path.
Open questions, answered
emptylyrics mode worked on the first probe ([inst]never needed).explorebrief only), against 6.5× generation time (50s vs 7.6s per 30s clip), 2.2× VRAM (12.7 vs 5.8 GiB), and a 1-in-3 early-EOS failure (a 30s request returned 1.4s) that ACE never showed.Decisions
Seat split (a): ACE-Step keeps music; HeartMuLa is a vocal-only seat. It earns a seat for the one thing nothing else here can do — sing (ACE's vocal path NaNs on Turing).
Spec guidance is the adherence workaround: the vocal template entry now tells the brain not to promise a singer — describe the song, accept the voice, ask for takes if a specific voice matters. An unachievable brief is worse than a vague one.
Deferred with trigger: HeartMuLa instrumental for ambient/pad-heavy games (it won that one brief) — A/B a real game's briefs before touching the split.
Wired and live
audio-server/, per your call that agentic-game-dev is deprecated):make build pushbuilds both trog images, the build overlay hangs the audio context on the analyzer service (one image, two roles — standing CPU analyzer + GPU seat).HeartMuLaBackend+POST /vocal: lyrics required and non-empty (empty = instrumental mode, so a lyricless call would silently return not-a-song), cfg 2.5, ≤180s, early-EOS output fails loudly instead of shipping a 1.4s "song". Dockerfile installs heartlib with its deps and asserts torch stays 2.10.0+cu128 — a future rebind fails the build, not the seat at 3am.vocalasset kind end-to-end: fenced-lyrics parsing (multi-line, dedented), seconds clamped to the seat range,audio_item.route_for()so drain and orchestrator can't disagree on routes, lyricless guards at parse/produce/one-off,trog vocal --lyrics, CLAP critic coverage./mnt/models/audio/heartmulawith relative ckpt symlinks (absolute ones can't resolve in-container) and a compat symlink at the bench path.Proof
Real one-off through the deployed stack:
trog vocal→ brain swap → seat → 45.0s sung theme, 48kHz stereo, delivered in 84s, critic PASS (clap 0.478). http://trogdor:3923/oneoffs/2026-07-25/smoke-vocal-220700.wavCLAP regression checked too — heartlib pins numpy 2.0.2, and the analyzer still scores 0.523 on a matching brief. 97 tests green.
Ticket complete from my side — close when satisfied.