Protoface ElevenLabs Voice Changer · Voice Changer
Keep the performance, swap the pipes
- audio
- files
- run id
The other half of text-to-speech
Text-to-speech gives you a voice but not a performance. Anyone who has tried to make a TTS line sound urgent, or tired, or like it's cutting someone off, knows the wall: you can nudge stability, you can add pauses with markup, and you still get a read rather than an act.
Voice changing inverts the problem. You record the performance yourself - badly, in a normal voice, on a laptop mic - and the model restyles the timbre while keeping the timing, pauses, emphasis and delivery you performed. The script is not retyped. The words are not regenerated. Your delivery survives; only the voice changes.
That makes this node the interesting one in the ElevenLabs pair. It's part of Protoface, the beta pack that wraps hosted models as ComfyUI nodes, and like everything in it, the work happens on Protoface's servers against your key. No model, no VRAM, no local install beyond the pack.
Why you'd reach for it: narration you can actually direct, dubbing a scratch voice-over into something broadcast-shaped, or turning one good take into three different characters - same take, three voices, three nodes.
How it works
The audio goes to the API as an asset (uploaded, cached by hash, reused if you rerun with the same file), gets restyled by the ElevenLabs voice-conversion model, and comes back as native ComfyUI AUDIO. The shared adapter does the plumbing - validate, upload, submit, poll, download - which is why this node's controls are so thin.
Critically, the model is not transcribing. It doesn't know what you said. If you mumble, it restyles the mumble. That's a feature - pronunciation and accent quirks are yours - and it's the limit: this node will never fix a flubbed line.
The inputs that matter
Three, plus the usual paid-request bookkeeping.
audio is the input, a media input with modes rather than a plain socket. Connect ComfyUI's native audio - Load Audio, or an audio output from another Protoface node. There's also a References mode that takes an existing Protoface asset ID or a reused result asset, which is how you chain a remote job's audio in without re-uploading it.
voice_id is a combo here with Alice as the default - a real dropdown, unlike the pack's text-to-speech node where the same field is free text. Pick from the list.
remove_background_noise is off by default. Turn it on for phone recordings, room tone, laptop fans. Leave it off for clean studio takes - noise removal on a clean source is a good way to get slightly phasey, watery consonants for no reason.
generation_id is the request identity, not a random seed. Leave it fixed and a requeue returns the recorded job instead of buying a new one. Change the audio or the voice and you're making a new request regardless.
Outputs
audio is a native AUDIO list. Feed it to Save Audio, or into anything downstream that consumes audio - the pack's own video nodes take native audio inputs, so "change the voice, then drive a talking clip" is a two-node chain.
files is the original downloaded assets as PROTOFACE_FILE, and run id is your recovery handle for Protoface Resume Run if the job outlives your browser session.
Install
Manager → search Protoface → install protoface-nodes → restart → reload the browser. Manually, from the ComfyUI directory:
git clone --branch v0.1.0 --depth 1 https://github.com/protoface-ai/protoface-comfyui.git custom_nodes/protoface
python -m pip install -r custom_nodes/protoface/requirements.txt
with ComfyUI's own interpreter (python_embeded/python.exe on Windows portable, the Desktop managed env on Desktop), then restart. Requirements are httpx, jsonschema, Pillow and av - PyAV matters here specifically, since it's what handles native audio/video media connections. Then click Protoface in the lower-right corner and enter your key.
Where people get burned
Feeding it a video. The input is audio. If your source is a clip, get the audio out of it first and connect that - don't expect the node to find the speech track itself.
Uploading a batch. Media inputs accept the native input type, and a batch counts toward the model's reference limit. A multi-clip audio batch on a field that expects one asset will error out with a "split the batch first" style message. Queue takes one at a time.
Leaving the key in the browser tab. Interactive keys are held in server memory and deliberately kept out of exported workflows - which is good - but it also means a restart logs you out. Re-enter, or use PROTOFACE_API_KEY_FILE for anything permanent. Keep it out of workflow JSON regardless; the docs say this twice and mean it.
Assuming a cancel is a refund. Interrupting requests cancellation, and cancellation is best effort. Check the run in your account if you killed a long conversion.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | COMBO | A public URL, a data URI, or an asset id. | |
| remove_background_noise | BOOLEAN | false | Remove background noise from the audio |
| voice_id | COMBO | Alice | Voice to apply to the audio |
| generation_id | INT | 00–9007199254740991 | Keep fixed to reuse/resume this paid job. Increment for a fresh paid generation; independent of the model seed. |
| request_scope | STRING | Automatically assigned per node. Headless clients must supply a stable unique workflow/node ID. This is not a secret. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| files | PROTOFACE_FILE | — |
| run id | STRING | — |