ElevenLabs Voice Changer
Turn any clip into any voice — at ElevenLabs' per-character price
- audio
- AUDIO
This is the node people mean when they say "voice swap" in ComfyUI. Feed it any AUDIO clip - your voice, a recording, a line ripped from a video - and it re-voices the whole thing in one of your ElevenLabs voices, character by character, through ElevenLabs' speech-to-speech API. The classic pipeline it powers is the video chain: FLUX images → video model → LivePortrait face animation → ElevenLabs speech-to-speech for the voice. That's exactly the setup behind those viral "Abe Lincoln endorses us" clips from a couple of years back, and it's the honest reason the API wins this corner: local TTS has genuinely caught up on cloning (Chatterbox and friends are real now), but the reliability bar for clean, multilingual voice output is still ElevenLabs, per the modidex audio notes.
The name is worth one correction: this isn't a model. There's no checkpoint download, no VRAM hit, no inference on your GPU. It's a thin client that records what you say, ships the WAV to api.elevenlabs.io/v1/speech-to-speech/{voice_id}, and decodes the MP3 that comes back into a ComfyUI AUDIO dict. Your machine does the plumbing; ElevenLabs' servers do the singing. That means it needs three things: an API key, an internet connection, and a wallet.
The inputs that matter
The audio input takes a ComfyUI AUDIO dict - wire it from any VHS, Audio Loader, or TTS node output. voice is a dropdown fetched live from your ElevenLabs account (cached for an hour), so it lists your actual voices by name. model gives you the two speech-to-speech models: eleven_english_sts_v2 and eleven_multilingual_sts_v2. Pick the English one for speed, the multilingual one if your source audio is not English.
Then the three dials that actually shape the output:
- stability (default 0.5) - higher = steadier, less expressive delivery.
- similarity_boost (default 0.8) - how hard it clings to the target voice's timbre. Crank it if the result sounds off-voice.
- style (default 0) - expressiveness/liveliness; 0 is neutral, 1 is theatrical.
speed (0.25–4.0, default 1.0) plays back faster or slower, and remove_background_noise is a toggle that runs ElevenLabs' own denoiser on your input before conversion - leave it on for recordings made on a phone or laptop mic, off for clean studio audio. use_speaker_boost (default on) is the API's loudness normalizer; there's rarely a reason to turn it off. The optional seed (0 = unset) is for reproducible generations, and output_format trades bitrate for file size - the default mp3_44100_128 is fine.
The single output is an AUDIO dict (waveform tensor + sample_rate) - same shape it expects on the way in, so you can chain it to a save node, a preview, or straight into lip-sync.
Installation and setup
Grab it with ComfyUI Manager (search "ComfyUI-ElevenLabs") or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/jerilseb/ComfyUI-ElevenLabs
cd ComfyUI-ElevenLabs
pip install -r requirements.txt
Then restart ComfyUI. Dependencies are light - requests, numpy, pydub, torch - no models to fetch. One gotcha the README hides: it lists requests, torch, numpy, but the code also imports pydub to decode the MP3 responses. If pip's already got it from some other pack you're fine; if not, the node silently degrades. Install pydub (plus ffmpeg, which pydub shells out to) to be safe.
The real setup is the key. The node reads ELEVENLABS_API_KEY from your environment - there is no key field in the UI:
export ELEVENLABS_API_KEY=your_key
Then restart ComfyUI so it picks up the new environment. On Windows, set it in System Environment Variables instead of a shell session, or ComfyUI won't see it.
Where people get burned
The silent-failure trap. Every error path - missing key, dead request, decode failure - returns a one-sample silent placeholder waveform and logs the error to the console. So a "successful" run with no sound doesn't mean you generated silence; it means the node gave up and kept the graph moving. When you get a quiet result, read the ComfyUI console, don't rerun it. A missing key also makes the voice dropdown show literally missing_api_key, which is the clue before you even run.
The bill. Speech-to-speech is billed per character of output, and unlike the TTS node you can't preview a short line first - the whole clip converts at once. A 30-second clip on a paid tier can cost a few cents per run; iterate on the settings dials, not on whole-clip re-runs, or your month disappears in a hurry.
Subscription gating. Some voices and both STS models need a paid ElevenLabs tier. If the API returns a 4xx for a voice that shows up fine in the dropdown, that's usually a plan limit, not a bug. And because this is a small, single-author pack, don't expect it to track every API change - if ElevenLabs breaks something, check for a pack update first.
It's a paid convenience in a stack that's otherwise free and local, but for clean, reliable voice replacement inside a ComfyUI workflow, there isn't an open-weight node that matches it yet.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | — | |
| voice | COMBO | 1 options: missing_api_key | |
| model | COMBO | 2 options: eleven_english_sts_v2, eleven_multilingual_sts_v2 | |
| stability | FLOAT | 0.50–1 | — |
| similarity_boost | FLOAT | 0.80–1 | — |
| style | FLOAT | 0.00–1 | — |
| speed | FLOAT | 1.000.25–4 | — |
| use_speaker_boost | BOOLEAN | true | — |
| remove_background_noise | BOOLEAN | false | — |
| seedopt | INT | 00–4294967295 | — |
| output_formatopt | COMBO | 5 options: mp3_44100_128, mp3_44100_96, mp3_44100_64, mp3_24000_48, mp3_22050_32 |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| AUDIO | AUDIO | — |