ACE-Step Captioner
Point it at a song, get back a full music description — ACE-Step Captioner is text-to-music in reverse
- audio
- caption
- style_tags
- full_description
If Text to Music turns words into audio, the Captioner turns audio back into words - and unusually well. Give it any track and it returns three things: a one-sentence caption, a comma-separated pile of style_tags (genre, instruments, vibe), and a full_description that reads like a producer's notes. The README claims it beats Gemini Pro 2.5 on music description tasks, which is the kind of claim you should treat skeptically, but the model is real: a Qwen2.5-Omni-7B variant trained specifically for music captioning.
Why would you want this? Three practical jobs. Reverse-engineering prompts for songs you like (feed the caption back into Text to Music). Building a dataset or tagging system for your own generated tracks. And auto-captioning a pile of audio you've accumulated - the chunked processing means it can handle long files, not just 30-second clips.
Like the Transcriber, it shares the same honest hardware caveat: Qwen2.5-Omni-7B is a heavy model, and the README's roadmap puts full-quality omni inference at 30GB+ VRAM with Flash Attention 2. This is a specialist node for machines with headroom, not a quick utility for a 6GB card.
How it works
It loads the captioner model through a transformers pipeline (the same trust_remote_code / Qwen-omni path as the Transcriber) and runs your audio through it with the ACE-Step recommended prompt baked in as default: *Task* Describe this audio in detail. Long audio gets cut into chunk_length_s windows. The three outputs are just structured ways of surfacing one generation: the short caption, the tag list, and the long-form description.
The inputs that matter
audio- what to describe.model_id-ACE-Step/acestep-captionerby default, or a local path inmodels/Ace-Step1.5/acestep-captioner(the dropdown scans there).custom_prompt- you can override the task prompt entirely; the default is a good starting point.max_new_tokens- 1024 default; raise for longer descriptions.temperature- the tooltip says it straight: lower (0.1-0.3) is more deterministic and accurate. Default 0.3.chunk_length_s- 30 default, for long audio.
Install
Node pack plus a separate model download - the captioner is not bundled with the main ACE-Step 1.5 weights:
cd ComfyUI/custom_nodes
git clone https://github.com/kana112233/ComfyUI-kaola-ace-step.git
cd ComfyUI-kaola-ace-step && pip install -r requirements.txt
huggingface-cli download ACE-Step/acestep-captioner --local-dir ComfyUI/models/Ace-Step1.5/acestep-captioner
Restart ComfyUI. You'll also want the base ACE-Step environment installed for the pack overall.
Where people get burned
VRAM is the whole story here. If the pipeline errors out or you watch memory climb past 30GB, it's not a bug in the node - it's the model. Lower dtype to float16, shrink chunk_length_s, and if it still won't fit, this is the point to decide the Captioner isn't worth your card. When it does run, the outputs are genuinely strong - the style_tags in particular are useful enough that you'll find yourself wiring them straight into Text to Music captions for style-cloning runs.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | Input audio to caption/describe. | |
| model_id | COMBO | ACE-Step/acestep-captioner | Select the captioner model. Can be a local path or HuggingFace ID. |
| device | COMBO | auto | Inference device. Use 'auto' or 'mps' for Mac. |
| dtype | COMBO | auto | Model precision. 'auto' uses float16 for CUDA and float32 for CPU/MPS. |
| custom_promptopt | STRING | *Task* Describe this audio in detail | Custom prompt for captioning. Default is the recommended prompt from ACE-Step. |
| max_new_tokensopt | INT | 102464–4096 | Maximum number of tokens to generate. Increase for longer descriptions. |
| temperatureopt | FLOAT | 0.30–1 | Sampling temperature. Lower values (0.1-0.3) are more deterministic and accurate. |
| top_popt | FLOAT | 0.900–1 | Nucleus sampling: cumulative probability threshold. |
| top_kopt | INT | 500–1000 | Top-K sampling. 0 = disabled. Lower values can improve accuracy. |
| repetition_penaltyopt | FLOAT | 1.11–2 | Penalty for repeating tokens. Increase if output gets stuck in loops. |
| seedopt | INT | 00–4294967295 | Random seed for reproducible results. 0 for random. |
| chunk_length_sopt | FLOAT | 300–300 | Audio chunk length in seconds for processing long audio. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| caption | STRING | — |
| style_tags | STRING | — |
| full_description | STRING | — |