Add Vocals to Music · V4.5PLUS
Your instrumental learns to sing
- audio
- url
- all_urls_json
- task_id
- raw_json
- credits_consumed
- credits_left
The mirror image of Add Instrumental: you have a backing track, you want a voice on top of it. Point this node at a hosted audio URL, describe the song, hand it lyrics, and Suno's V4.5PLUS model writes and performs the vocal part.
This is the node that makes the local-vs-API tradeoff concrete. Open music models are genuinely good at instrumentals and still shaky on clean lead vocals - it's the same complaint people level at Suno itself, just from the other side. So if the vocal is the thing you actually care about, paying per call for this is defensible, and if it's the backing you care about, you didn't need the API at all.
How it runs
A remote request through KIE.ai. The node builds the payload, submits it under the transport model ai-music-api/add-vocals with V4_5PLUS as the model version, then waits, polling the record-info endpoint until the task completes or timeout_seconds (default 1200 seconds) is exhausted. The result is downloaded and decoded into a normal ComfyUI AUDIO - the pack leans on ComfyUI's own torchaudio, with a PyAV fallback, so nothing extra gets installed to hear it.
The required five
This node is stricter than most in the family - five fields must be filled before it will run.
upload_url is the source music: a public URL the provider can fetch, not a local path.
prompt is the description of the song you're asking for, and it's treated as lyrics when lyrics isn't provided. lyrics is on the node and wins when both are set, so the clean workflow is: describe the vibe in prompt, put the actual words in lyrics.
style is required, and its default is Jazz - change it deliberately or that's what you'll get. title is required too, mostly for filenames and player UIs. negative_tags is required and is your exclusion list; the docs' own example is heavy metal, strong drum beats, which tells you how blunt these work best.
Optional: vocal_gender (the docs are honest that it only raises the odds of male or female output), variety (0–4), and the 0–1 style_weight / weirdness_constraint / audio_weight dials. Nothing here is a precision tool. Start with variety at its default of 1 and leave the weights alone.
Outputs
audio is the sung result, ready for SaveAudio or a video pipeline. all_urls_json keeps every URL the response carried - these calls generally produce more than one take and only the first becomes the audio output, so it's worth displaying if you want to choose - while url, task_id and raw_json handle linking and diagnosis. credits_consumed and credits_left tell you what the attempt cost and what remains; both are also printed on the node after each run, which is a small thing that makes credit spend far less mysterious.
Installation
Search ComfyUI-KIE-Nodes-Next in ComfyUI Manager, or:
cd ComfyUI/custom_nodes
git clone https://github.com/felipederosilva/ComfyUI-KIE-Nodes-Next
Restart ComfyUI, then set the API key once: Settings → KIE.ai Nodes Next → Connection → Paste / replace KIE.ai API key. KIE validates the key before the pack saves anything, the saved value is kept out of workflow JSON and shown only as a masked fingerprint, and headless installs can bypass the settings panel with the KIE_API_KEY environment variable. Requirements are requests, Pillow, numpy, PyYAML - no models, no GPU work.
Before you commit credits
Verse structure is on you. Suno's docs here don't give you section markers as a control; if the vocal lands wrong across a bar, the practical fix is bracket tags inside the lyrics ([Verse], [Chorus]) and another paid attempt.
V4.5PLUS is legacy. KIE's parameter docs group it with the (Discontinued) models - V4, V4.5, V4.5ALL, V5, V5.5 - while V6/V6_MINI/V6_WILD are current. It works because the page still documents it.
Source quality sets the ceiling. A muffled or clipped backing will beget a vocal that sits badly on top of it. Clean the source first; no setting on this node rescues a bad bed.
Licensing is real. Adding vocals to a track you don't own the rights to creates a derivative work, whatever the node lets you do technically.
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 | — |