TS Song Creator
The lyrics box that puts the stress where you meant it
- lyrics
- style
Song models don't take a prompt. They take two: a lyric sheet, and a pile of words describing how it should sound. In ComfyUI that's usually a pair of anonymous STRING nodes off to the side, and you're the one remembering which box is which. TS Song Creator is a nicer box for exactly that job - lyrics, style, and nothing else.
What it actually is
A text-authoring node, not a music node. It generates nothing and talks to no model; what leaves it is two STRINGs. That's the whole contract.
Worth saying out loud, because it sets expectations: local song generation in ComfyUI is still thin. ACE-Step is the real one - the open answer to Suno, native to ComfyUI since May 2025, strong on instrumentals and noticeably weaker on vocals. People work around the lyric problem by having a local LLM write the words, then editing them by hand. This node is shaped around that workflow.
How it works
The Python side is deliberately dull. execute() normalizes both strings - \r\n from a Windows clipboard becomes \n, trailing spaces per line are stripped, leading and trailing blank lines go - and returns them otherwise untouched. Case, punctuation and your line breaks survive. Only the things that break the model's input get fixed; a song is not a place to "improve" text.
Everything else lives in the frontend, and the UI is fed by the preset. That's what makes this worth more than a styled text box: the section-tag buttons and the style library aren't hardcoded, they're read from plain JSON in nodes/text/song_presets/, one file per song model. The shipped preset is YuE 2 - 55 styles spanning blues to chiptune, 26 voices grouped female / male / other, and 12 section tags from [intro] to [outro]. Adding ACE-Step's vocabulary is a file, not a code change.
Two things the author bakes in deliberately. Style names are translated for the UI but the prompt itself stays English - the models were trained on English descriptors, so translating the prompt doesn't translate the conditioning, it corrupts it. And picking a voice replaces a genre's default rather than appending, so three clicks don't leave three singers in the field.
Then there's the stress mark, which for Russian lyricists is the whole reason to use this node. Right-click a vowel, choose Mark stressed, and the letter gets a combining accent - the marking dictionaries use. Cyrillic has no precomposed accented letters, so by hand this means copying a character out of a character map. Given that these models garble pronunciation anyway, telling the model which syllable to hit is the difference between a song and a novelty.
The inputs and outputs that matter
Three inputs, and only two of them change anything:
- lyrics - the song. Section tags go in with a click and land on their own line, which is how the model knows where a part starts.
- style - genre, tempo, voice, instruments, mood. A comma-separated list works best; the preset library fills it in and you edit from there.
- preset - a dropdown that says whose vocabulary the editor speaks. It does not change the output. If you're on ACE-Step, check what its lyric/
tagsfield expects before assuming the YuE tag list is right for it.
Outputs are lyrics and style, both STRING. Wire the first into the song model's lyric input and the second into its style/tags input. In a typical graph that's TS Song Creator → text encoder → sampler → audio decode.
Installing it
ComfyUI Manager → search Timesaver → install → restart. Or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/AlexYez/comfyui-timesaver
cd comfyui-timesaver
python -m pip install -r requirements.txt
This node itself needs nothing extra - no models, no optional extras. But the pack's requirements.txt is not small (Whisper, transformers>=5.2.0, OpenCV, comfyui-frontend-package>=1.48.0), because it installs everything the other 75 nodes need. On a Windows portable build, run pip through python_embeded\python.exe or the dependencies land in the wrong interpreter.
Where people get stuck
The buttons never appear. The editor is a frontend widget, so an old comfyui-frontend-package is the usual cause. The node still works without it - both fields are ordinary multiline widgets and you can type [verse] yourself - you just lose the library, the tag buttons, the stress menu and full screen. Hard-refresh the browser first, then check the frontend version.
You added your own preset and it doesn't show up. A preset is validated whole or not at all: a style with no id or no prompt gets logged and dropped, and a file with no usable styles is skipped entirely rather than appearing as a broken entry. Look in the ComfyUI log for a [TS Song Creator] line naming the file before you edit the JSON blind.
Long lyrics in a small box. Full screen moves the real fields into an overlay and back, so your selection and undo history survive it.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| lyrics | STRING | The song itself. Section tags such as [verse] and [chorus] tell the model where a part starts — the buttons above insert the ones this preset's model reads. Right-click a vowel to mark it stressed: the mark goes into the text as a combining accent, exactly what a model needs to sing a Russian word the way you mean it. | |
| style | STRING | How it should sound: genre, tempo, voice, instruments, mood. A comma-separated list works best. Pick a preset from the library to fill this in, then edit it — the presets are a starting point, not a cage. | |
| preset | COMBO | YuE 2 | Whose vocabulary the editor offers: the style library and the section-tag buttons come from this preset. It does NOT change the output — what leaves this node is exactly what is in the two fields. Presets are plain JSON in nodes/text/song_presets, so another model is a file, not a code change. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| lyrics | STRING | The lyrics, as typed. Carriage returns and trailing spaces removed. |
| style | STRING | The style prompt, as typed. |