AceStepOpenAI_Lyrics
ChatGPT-Style Lyrics That Speak Ace-Step's Production-Tag Language
- lyrics
The whole point of the lyrics nodes in this pack is that ACE-Step doesn't just read lyrics - it reads a structured document where text in square brackets is a musical instruction. [drop], [synth solo], [filtered saw bass] are events it renders, not decorative formatting. AceStepOpenAI_Lyrics is the default-path member of the family: it sends your idea to an OpenAI GPT model and gets back lyrics formatted exactly the way the sampler expects.
How it works
You paste an OpenAI API key into the node (it's a node input, not an environment variable - keep that in mind for sharing workflows), describe the song in the text box, and the node wraps your description in a detailed system-style prompt that teaches the model Ace-Step's formatting rules: each lyric line short enough to sing (max 10-12 words), each production tag on its own line, blank lines between rhyming groups, and an anti-repetition vocabulary guide. The request goes straight to api.openai.com/v1/chat/completions via plain urllib - no SDK dependency.
Everything else flows through the shared lyricist framework: the instrumentality_balance dropdown (Pure Instrumental → Vocals Only) controls how much vocal vs. instrumental content the model writes, seed is baked into the prompt as a variation knob, and max_tokens (default 1024) caps response length. Output is a single lyrics STRING, ready to feed your ACE-Step text conditioning.
Picking a model
The dropdown ships 12 models. gpt-4o is the default and is genuinely the one to reach for - it's fast, cheap-ish, and handles the tag-formatting instructions well. gpt-4o-mini is your iteration workhorse when you're burning tokens testing styles. The reasoning models (o1, o3, o3-mini) are listed and work, but for a 300-word lyric sheet they're overkill - slower and pricier for no visible gain. The gpt-5.x entries are the latest at the time of writing; try them if you want, but the model list only changes when the pack updates.
Where it sits in a workflow
The lyrics output is just text - it becomes audible only when you feed it into the ACE-Step text encoder/conditioning, then through a sampler like the pack's AceStepKSampler. And since the output is a plain string, you can route it to AceStepSaveText to keep a copy on disk.
Install: ComfyUI Manager (search "JK AceStep Nodes") or git clone https://github.com/jeankassio/JK-AceStep-Nodes.git into ComfyUI/custom_nodes/, then restart. No heavy deps added by this node beyond the pack's (torch, numpy, tqdm, librosa).
Two honest gotchas. First, there's no retry logic - if the API call fails you get the error text back as the lyrics output, so check what you're feeding the sampler before blaming the model. Second, if you paste a key into a shared workflow file, it ships with the JSON - rotate keys you don't want public. This is the family's "it just works" member; wire it up, describe the track, done.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | — | |
| api_key | STRING | — | |
| model | COMBO | gpt-4o | 12 options: gpt-5.1, gpt-5.1-codex, gpt-5, gpt-5-pro, gpt-4o, gpt-4o-mini, +6 |
| max_tokens | INT | 10241–4096 | — |
| seed | INT | 00–18446744073709550000 | — |
| instrumentality_balance | COMBO | Balanced | 5 options: Pure Instrumental, Very Instrumental, Balanced, Vocal Focused, Vocals Only |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| lyrics | STRING | — |