Nodes/KIE.ai Nodes Next/Upload And Cover Audio · V6
ComfyUI Node

Upload And Cover Audio · V6

Covers on the live Suno tier

By felipederosilva·Created about a month ago·Updated about 22 hours ago· 3
Upload And Cover Audio · V6
    • audio
    • url
    • all_urls_json
    • task_id
    • raw_json
    • credits_consumed
    • credits_left
    ◄upload_urlhttps://storage.example.com/upload►
    ◄promptA calm and relaxing piano track with soft melodies►
    ◄instrumentaltrue►
    ◄styleClassical►
    ◄titlePeaceful Piano Meditation►
    ◄negative_tagsHeavy Metal, Upbeat Drums►
    ◄vocal_genderm►
    ◄style_weight0.65►
    ◄weirdness_constraint0.65►
    ◄audio_weight0.65►
    ◄persona_idpersona_123►
    ◄persona_modelstyle_persona►
    ◄lyrics[Verse] Keep the melody flowing Into a gentle bridge [Chorus] Let the piano rise and fall►
    ◄variety1►
    ◄duration20►
    ◄timeout_seconds1200►
    ◄callback_url►

    Hand it a track, tell it a style, get a cover back. This is Suno's cover endpoint on V6 - the current tier - and it's the node to use for any new cover work now that KIE's docs list V5 and V5.5 as discontinued.

    Why go to an API at all for this? Because covering a song is mostly a vocal job, and vocals are where the local stack thins out. ACE-Step, the open answer to Suno, is competitive on instrumental music and consistently weaker once lyrics and singing are involved. For a cover, the singing is the entire point, so you pay per call and send the source audio off your machine. For one or two covers, fine. For a weekly series, check what a local pipeline gets you first.

    How it works

    The pack generates one node class per documented model version from KIE's official API documentation at startup, so the tier is baked into the class - V6 here, no dropdown. The node builds the documented request body, submits it to KIE's task endpoint (envelope model ai-music-api/upload-and-cover-audio, inner model V6), polls KIE's record-info endpoint every couple of seconds with backoff until the task completes, then downloads the resulting audio and returns a ComfyUI AUDIO. Failed tasks raise with the task id and the provider's message instead of returning nothing.

    The inputs that matter

    Three required:

    • upload_url - the source track, as a URL KIE can reach. The docs ask that source audio stay under 8 minutes and say the source alone is enough to produce a result.
    • prompt - and here's the detail people miss: it's used as lyrics only when lyrics is empty. Fill in lyrics and the prompt stops being lyrics entirely. When instrumental is true, don't pass it at all.
    • instrumental - defaults to true, meaning no vocals. That's the opposite of what most people expect from a cover node, so flip it when you want a sung result.

    Then: style (up to 1000 characters on this tier), title (80 characters), negative_tags, vocal_gender (m/f; docs concede it only shifts the odds), style_weight, weirdness_constraint, audio_weight, lyrics (5000-character cap, takes priority over prompt), variety (0–4), duration (10–360 seconds, valid on this tier), persona_id and persona_model, plus timeout_seconds (1200) and callback_url.

    A small honesty note on persona_model: its tooltip on this node says persona models are only available for "models version 5 and 5.5", which reads like documentation lag rather than a rule - persona IDs come from KIE's persona endpoints and the docs scope them across V5, V5.5 and V6. If personas matter to your workflow, A/B one call before building around it.

    Outputs: audio, url, all_urls_json (the response includes both the source and generated URLs - the full set lives here), task_id, raw_json, credits_consumed, credits_left.

    Feeding it a track

    upload_url is a string widget, so an AUDIO cable won't attach. Add KIE • Upload Audio from KIE Next/Utility/Media, wire your audio into it, then right-click upload_url on this node, choose Convert widget to input, and connect the returned URL. From then on the graph is self-contained: local generate → upload → cover → downstream.

    Installing

    ComfyUI Manager, search "KIE Nodes Next"; the README still frames registry publication as prepared rather than live, so if nothing shows up there, install by hand:

    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 set the key once at Settings → KIE.ai Nodes Next → Connection. It's validated before overwriting a working key, only a masked fingerprint reaches the UI, and the app itself never writes the key into your workflow JSON. KIE_API_KEY beats the saved key for headless installs. Dependencies: requests, Pillow, numpy, PyYAML.

    Where people get burned

    • Instrumental defaults on. Fill in lyrics, get karaoke - that's the default, not a bug.
    • Prompt-vs-lyrics precedence. lyrics wins. If your words aren't being sung, look there.
    • Local file paths as upload_url - KIE has to fetch it. Upload first.
    • No key configured produces an explicit error naming the settings path.
    • Mixed-release installs are refused at startup. If version and generated-node build disagree, delete the folder and reinstall.
    • Cost of iteration. Every retry is a metered call; credits_consumed is printed on the node so you can see it.
    • Rights are your problem. Covering a song you don't own is a licensing question the moment you publish it, and the node has no opinion.

    Sequencing that works: nail the cover first, listen to it on its own, and only then feed its audio output into a video or mixing chain. Debugging the song and the picture at the same time just makes both look broken.

    CategoryKIE Next/Audio/Suno/Music Generation

    Inputs (17)

    NameTypeDefaultDescription
    upload_urlSTRINGhttps://storage.example.com/uploadThe URL of the source audio file to cover. Required. Source audio (`upload_url`) is enough to generate. Ensure the uploaded audio does not exceed 8 minutes in length.
    promptSTRINGA calm and relaxing piano track with soft melodiesLyrics for the covered 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. - Not required. Source audio (`upload_url`) is enough to generate. - Do not pass this parameter when `instrumental` is `true`.
    instrumentalBOOLEANtrueDetermines if the audio should be instrumental (no lyrics). - If `true`: generate instrumental music (no vocals). Do not pass `lyrics`, `prompt`, or `vocal_gender`. - If `false`: use `lyrics` as lyrics (fall back to `prompt` if `lyrics` is not provided).
    styleoptSTRINGClassicalThe music style or genre for the audio. Optional. - Not required. Source audio (`upload_url`) is enough to generate. - Character limits by model: - **V4**(Discontinued): Maximum 200 characters - **V4_5 & V4_5PLUS**(Discontinued): Maximum 1000 characters - **V4_5ALL**(Discontinued): Maximum 1000 characters - **V5_5 & V5**(Discontinued): Maximum 1000 characters - **V6, V6_MINI, and V6_WILD**: Maximum 1000 characters
    titleoptSTRINGPeaceful Piano MeditationThe title of the generated music track. Optional. - Maximum 80 characters. - Displayed in player interfaces and filenames.
    negative_tagsoptSTRINGHeavy Metal, Upbeat DrumsMusic styles or traits to exclude from the generated audio. - Optional. Use to avoid specific styles. Example: "Heavy Metal, Upbeat Drums"
    vocal_genderoptCOMBOmVocal gender preference for the singing voice. Optional. Use 'm' for male and 'f' for female. Based on practice, this parameter can only increase the probability but cannot guarantee adherence to male/female voice instructions. Do not pass this parameter when `instrumental` is `true`.
    style_weightoptFLOAT0.650–1Strength of adherence to the specified style. Optional. Range 0–1, up to 2 decimal places.
    weirdness_constraintoptFLOAT0.650–1Controls experimental/creative deviation. Optional. Range 0–1, up to 2 decimal places.
    audio_weightoptFLOAT0.650–1Balance weight for audio features vs. other factors. Optional. Range 0–1, up to 2 decimal places.
    persona_idoptSTRINGpersona_123Persona ID or Voice ID to apply to the generated music. Optional. Use this to apply a specific persona style to your music generation. To generate a Persona ID, use the [Generate Persona](https://docs.kie.ai/suno-api/generate-persona) endpoint to create a personalized music Persona based on generated music. To generate a Voice ID, use the [Generate Voice](https://docs.kie.ai/suno-api/suno-voice-generate) endpoint.
    persona_modeloptCOMBOstyle_personaThe persona model is only available for models version 5 and 5.5.
    lyricsoptSTRING[Verse] Keep the melody flowing Into a gentle bridge [Chorus] Let the piano rise and fallLyrics for the covered 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. - Do not pass this parameter when `instrumental` is `true`.
    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
    durationoptINT2010–360Audio duration in seconds. Optional. Range 10–360, default 20. Valid when `model` is ~~V5_5~~ (Discontinued), V6, V6_MINI, or V6_WILD.
    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—