Add Vocals to Music · V5.5
A topline sung over your own instrumental
- audio
- url
- all_urls_json
- task_id
- raw_json
- credits_consumed
- credits_left
This is the pair to Add Instrumental to Music. That node strips (well, re-renders) a song down to its backing; this one goes the other way and puts a vocal performance on top of an instrumental you already have. Together they're the two halves of the loop people actually want: an instrumental bed from a local model, a Suno-grade vocal on top.
And vocals are exactly the seam in the local stack. ACE-Step is the open answer to Suno and it's genuinely good at instrumental music - but lyrics and vocals are the weak suit, and it's the same complaint Suno itself attracts. If your track is going to have a singer and you care what the singer sounds like, this endpoint is the pragmatic route, and it costs credits per call.
How it works
The pack generates one node per documented model version from KIE's API docs at startup, so V5_5 is baked into this class - no model selector to pick. The node builds the documented request body, submits it to KIE's task endpoint (envelope model ai-music-api/add-vocals, inner model V5_5), polls the record-info endpoint every couple of seconds with backoff until the task succeeds, then downloads the mp3 and hands it back as a ComfyUI AUDIO. Failing tasks raise with the task id and the provider's message instead of returning nothing.
The inputs that matter
Five fields are required here, and the naming is worth reading carefully because this node wants style, not tags - unlike its Add Instrumental cousin:
- upload_url - your instrumental, as a URL KIE can fetch. The docs: source audio plus
title,negative_tagsandstyleis enough to generate. - prompt - a description of what you want, and it doubles as lyrics only when
lyricsis absent. - title, negative_tags, style - required, and together with the source they define the result.
Optional: vocal_gender (m/f; the docs concede it only shifts the odds), style_weight (0–1, default 0.61), weirdness_constraint (0.72), audio_weight (how much the source audio counts), lyrics (takes priority over prompt), variety (0–4; 0 holds the style tightly, 4 goes exploring), plus timeout_seconds and callback_url.
Outputs: audio into Save Audio or whatever audio node comes next, url, all_urls_json for every returned result URL, task_id, raw_json, and credits_consumed / credits_left - both printed on the node after each run.
Getting your instrumental in
upload_url is a string widget, so no direct AUDIO connection. The pack ships KIE • Upload Audio under KIE Next/Utility/Media: it takes an AUDIO socket and returns a public URL. Then right-click upload_url, choose Convert widget to input, and wire the string. That's the whole trick, and it's what turns "generate a bed locally, then sing over it" into a single graph you can run twice a day without touching a browser.
Installing
ComfyUI Manager, search "KIE Nodes Next" - the README describes registry publication as prepared rather than done, so expect the manual route to be the one that works today:
cd ComfyUI/custom_nodes
git clone https://github.com/felipederosilva/ComfyUI-KIE-Nodes-Next
pip install -r ComfyUI-KIE-Nodes-Next/requirements.txt
Restart, then paste your key once at Settings → KIE.ai Nodes Next → Connection. It's validated before it overwrites a working key, only a masked fingerprint is displayed, and KIE_API_KEY in the environment takes priority for headless setups. Four small dependencies: requests, Pillow, numpy, PyYAML. No torch, no checkpoints, nothing to download.
Where people get burned
- There's no key configured → the error tells you exactly where to paste one. That's the first thing to check whenever a KIE node looks dead.
- Instrumental source, instrumental output. If your result has no vocal, check
lyricsandpromptare filled and you haven't left the source in a form the endpoint reads as already-sung. - Style wording matters more than you'd think.
Jazzwith an EDM instrumental gets you mush. Describe the track you actually want to hear. - Mixed-release installs are refused at import. If the pack says its version and the generated node build disagree, delete the folder and reinstall rather than trying to patch files.
- V5.5 is discontinued in KIE's docs. It runs fine; new work belongs on the V6 sibling node.
- Credits, not free. Every retry is another call.
credits_consumedandcredits_leftare on the node for exactly this reason - watch them while you tune, don't hammer the run button.
Practical ordering that works: nail the instrumental first, upload it, then iterate only on lyrics and variety. Changing the bed and the words in the same run tells you nothing about which one moved the result.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | A calm and relaxing piano track. | Prompt for generating audio. Optional. - Used as lyrics only when `lyrics` is not provided. If `lyrics` is present, `prompt` is not used as lyrics. - V6, V6_MINI, and V6_WILD: Maximum 5000 characters. |
| title | STRING | Relaxing Piano | Music title. Required. Will be displayed in the player interface and file name. |
| negative_tags | STRING | heavy metal, strong drum beats | Excluded music styles. Required. Used to avoid including specific styles or elements in the generated music. |
| style | STRING | Jazz | Music style. Required. Such as jazz, electronic, classical and other music types. |
| upload_url | STRING | https://example.com/music.mp3 | URL of the uploaded audio file. Required. Source audio (`upload_url`) is enough to generate once `title`, `negative_tags`, and `style` are provided. |
| vocal_genderopt | COMBO | m | Vocal gender preference. Optional. 'm' for male, 'f' for female. Based on practice, this parameter can only increase the probability but cannot guarantee adherence to male/female voice instructions. |
| style_weightopt | FLOAT | 0.610–1 | Adherence strength to specified style. Optional. Range 0–1, up to 2 decimal places. |
| weirdness_constraintopt | FLOAT | 0.720–1 | Controls experimental/creative deviation level. Optional. Range 0–1, up to 2 decimal places. |
| audio_weightopt | FLOAT | 0.650–1 | Relative weight of audio elements. Optional. Range 0–1, up to 2 decimal places. |
| lyricsopt | STRING | [Verse] Keep the melody flowing Into a gentle bridge [Chorus] Let the piano rise and fall | Lyrics for the generated audio. Optional. - Takes priority over `prompt` as lyrics. If omitted, `prompt` is used as lyrics when provided. - V6, V6_MINI, and V6_WILD: Maximum 5000 characters. - Not required. Source audio (`upload_url`) is enough to generate once `title`, `negative_tags`, and `style` are provided. |
| varietyopt | INT | 10–4 | Controls the diversity and stylistic variation of generated results. Optional. Integer range 0–4, default 1. - **`0`**: off (exact style) — fully off, strictly the same style - **`1`**: normal (balanced variety) — default, balances stability and diversity - **`2`**: high (distinct styles) — produces results with clearly different styles - **`3`**: extra (bold exploration) — higher variation, encourages bold exploration of different styles - **`4`**: max (unreasonably varied) — maximum diversity; results may differ in style very significantly |
| timeout_secondsopt | INT | 120030–7200 | — |
| callback_urlopt | STRING | Optional KIE callback URL. Leave empty for normal ComfyUI use. |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| url | STRING | — |
| all_urls_json | STRING | — |
| task_id | STRING | — |
| raw_json | STRING | — |
| credits_consumed | FLOAT | — |
| credits_left | FLOAT | — |