ACE-Step Transcriber
Get the lyrics out of any song — ACE-Step Transcriber understands 50+ languages
- audio
- transcription
Feed this node an audio file and it hands back the lyrics, formatted with structure tags like [Verse], [Chorus], and [Bridge], in 50+ languages. That's a genuinely hard problem - singing voices are slurred, mixed with instruments, and full of words no dictionary wants to admit exist. The Transcriber is built specifically for it, and it's the node that pairs naturally with the pack's Cover and Repaint: transcribe first, then tell the model "re-sing these lyrics" with real text instead of hoping it hears them.
The catch is the model behind it. This runs the ACE-Step Transcriber, a Qwen2.5-Omni-7B based multimodal model - and the README is refreshingly honest about the appetite: it recommends ~30GB+ VRAM with Flash Attention 2, and warns that the Qwen preview branch has version-lock quirks. This is the heavyweight node in the pack, not the one you add casually.
How it works
The node loads a Qwen2.5-Omni ASR pipeline via transformers, chunking long audio into 30-second windows (chunk_length_s) so you're not locked to one shot. Two details show the author knew what they were fighting: it disables Qwen's audio generation path (so it doesn't try to synthesize a response) and it monkeypatches token2wav to stop the model from burning VRAM generating waveforms when you only asked for text. You get one output - transcription - as a plain string, ready to drop into a text display node or wire into the lyrics input of a generation node.
The inputs that matter
audio- the track to transcribe.model_id- a local path or HuggingFace ID. The dropdown defaults to the pack's ID but you'll typically download the model locally instead.language-autoor force one of the ten-plus listed.return_timestamps-false,true(segment-level), orword(word-level). Handy when you need to align lyrics to a video.chunk_length_s- 30 default; lower for shorter memory, higher for more context.max_new_tokens- 4096 default; raise it for very long lyrics.- The usual sampler knobs:
temperature0.2,top_p0.95,repetition_penalty1.1 - if output loops, raise the penalty. num_beams- 1 (no beam search) default; higher is slower but sometimes more accurate.
Install
You need the node pack plus a separate model download, because the transcriber is not part of the standard ACE-Step 1.5 model set:
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-transcriber --local-dir ComfyUI/models/acestep-transcriber
You also still need the base ACE-Step environment for the rest of the pack to work. Restart ComfyUI after installing. Note the README flags Qwen-preview-specific transformers requirements for this model - if the pipeline errors on load, the version lock is the usual culprit.
Where people get burned
The big one is VRAM. The README's own guidance: for a consumer card (well under 30GB), consider Whisper-large-v3 or a lighter ASR instead of this node. If it OOMs, cut chunk_length_s, use dtype float16, and accept that this model wants a serious GPU. The good news: when it fits, it's one of the better singing-voice transcribers you can run locally - generic Whisper models are noticeably worse on sung, mixed-down audio with structure tags.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | Input audio to transcribe. | |
| model_id | COMBO | kana112233/ComfyUI-kaola-ace_step | Select the Qwen2.5-Omni model. Can be a local path (in models/acestep-transcriber) or a 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. |
| language | COMBO | auto | Target language for transcription. 'auto' uses default prompt. |
| chunk_length_s | FLOAT | 300–300 | Audio chunk length in seconds for processing. |
| return_timestamps | COMBO | false | Whether to return timestamps. 'word' for word-level timestamps, 'true' for segment-level. |
| custom_prompt | STRING | Custom prompt to override built-in language prompts. e.g. 'Transcribe the audio to Chinese:' | |
| max_new_tokens | INT | 409664–8192 | Maximum number of tokens to generate. Increase for longer lyrics. |
| temperature | FLOAT | 0.20–1 | Sampling temperature. Lower values are more deterministic. |
| top_p | FLOAT | 0.950–1 | Nucleus sampling: cumulative probability threshold. |
| repetition_penalty | FLOAT | 1.11–2 | Penalty for repeating tokens. Increase if output gets stuck in loops. |
| num_beams | INT | 11–8 | Number of beams for beam search. 1 = no beam search. |
| seed | INT | 00–4294967295 | Random seed for reproducible results. 0 for random. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| transcription | STRING | — |