Nodes/KIE.ai Nodes Next/Add Vocals to Music · V5.5
ComfyUI Node

Add Vocals to Music · V5.5

A topline sung over your own instrumental

By felipederosilva·Created about a month ago·Updated a day ago· 3
Add Vocals to Music · V5.5
    • audio
    • url
    • all_urls_json
    • task_id
    • raw_json
    • credits_consumed
    • credits_left
    ◄promptA calm and relaxing piano track.►
    ◄titleRelaxing Piano►
    ◄negative_tagsheavy metal, strong drum beats►
    ◄styleJazz►
    ◄upload_urlhttps://example.com/music.mp3►
    ◄vocal_genderm►
    ◄style_weight0.61►
    ◄weirdness_constraint0.72►
    ◄audio_weight0.65►
    ◄lyrics[Verse] Keep the melody flowing Into a gentle bridge [Chorus] Let the piano rise and fall►
    ◄variety1►
    ◄timeout_seconds1200►
    ◄callback_url►

    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_tags and style is enough to generate.
    • prompt - a description of what you want, and it doubles as lyrics only when lyrics is 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 lyrics and prompt are 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. Jazz with 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_consumed and credits_left are 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.

    CategoryKIE Next/Audio/Suno/Music Generation

    Inputs (13)

    NameTypeDefaultDescription
    promptSTRINGA 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.
    titleSTRINGRelaxing PianoMusic title. Required. Will be displayed in the player interface and file name.
    negative_tagsSTRINGheavy metal, strong drum beatsExcluded music styles. Required. Used to avoid including specific styles or elements in the generated music.
    styleSTRINGJazzMusic style. Required. Such as jazz, electronic, classical and other music types.
    upload_urlSTRINGhttps://example.com/music.mp3URL of the uploaded audio file. Required. Source audio (`upload_url`) is enough to generate once `title`, `negative_tags`, and `style` are provided.
    vocal_genderoptCOMBOmVocal 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_weightoptFLOAT0.610–1Adherence strength to specified style. Optional. Range 0–1, up to 2 decimal places.
    weirdness_constraintoptFLOAT0.720–1Controls experimental/creative deviation level. Optional. Range 0–1, up to 2 decimal places.
    audio_weightoptFLOAT0.650–1Relative weight of audio elements. Optional. Range 0–1, up to 2 decimal places.
    lyricsoptSTRING[Verse] Keep the melody flowing Into a gentle bridge [Chorus] Let the piano rise and fallLyrics 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.
    varietyoptINT10–4Controls 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_secondsoptINT120030–7200—
    callback_urloptSTRINGOptional KIE callback URL. Leave empty for normal ComfyUI use.

    Outputs (7)

    NameTypeDescription
    audioAUDIO—
    urlSTRING—
    all_urls_jsonSTRING—
    task_idSTRING—
    raw_jsonSTRING—
    credits_consumedFLOAT—
    credits_leftFLOAT—