Skip to content

ACE-Step 1.5 — MLX weights v2 (per stage, mapped)

Choose a tag to compare

@yu314-coder yu314-coder released this 27 Sep 04:48
· 111 commits to main since this release

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.