ACE-Step

August 16, 2026 · View on GitHub

ACE-Step is wired as --family ace_step --task gen. It generates and edits music from text, lyrics, and optional source audio. The route controls whether source audio is ignored, optional, or required.

Common CLI shape:

audiocpp_cli --task gen --family ace_step --model models/Ace-Step1.5 --backend cuda --task-route <route> ...

Model

FieldValue
Familyace_step
Model directorymodels/Ace-Step1.5
Taskgen
Default DiTacestep-v15-turbo
Optional DiTacestep-v15-xl-turbo, acestep-v15-xl-sft
Default LMacestep-5Hz-lm-1.7B
Prompt input--text
Lyrics input--lyrics
Source audioRoute-dependent through --audio

Text To Music

Generate a full song or music clip from prompt text and optional lyrics. Source audio is ignored by this route.

FieldValue
Routetext2music
Source audioIgnored
PlannerUsed unless audio_codes are supplied
Duration--duration-seconds; -1 lets the planner/model choose
Metadata controlsOptional bpm, keyscale, timesignature, and language
audiocpp_cli --task gen --family ace_step --model models/Ace-Step1.5 --backend cuda --task-route text2music --text "cinematic synth pop with clear vocals" --lyrics "We rise with the morning light" --duration-seconds 60 --out song.wav

Use the base DiT instead of turbo:

audiocpp_cli --task gen --family ace_step --model models/Ace-Step1.5 --backend cuda --task-route text2music --text "acoustic folk ballad" --lyrics "The river remembers our names" --duration-seconds 60 --load-option ace_step.dit_model_path=acestep-v15-base --out song.wav

Complete

Complete or continue a source audio track. Source audio is optional: if provided, it conditions the continuation; otherwise the route behaves like a completion prompt.

FieldValue
Routecomplete
Source audioOptional
PlannerUsed
DurationSource duration is not locked unless requested metadata or planner output controls it
Track classesOptional complete_track_classes list changes the completion instruction
audiocpp_cli --task gen --family ace_step --model models/Ace-Step1.5 --backend cuda --task-route complete --audio input.wav --text "finish this as a cinematic rock track" --out complete.wav

Lego

Compose or transform a track from source audio plus a prompt. Source audio is required and preserved as the repaint context.

FieldValue
Routelego
Source audioRequired
PlannerUsed
DurationLocked to source audio
Repaint windowUsed internally over the source context
Track nameOptional track_name changes the generated instruction
audiocpp_cli --task gen --family ace_step --model models/Ace-Step1.5 --backend cuda --task-route lego --audio input.wav --text "generate a brighter guitar layer" --request-option track_name=guitar --out lego.wav

Extract

Extract a target track from source audio. Source audio is required, and the route uses extraction-specific defaults for guidance and shift.

FieldValue
Routeextract
Source audioRequired
PlannerNot used
DurationLocked to source audio
Track nameOptional track_name; when omitted, the default extract instruction is used
Route defaultsguidance_scale=7.0, shift=3.0, planner chain-of-thought metadata disabled
audiocpp_cli --task gen --family ace_step --model models/Ace-Step1.5 --backend cuda --task-route extract --audio song.wav --text "extract vocals" --request-option track_name=vocals --out vocals.wav

Cover

Generate a cover from source audio using cover-tokenizer conditioning. Source audio is required and duration is locked to the source.

FieldValue
Routecover
Source audioRequired
PlannerNot used
Cover conditioningUses the FSQ cover tokenizer
DurationLocked to source audio
audiocpp_cli --task gen --family ace_step --model models/Ace-Step1.5 --backend cuda --task-route cover --audio source.wav --text "turn this into energetic pop vocals" --lyrics "We keep moving through the night" --out cover.wav

Cover Without FSQ

Generate a cover from source audio without the FSQ cover-tokenizer conditioning path.

FieldValue
Routecover-nofsq
Source audioRequired
PlannerNot used
Cover conditioningDoes not use the FSQ cover tokenizer
DurationLocked to source audio
audiocpp_cli --task gen --family ace_step --model models/Ace-Step1.5 --backend cuda --task-route cover-nofsq --audio source.wav --text "make a softer acoustic cover" --lyrics "We keep moving through the night" --out cover_nofsq.wav

