AceStep 1.5 SFT Get Music Infos
Reverse-engineer any track into tags, BPM and key — then feed it back into generation
- audio
- tags
- bpm
- keyscale
- music_infos
- lyrics
Sometimes you don't want to describe a song you've never heard - you want to copy the DNA of one you already like. AceStepSFTMusicAnalyzer (displayed as "AceStep 1.5 SFT Get Music Infos") takes an audio file and hands back descriptive tags, the BPM, and the key/scale. Wire those outputs into the TextEncode node's style_tags / style_bpm / style_keyscale inputs and you've got a style-transfer-ish loop: analyze a reference track, generate something in the same lane. It's the pack's most genuinely novel node.
What's under the hood
Three analysis paths, three outputs:
- Tags - extracted by the native ACE-Step Transcriber, the official audio-to-text model from the AceStep team. It transcribes lyrics, vocal content, and song-structure markers (verse/chorus/bridge) and derives comma-separated tags from them. This is a real speech-and-music model, not a toy.
- BPM - detected via librosa tempo estimation (an
INT, e.g.129). - Key/scale - also librosa, output as text like
"G minor".
There's a fourth output, music_infos, a JSON blob with all three, handy if you want to stash the analysis or pass it around as a string.
The gotcha you need to know before you try it
The tag extraction model downloads on first use, and it's enormous - roughly 22 GB. That's not a typo, and it's why the unload_model toggle defaults to true (free the VRAM after analysis so generation isn't starved). If you only want the BPM and key, flip get_tags off and it never loads the transcriber at all - that's the smart way to use this node on a modest GPU. The audio_duration input (default 60s, center-cropped) is your other lever: the transcriber benefits from more context for structure, but you don't need to feed it five minutes.
The inputs that matter
audio- what to analyze (an AUDIO, e.g. loaded from a file).get_tags/get_bpm/get_keyscale- toggles for each analysis. Keep tags off until you're ready for the 22 GB download.max_new_tokens- transcription length ceiling; higher preserves more lyric/structure detail.use_flash_attn- off by default, becauseflash-attnisn't installed by the pack (it's a notoriously finicky compile-time dependency). Turn it on only if you've already got it working; the tooltip says it's faster and lighter on VRAM.temperature(default 0, deterministic - recommended),top_p,top_k,repetition_penalty(default 1.1),seed- sampling knobs for the transcription. The defaults are chosen for stable structure extraction; the tooltips basically say "don't touch unless experimenting."
Outputs and the loop
tags (STRING), bpm (INT), keyscale (STRING), music_infos (STRING). The intended pipeline, straight from the README:
Music Analyzer → tags, bpm, keyscale
↓
TextEncode: style_tags ← tags
style_bpm ← bpm
style_keyscale ← keyscale
↓
Generate → Save Audio
style_bpm overrides bpm when > 0; style_keyscale overrides when non-empty; style_tags gets appended to your caption. It's a good workflow, with one honest caveat: the tags describe what the track is, and the model is trained on licensed-clean music, so this clones a vibe more reliably than it clones a specific hit. Treat the output as a starting point, not a cover generator.
Practical notes
unload_model defaults to true, which is right for generation-heavy graphs but means every analyze re-loads the transcriber - batch your analyses if you can. If use_flash_attn errors, that's the missing dependency talking; set it back to false. And if tags come back thin, raise max_new_tokens and audio_duration before you blame the model.
Install the pack once via ComfyUI Manager (search "AceStep") or git clone https://github.com/jeankassio/ComfyUI-AceStep_SFT.git into custom_nodes/. Its only hard runtime deps - transformers, torchaudio, librosa, soundfile - are in the pack's requirements.txt and install with it.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | Audio to analyze for style, BPM and key/scale. | |
| get_tags | BOOLEAN | true | Derive descriptive vocal/language/structure tags from the selected transcription. If get_lyrics is disabled, the native ACE-Step Transcriber is used for tags. |
| get_bpm | BOOLEAN | true | Detect BPM from audio using librosa. |
| get_keyscale | BOOLEAN | true | Detect key and scale from audio using librosa. |
| get_lyricsopt | BOOLEAN | true | Return lyrics formatted for ACE-Step TextEncode. Whisper is the accurate default; the native model remains selectable for its detected section markers. |
| max_new_tokensopt | INT | 1024256–4096 | Per-segment token ceiling. Duration-aware limits are applied automatically so a decoder loop cannot consume a full-song budget. |
| audio_durationopt | INT | 30010–600 | Max seconds of audio to analyze (center crop only when the song exceeds this limit). Keep this above the song duration to return the complete lyrics. |
| unload_modelopt | BOOLEAN | true | Unload the ACE-Step transcriber after use to free VRAM for generation. |
| use_flash_attnopt | BOOLEAN | false | Use FlashAttention-2 for the ACE-Step transcriber. Requires flash-attn package installed. Faster and uses less VRAM. |
| free_vram_beforeopt | BOOLEAN | true | Unload ComfyUI diffusion/text models before loading the selected transcription model. Recommended on 24 GB GPUs. |
| temperatureopt | FLOAT | 0.000–2 | Sampling temperature for the native ACE-Step Transcriber. Whisper uses deterministic beam search for accuracy. |
| top_popt | FLOAT | 1.000–1 | Nucleus sampling for the native ACE-Step Transcriber; ignored by Whisper beam search. |
| top_kopt | INT | 00–200 | Top-K sampling for the native ACE-Step Transcriber; ignored by Whisper beam search. |
| repetition_penaltyopt | FLOAT | 1.101–3 | Token penalty for the native ACE-Step Transcriber. Whisper repetition is handled by segment retry and line-loop cleanup. |
| seedopt | INT | 00–18446744073709550000 | Random seed for reproducible transcription generation when sampling is enabled. |
| transcription_chunk_secondsopt | INT | 3010–120 | Split long songs into bounded transcription segments. 30 seconds is recommended and prevents one hallucinated loop from replacing the complete lyrics. |
| lyrics_modelopt | COMBO | Whisper-large-v3-transcription | Model used when get_lyrics is enabled. Whisper large-v3 is the accurate default; Turbo is faster; ACE-Step keeps native structure but can hallucinate repeated lyrics on some songs. |
| lyrics_languageopt | COMBO | auto | Optional Whisper language hint. Use pt for Brazilian Portuguese if automatic detection confuses a heavily processed vocal. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| tags | STRING | — |
| bpm | INT | — |
| keyscale | STRING | — |
| music_infos | STRING | — |
| lyrics | STRING | — |