Repository navigation
ACE-Step 1.5 — MLX weights v2 (per stage, mapped)
ACE-Step 1.5 — MLX weights for WhisperKit (v2)
Format conversions of https://huggingface.co/ACE-Step/Ace-Step1.5 (MIT).
Nothing retrained. Built by ports/acestep/convert_weights.py in this repo.
One file per pipeline stage, so the app maps only the stage that is running:
| File | Contents |
|---|---|
ace_qwen_f16.safetensors |
Qwen3-Embedding-0.6B text encoder, float16 |
ace_cond_q8.safetensors |
Condition encoder: lyric and timbre stacks, text projection |
ace_decoder_q8.safetensors |
Diffusion transformer, 24 layers |
ace_vae_f16.safetensors |
Oobleck VAE decoder, 48 kHz stereo (upsampling weights stored as in × taps × out) |
ace_silence_full.safetensors |
Silence latent, 10 minutes at 25 Hz, frames-first |
ace_vocab.json, ace_merges.txt |
Qwen3 byte-level BPE (shared by the text encoder and the planner) |
ace_lm_q8.safetensors |
The 1.7B planner (acestep-5Hz-lm-1.7B), int8 |
ace_hints_q8.safetensors |
FSQ codebook and detokenizer: planner tokens to the 25 Hz guide |
In the _q8 files, 2-D projections are int8 (group size 64) and everything
else is float16. Every tensor starts on a 64-byte boundary.
Why this precision. Against the float32 pipeline over eight steps, final
latent cosine: 0.983 as shipped. The text encoder stays float16 because at
int8 it was the largest single source of drift (0.960). The transformers stay
at int8 because below it the output degrades audibly (velocity cosine: 6-bit
0.9826, 4-bit 0.7465).
The planner writes each song out as five music tokens per second before
the diffusion transformer renders it. Without it the transformer often ended
songs early and left the rest silent; with it, requested lengths are filled.
What is omitted. The FSQ audio encoder side (it turns supplied audio
into tokens; here the planner supplies them) and the VAE encoder.
Licence: MIT, as upstream.