Repaint

Replace a time span inside source audio. Source audio and a repaint window are required.

FieldValue
Routerepaint
Source audioRequired
PlannerNot used
DurationLocked to source audio
Required window--repaint-start, --repaint-end
Repaint policyrepaint_mode, repaint_strength, or direct repaint injection/crossfade options
audiocpp_cli --task gen --family ace_step --model models/Ace-Step1.5 --backend cuda --task-route repaint --audio song.wav --text "replace the middle with a brighter chorus" --repaint-start 20 --repaint-end 35 --out repaint.wav

Shared Controls

OptionValuesDefaultMeaning
--task-routetext2music, complete, lego, extract, cover, cover-nofsq, repainttext2musicACE-Step operation.
--texttextrequiredMusic prompt or edit instruction.
--lyricstextempty stringVocal lyrics.
--audioWAV pathroute-dependentSource audio for complete/edit/extract/cover routes.
--duration-secondsfloat, -1 for auto-1Target duration. Source-locked routes use source duration.
--languagelanguage codeenVocal language for lyrics.
--track-nametextempty stringTrack name used by lego and extract instructions.
--request-option complete_track_classes=a,bcomma-separated textempty listTrack classes for complete.
--repaint-startsecondsrequired for repaintStart time for repaint.
--repaint-endsecondsrequired for repaintEnd time for repaint.
--repaint-modebalanced, conservative, aggressivebalancedPreset repaint blending policy.
--repaint-strength0..10.5Repaint strength used by preset repaint mode.
--num-inference-stepsinteger8Diffusion denoising steps.
--guidance-scalefloat1.0; 7.0 for extract unless overriddenDiffusion guidance scale.
--seedintegerrandom if omittedGeneration seed.
--request-option bpm=<n>integernot setForce BPM metadata; otherwise the planner chooses it when used.
--request-option keyscale=<text>textnot setForce key metadata; otherwise the planner chooses it when used.
--request-option timesignature=<text>textnot setForce time signature metadata; otherwise the planner chooses it when used.
--request-option negative_prompt=<text>textNO USER INPUTNegative prompt.
--request-option audio_codes=<text>ACE semantic code textnot setSkip planner token generation and use supplied audio codes.
--request-option audio_cover_strength=<float>float1.0Cover strength for cover/edit-style conditioning.
--request-option cover_noise_strength=<float>float0.0Noise strength for cover conditioning.
--request-option lm_temperature=<float>float0.85Planner sampling temperature.
--request-option lm_cfg_scale=<float>float2.0Planner CFG scale.
--request-option lm_top_k=<n>integer0Planner top-k; 0 disables top-k.
--request-option lm_top_p=<float>float0.9Planner top-p.
--request-option lm_repetition_penalty=<float>float1.0Planner repetition penalty.
--request-option sampler_mode=<name>euler, heuneulerDiffusion sampler mode.
--request-option retake_seed=<n>integer, -1 to clearnot setOptional retake noise seed.
--request-option retake_variance=<float>float0.0Retake noise mixing strength.
--request-option flow_edit_morph=true|falseboolfalseStatus: parsed for text2music, but not usable because the flow-edit diffusion overlay is not implemented.
--request-option dcw_enabled=true|falseboolfalseStatus: experimental dynamic-cfg wavelet path. Keep disabled unless validating that path.

Model Selection

OptionValuesDefaultMeaning
--load-option ace_step.dit_model_path=<dir>acestep-v15-turbo, acestep-v15-base, acestep-v15-xl-turbo, acestep-v15-xl-sftacestep-v15-turboSelect DiT variant inside the model root.
--session-option ace_step.dit_weight_type=<type>native, f32, f16, bf16, q8_0nativeDiT weight type.
--session-option ace_step.planner_weight_type=<type>native, f32, f16, bf16, q8_0nativePlanner LM weight type.
--session-option ace_step.mem_saver=true|falseboolfalseRelease staged graph/cache state after request phases to reduce resident VRAM. Later requests may rebuild released graphs.

