Skip to content
Docs

Using ACE-Step 1.5 XL Music Generator on Chutes

ACE-Step 1.5 is an MIT-licensed music foundation model from ACE Studio and StepFun that pairs a 4B language-model planner with a Diffusion Transformer. This chute serves both XL (4B) DiT checkpoints, xl-turbo for speed and xl-sft for quality, behind one synchronous API that covers text-to-music, cover, and repaint.

Overview

ACE-Step 1.5's defining design is a hybrid architecture in which the language model works as an omni-capable planner: it converts a user query into a full song blueprint, synthesizing BPM, key, duration, metadata, lyrics, and semantic audio codes via Chain-of-Thought, and the DiT then renders the audio conditioned on that plan. Alignment between the two is trained with intrinsic reinforcement learning rather than external reward models. The model card claims prompt adherence across 50+ vocal languages and an explicit commercial stance: training data is licensed, royalty-free/public-domain, or synthetic, and generated music can be used commercially.

The XL variants served here are ~4B-parameter DiTs (decoder: 32 layers, hidden size 2560, 32 attention heads; encoder: 8 layers, hidden 2048; 4.99B total in the safetensors index), released April 2026. Both share the strongest planner in the family, acestep-5Hz-lm-4B, pretrained from Qwen3-4B.

Model specifications

PropertyValue
Parameters~4B per XL DiT (4.99B in safetensors) + 4B LM planner
ArchitectureLM planner (Qwen3-4B base) + DiT: 32-layer decoder (hidden 2560, 32 heads), 8-layer encoder (hidden 2048)
Checkpointsxl-turbo: 8 steps, no CFG. xl-sft: 50 steps, CFG (default 2.0)
Tasks on this chutetext2music, cover, repaint (lego/extract/complete return 400)
Duration10-240 s (endpoint default 120 s)
Languages50+ vocal languages per model card; chute default vocal_language "en"
Output formatsmp3 (default), wav, flac, opus, aac, wav32
LicenseMIT; card states outputs usable commercially
ReleaseApril 2026 (XL checkpoints); ACE-Step 1.5 family January 2026

Quick start

Important: this chute uses a wrapped request body. Nest all fields under a top-level args object. POST /generate is synchronous and returns raw audio bytes (mp3 by default).

curl -X POST "https://vonkaiser-ace-step-15-music-generator.chutes.ai/generate" \
  -H "Authorization: Bearer $CHUTES_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "args": {
      "model": "xl-turbo",
      "caption": "instrumental lo-fi hip hop, warm vinyl texture, relaxed groove",
      "lyrics": "[Instrumental]",
      "duration": 120,
      "thinking": true,
      "audio_format": "mp3"
    }
  }' \
  --output track.mp3
import os
import requests

resp = requests.post(
    "https://vonkaiser-ace-step-15-music-generator.chutes.ai/generate",
    headers={"Authorization": f"Bearer {os.environ['CHUTES_API_KEY']}"},
    json={
        "args": {
            "model": "xl-sft",
            "caption": "anthemic indie rock, driving drums, female vocals, 128 bpm",
            "lyrics": "[Verse 1]\nCity lights below us now\n[Chorus]\nWe are wide awake tonight",
            "duration": 90,
            "inference_steps": 50,
            "guidance_scale": 2.0,
            "thinking": True,
            "use_cot_caption": False,
            "audio_format": "wav",
        }
    },
    timeout=900,
)
resp.raise_for_status()
open("track.wav", "wb").write(resp.content)
const resp = await fetch(
  "https://vonkaiser-ace-step-15-music-generator.chutes.ai/generate",
  {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.CHUTES_API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      args: {
        model: "xl-turbo",
        caption: "cinematic orchestral score, slow build, strings and brass",
        lyrics: "[Instrumental]",
        duration: 60,
        thinking: true,
      },
    }),
  },
);
const { writeFile } = await import("node:fs/promises");
await writeFile("track.mp3", Buffer.from(await resp.arrayBuffer()));

Parameters and tuning

Key fields from the live endpoint (all inside args):

