Nodes/KIE.ai Nodes Next/elevenlabs/text-to-dialogue-v3
ComfyUI Node

elevenlabs/text-to-dialogue-v3

ElevenLabs text-to-dialogue-v3 in ComfyUI

By felipederosilva·Created about a month ago·Updated a day ago· 3
elevenlabs/text-to-dialogue-v3
    • audio
    • url
    • all_urls_json
    • task_id
    • raw_json
    • credits_consumed
    • credits_left
    ◄dialogue[ { "text": "I have a pen, I have an apple, ah, Apple pen~", "voice": "EkK5I93UQWFDigLMpZcX" }, { "text": "a happy dog", "voice": "Z3R5wn05IrDiVCyEkUrK" }, { "text": "a happy cat", "voice": "NNl6r8mD7vthiJatiJt1" } ]►
    ◄stability0.5►
    ◄language_codeaf►
    ◄timeout_seconds1200►
    ◄callback_url►

    Most local text-to-speech gets you one voice and a paragraph. A conversation between two characters is the thing you actually want for a two-hander shot, and doing it locally means either two TTS passes glued together in an audio editor, or a multi-speaker model like VibeVoice that wants a real chunk of VRAM. This node is the third option: one call, one audio file, as many voices as you have lines.

    ElevenLabs is the bar the whole open TTS scene measures itself against - the KB's audio doc calls it "the reliability and language bar," and it's still the safe default when a mispronunciation costs you a reshoot. Dialogue v3 is the model that does speaker switching inside a single generation, which is a different job from the single-voice nodes sitting next to it in the same folder.

    How it works

    The node is one socket of documentation-driven plumbing. It builds a request for KIE's elevenlabs/text-to-dialogue-v3 model, posts it to KIE's task endpoint, then polls for the finished job (roughly every 2.5s, backing off, up to timeout_seconds) and downloads the result. The MP3 comes back decoded through torchaudio into ComfyUI's standard AUDIO dict, which is why you can wire it straight into Save Audio, a preview node, or an audio-driven video model.

    The interesting part is the shape of the request. Dialogue is an array of turns, not a script you split up - so each line carries its own voice, and the model keeps the pacing between them.

    The inputs that matter

    dialogue is the whole node, and it's a JSON widget, not a form. Each item takes text and voice:

    [
      {"text": "You brought the wrong schematic.", "voice": "EkK5I93UQWFDigLMpZcX"},
      {"text": "I brought a schematic. Just not yours.", "voice": "NNl6r8mD7vthiJatiJt1"}
    ]
    

    Total characters across every text field must stay under 5000. Miss a comma and the node fails with a JSON error before it spends anything, which is the cheap way to be wrong.

    stability is a three-position dropdown - 0, 0.5, 1 - not a slider, which trips people who are used to the multilingual node next door where it's a free 0–1 float. Leave it at 0.5 unless you have a reason.

    The one to actually check is language_code. Its tooltip says an empty value means automatic detection, but the widget ships with af selected, which is Afrikaans. If your dialogue comes back with an accent you didn't ask for, that dropdown is why. Set it to the language you wrote in.

    timeout_seconds (default 1200) and callback_url (leave empty) are housekeeping.

    Outputs

    audio is the payload - that's the one you wire. Alongside it you get url for the hosted file, all_urls_json if the provider ever returns more than one asset, task_id if you need to chase the job, raw_json for debugging, and credits_consumed / credits_left as floats. The pack also prints credits spent and remaining onto the node itself after a run.

    Install

    ComfyUI Manager, search "KIE.ai Nodes Next", or manually:

    cd ComfyUI/custom_nodes
    git clone https://github.com/felipederosilva/ComfyUI-KIE-Nodes-Next
    

    Restart ComfyUI. Dependencies are requests, Pillow, numpy and PyYAML - no model download, nothing heavy. Then paste your KIE key once in Settings → KIE.ai Nodes Next → Connection; it's validated against KIE before it replaces anything, stored outside your workflows, and KIE_API_KEY in the environment still wins for headless boxes.

    Where people get burned

    • It's metered, per call. Every run costs credits, and the node shows you the receipt. Draft with one short exchange first, then run the full scene.
    • Voice is a fixed dropdown of 68 presets. A cloned voice ID from your own ElevenLabs account isn't in that list, and there's no free-text field here - this node uses KIE's preset roster.
    • No voice preview in the UI. The tooltip gives you the pattern: open https://static.aiquickdraw.com/elevenlabs/voice/<voice_id>.mp3 in a browser to hear a voice before you spend on it.
    • KIE's catalog moves. Model endpoints appear and disappear on the vendor's side; the pack re-syncs its node list from KIE's docs, so if a node starts erroring, run the catalog refresh node or restart before you assume you broke something.
    CategoryKIE Next/Audio/ElevenLabs/Dialogue

    Inputs (5)

    NameTypeDefaultDescription
    dialogueSTRING[ { "text": "I have a pen, I have an apple, ah, Apple pen~", "voice": "EkK5I93UQWFDigLMpZcX" }, { "text": "a happy dog", "voice": "Z3R5wn05IrDiVCyEkUrK" }, { "text": "a happy cat", "voice": "NNl6r8mD7vthiJatiJt1" } ]Array of dialogue items. Each item contains text and voice. The total character count of all text fields combined must not exceed 5000 characters.
    stabilityoptCOMBO0.5Voice stability parameter. Must be one of the following values: 0.0, 0.5, or 1.0
    language_codeoptCOMBOafLanguage code for the speech. Default is empty string or omit the parameter for automatic language detection.
    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—