ElevenLabs Pro - Voice Remix
Keep the Voice, Change the Person It Sounds Like
- preview_audio
- generated_voice_id
- all_voice_ids
Voice Design invents a voice from a description. Voice Remix takes a voice you already have and edits it. Same outputs, different starting point: one text field describing the changes, and you get three previews of the result.
That's the whole node. It's the least glamorous thing in the pack and probably the one you'll actually use, because "I like this voice but I need it older and slightly British" is a normal problem and re-cloning from scratch is not a solution to it.
Why you'd reach for it
Cloning a specific voice got easy - the open models closed most of that gap, and Chatterbox in particular made local cloning genuinely good. What cloning doesn't give you is variants. If you cloned one narrator and your project has five characters, you don't want five more clones; you want five remixes of one voice with different ages, weights and accents, so the cast sounds related the way a real cast does. A remix also returns three takes of the same description, so you can hear the range before committing to anything permanent - and the seed is real, meaning a character you can build a series around rather than one happy accident.
This is a preview machine, not a voice factory. Nothing lands in your ElevenLabs library until you run the pack's Voice Create node and tell it to actually save.
How it works
The node POSTs to /v1/text-to-voice/{voice_id}/remix with your voice_description and the preview settings. ElevenLabs returns a previews array; each entry carries a generated_voice_id and base64 audio. The node picks the one at preview_index (clamped to the valid range), decodes its audio as MP3 into a ComfyUI AUDIO, returns that preview's ID as generated_voice_id, and newline-joins every preview's ID into all_voice_ids. If a preview comes back with no audio you get a second of silence instead of a crash - useful to know so you don't mistake silence for a broken node.
One detail from the source that explains a lot of confusion: the API requires 100–1000 characters of sample text, and anything shorter is replaced by auto-generated text. So if you leave text at its default - "Hello! This is a preview of the remixed voice." - the node quietly sets auto_generate_text and your sample sentence is never spoken. Same thing happens if you type a short line yourself and wonder why it isn't what you hear.
Inputs
Required:
api_key- your key, or leave it blank and setELEVENLABS_API_KEY. The field is password-masked.voice_id- the voice you're remixing. Get it fromVoice Selector,Fetch Voices, orGet Voice By Namein the same pack. An empty ID raises an error immediately.voice_description- 5–1000 characters, and this is the actual work. Describe the change, not the voice: "same voice but older, lower, slower, with a gravelly edge and a faint Scottish accent." Vague descriptions get generic results, which is true of every text-conditioned model ever built.text- the sample line the preview speaks. 100–1000 characters to be used as written; shorter is swapped for generated text.
Optional, and mostly worth leaving alone at first: preview_index (0–2) picks which preview lands on preview_audio; auto_generate_text derives the sample line from the description; loudness defaults to 0.5 where 0 is roughly −24 LUFS; guidance_scale defaults to 2 and the tooltip is blunt that high values sound robotic - push it up if the change isn't landing, back off when it starts sounding processed; seed at 0 is random, anything else reproduces the same voice with identical inputs.
Outputs
preview_audio is the AUDIO for the preview you selected - audition it, or send it through Save Audio. generated_voice_id is the handle for that preview and it's what you wire into Voice Create when you decide to keep it. all_voice_ids is every preview's ID, newline-separated, so you can pick a different one by hand without re-running the call.
Saving is a separate, deliberate step: Voice Create needs a voice_description of 20–1000 characters and create=True. The default is a dry run - the pack's fix for a v2.0 bug that burned a voice slot on every queue prompt, and the right default.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/IxMxAMAR/ComfyUI-ElevenLabs-Pro.git
pip install -r ComfyUI-ElevenLabs-Pro/requirements.txt
Restart, and the node appears under ElevenLabs Pro/Voice. Dependencies are just requests and soundfile - no model downloads. ComfyUI Manager users can search "ElevenLabs Pro" instead.
Common issues
"voice_id is required." / "Voice description is required." Both are checked before the request, so these cost you nothing.
The preview doesn't say what you typed. Almost certainly the 100-character minimum - your text was too short and got replaced. Type a full paragraph, or set auto_generate_text on purpose.
The remix barely changed, or sounds metallic. Too vague a description or too low a guidance_scale in the first case, too high in the second. Describe the change as a physical instruction to a voice actor, then nudge guidance up in halves until it lands.
Nothing runs. Not an output node - a dangling preview_audio output means the branch never executes and you'll never see the credits move. Wire it to Save Audio.
One caveat on the whole pack. This is third-party Python holding your API key and calling the network on purpose - the category that produced ComfyUI_LLMVISION. This one audits well (keys scrubbed from errors, a 500 MB download cap) and it's MIT and small enough to read. Still: it's your key, and ComfyUI has no sandbox.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| api_key | STRING | — | |
| voice_id | STRING | Voice ID of the voice to remix. | |
| voice_description | STRING | Describe the changes to make to the voice. 5-1000 characters. | |
| text | STRING | Hello! This is a preview of the remixed voice. | Sample text, 100-1000 characters. Shorter text is replaced by auto-generated sample text. |
| preview_indexopt | INT | 00–2 | Which of the previews to expose on preview_audio output (0..2). |
| auto_generate_textopt | BOOLEAN | false | Generate the sample text from the voice description instead of using `text`. |
| loudnessopt | FLOAT | 0.50-1–1 | Volume of the generated voice. -1 = quietest, 1 = loudest, 0 is roughly -24 LUFS. |
| guidance_scaleopt | FLOAT | 2.00–100 | How closely the remix follows the description. High values can sound robotic. |
| seedopt | INT | 00–2147483647 | Same seed with the same inputs produces the same voice. 0 = random. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| preview_audio | AUDIO | — |
| generated_voice_id | STRING | — |
| all_voice_ids | STRING | — |