FieldDefaultNotes
model"xl-turbo""xl-turbo" (8 steps, no CFG) or "xl-sft" (50 steps, CFG)
captionlo-fi hip hop sampleStyle tags: genre, instruments, mood, BPM, vocal style
lyrics"Instrumental]"Section-tagged vocal content: Verse 1], Chorus], Bridge]
duration120Seconds; chute readme documents 10-240, but in live testing (July 2026) the endpoint returned ~120 s tracks regardless of this field
inference_stepsnull (per-model default)8 for xl-turbo; pass 50 explicitly on xl-sft when tuning, 64+ for max quality
guidance_scalenullxl-sft only, default 2.0; above 5 often breaks vocals; ignored by xl-turbo
thinkingtrueRuns the LM 4B planner (BPM, key, duration, semantic codes)
task_type"text2music"Also cover and repaint; lego/extract/complete return 400 here
use_cot_captiontrueSet false when passing vocal lyrics so the LM does not rewrite to instrumental
audio_format"mp3"mp3, wav, flac, opus, aac, wav32
seed / use_random_seedrandomFix seed for reproducible renders
src_audio_b64 / audio_cover_strengthnull / 1Source audio and strength for cover; repainting_start/end for repaint

A practical workflow: iterate on xl-turbo until the caption and lyrics land, then re-render the keeper on xl-sft with inference_steps: 50 and guidance_scale: 2.0. POST /format (also args-wrapped) LM-enhances a rough caption/lyrics pair before generation, or set use_format: true to do it inline.

What it's best at

Full-song text-to-music with vocals is the headline: a specific caption plus section-tagged lyrics yields structured tracks with verses and choruses, in 50+ languages per the card. Cover mode restyles existing audio (src_audio_b64), and repaint regenerates a chosen time window while preserving the rest, which makes fixing one bad section cheap. Because the license is MIT and the training-data policy targets commercial safety, it fits soundtrack production for videos, games, and apps.

Not a fit: stem extraction and track completion (xl-base tasks are not loaded here and return 400), speech synthesis or narration (it is a music model, not TTS), and single-call tracks beyond 240 seconds.

How Chutes serves this model

Both XL DiT checkpoints plus the shared LM 4B planner run on one GPU behind a synchronous API on the chute's own host. Requests are args-wrapped JSON; /generate streams raw audio bytes back (or base64 JSON with return_json: true). GET /models lists the loaded aliases, GET /health reports wrapper and ACE-Step sidecar status, and GET /stats exposes usage stats. See the model page, llms.txt, and openapi.json.

FAQ

What is the difference between xl-turbo and xl-sft?

xl-turbo is distilled for 8-step inference without classifier-free guidance: fastest, ideal for drafts. xl-sft is the supervised fine-tuned checkpoint running 50 steps with CFG (default guidance 2.0): highest quality for final renders. Select per request with the model field; both share the same LM 4B planner.

How do I write good prompts for it?

Put style in caption (genre, instruments, mood, BPM, vocal style; be specific) and vocal content in lyrics with section tags like Verse 1], Chorus], Bridge], or Instrumental]. You can also POST /format to have the LM enhance a rough caption/lyrics pair, or set use_format: true on /generate.

What does the thinking parameter do?

With thinking: true (the default and recommendation), the shared acestep-5Hz-lm-4B planner runs first: it plans BPM, key, duration, and semantic audio codes via Chain-of-Thought before the DiT synthesizes audio. This is the core of ACE-Step 1.5's hybrid LM+DiT design.

Why did my vocal track come out instrumental?

The LM caption-rewrite step can turn a prompt instrumental. When you pass real lyrics, set use_cot_caption: false (per the chute readme) so the planner keeps your vocal intent, and make sure lyrics contains tagged vocal sections rather than the default Instrumental].

How is the request body structured?

Unlike most Chutes media endpoints, this chute wraps the body: nest all fields under a top-level args object, e.g. {"args": {"caption": "...", "lyrics": "..."}}. The response from /generate is raw audio bytes (mp3 by default) unless return_json: true.

Can I use generated music commercially?

Yes. The model is MIT-licensed and the ACE-Step 1.5 card states it is trained on licensed, royalty-free/public-domain, and synthetic data specifically so generated music can be used for commercial purposes.

Can it edit existing audio?

Partially. task_type cover restyles existing audio (send src_audio_b64, tune audio_cover_strength), and repaint regenerates a chosen time window (repainting_start/repainting_end). Stem extraction, lego, and complete require the xl-base checkpoint, which is not loaded on this chute and returns 400.

How long can a track be and what formats are supported?

10 to 240 seconds per the chute readme, with a 120-second endpoint default. Note: in live testing (July 2026) the deployment returned ~120-second tracks regardless of the duration value sent, so treat shorter/longer requests as best-effort. Output formats: mp3 (default), wav, flac, opus, aac, and wav32 via the audio_format field.

Sources