ACE-Step GGUF packages are variant-specific. Use the Turbo GGUF for the default acestep-v15-turbo path, and pass --load-option ace_step.dit_model_path=acestep-v15-base when loading a Base GGUF package, or --load-option ace_step.dit_model_path=acestep-v15-xl-turbo for the XL Turbo one.

XL variants

acestep-v15-xl-turbo and acestep-v15-xl-sft are the larger DiT: 32 layers of 2560 against turbo's 24 of 2048, with 32 attention heads of 128 (so the attention width is 4096, wider than the model). The condition encoder, audio tokenizer and detokenizer stay at 2048 — the encoder_hidden_size group in the XL config — and the DiT's condition embedder bridges the two. The XL timbre encoder also prepends a CLS token to the reference frames and reads that position back, where earlier variants read the first audio frame.

Both are optional package resources: they are only loadable when their weights are present, and a package without them loads and runs exactly as before. Selecting one that is not installed reports which directory is missing. The upstream snapshots ship four safetensors shards plus a model.safetensors.index.json, which the package spec points at directly.

The two differ only in is_turbo: XL Turbo is guidance-distilled and ignores guidance_scale, XL SFT takes the CFG path the way acestep-v15-base does. Their dimensions, encoder group and head configuration are identical.

ace_step_xl_turbo_bf16 and ace_step_xl_sft_bf16 install them as GGUFs (14.2 GB each), self-contained the way the Turbo and Base GGUFs are — XL DiT, planner LM, text encoder and VAE in one file:

audiocpp_cli --task gen --family ace_step --model models/ACE-Step1.5-GGUF/xl-turbo --backend cuda --task-route text2music --text "warm lo-fi hip hop with a soft rhodes piano" --duration-seconds 60 --load-option ace_step.dit_model_path=acestep-v15-xl-turbo --out song.wav

Running one from a safetensors tree instead is worth a dit_weight_type=bf16, because the XL snapshots are stored in float32 and native puts 19.9 GB of weights on the card:

audiocpp_cli --task gen --family ace_step --model models/Ace-Step1.5 --backend cuda --task-route text2music --text "warm lo-fi hip hop with a soft rhodes piano" --duration-seconds 60 --load-option ace_step.dit_model_path=acestep-v15-xl-sft --session-option ace_step.dit_weight_type=bf16 --out song.wav

Measured on an RTX 5090, 20 s of audio, weight loading included and the weights warm in the page cache: 87 s from safetensors at native, 25 s from safetensors at bf16, 15 s from the bf16 GGUF, both variants alike (turbo, for reference: 11 s). Reading the weights off disk adds roughly 10 s either way.

Building an XL GGUF yourself needs the other variants' safetensors on hand, because audiocpp_gguf checks the conversion against the spec's required namespaces; exclude them from the output:

audiocpp_gguf --root models/Ace-Step1.5 --family ace_step \
  --input dit_turbo_weights=models/Ace-Step1.5/acestep-v15-turbo/model.safetensors \
  --input dit_turbo_silence_latent=models/Ace-Step1.5/acestep-v15-turbo/silence_latent.safetensors \
  --input dit_base_weights=models/Ace-Step1.5/acestep-v15-base/model.safetensors \
  --input dit_base_silence_latent=models/Ace-Step1.5/acestep-v15-base/silence_latent.safetensors \
  --input dit_xl_turbo_weights=models/Ace-Step1.5/acestep-v15-xl-turbo/model.safetensors.index.json \
  --input dit_xl_turbo_silence_latent=models/Ace-Step1.5/acestep-v15-xl-turbo/silence_latent.safetensors \
  --input lm_weights=models/Ace-Step1.5/acestep-5Hz-lm-1.7B/model.safetensors \
  --input text_encoder_weights=models/Ace-Step1.5/Qwen3-Embedding-0.6B/model.safetensors \
  --input vae_weights=models/Ace-Step1.5/vae/diffusion_pytorch_model.safetensors \
  --exclude-prefix dit_turbo_ --exclude-prefix dit_base_ \
  --type bf16 --output ace-step-1.5-xl-turbo-bf16.gguf

Swap dit_xl_turbo_* for dit_xl_sft_* to build the SFT one. Upstream ships silence_latent.pt where the spec wants safetensors; tests/ace_step/convert_silence_latent.py --input <variant>/silence_latent.pt converts it.