arkennemasis fal · ElevenLabs Voice Changer · $0.3/min
ElevenLabs Voice Changer in ComfyUI
- audio
- audio
- audio_path
- seed
- info
Voice changing is not text-to-speech, and mixing the two up is why people install this node and then feel let down. TTS takes words and invents a performance. This takes a recording you already like - the pauses, the half-laugh, the way the guy trails off at the end of a sentence - and swaps out who it sounds like. The performance survives. Only the vocal cords change.
That's a genuinely different job, and the wrapper here is ElevenLabs, which the audio knowledge base calls the reliability and language bar for production work: the safe default when a mispronunciation is expensive. It's closed, it's commercial, and it's the thing every open model gets measured against. You pay for that.
What the node does
It's a thin ComfyUI wrapper around fal's fal-ai/elevenlabs/voice-changer endpoint. No local model, no VRAM - your clip gets uploaded to fal's CDN, re-voiced there, and downloaded back into output/fal/fal-ai_elevenlabs_voice-changer/ as something that wires into the rest of your graph like any other audio.
The node bills by the minute of input audio, at the rate in its title: $0.30/min. Before anything is sent, the wrapper measures the clip you've connected and estimates the cost against max_cost_usd. A three-minute take is about ninety cents, which is fine. A one-hour podcast is not.
The inputs that matter
audio- the performance you want kept. Wire it from a LoadAudio node or anything else producing an AUDIO.voice- this is a plain text box, not a dropdown, defaulting toRachel. That's the one to get right. It takes an ElevenLabs voice name or the voice's ID; your own cloned voices generally need the ID, not the friendly name. Leave it empty and you get fal's own default, which is rarely what you meant.remove_background_noise- off by default. This runs ElevenLabs' isolation model over the input first. If your source was recorded on a phone in a room with a fridge in it, turn it on; it's the difference between a usable swap and a muddy one.output_format-mp3_44100_128by default. The list is long and includes rawpcm_*plusulaw/alawtelephony formats. If you're going to cut or blend the result downstream, take apcm_44100; MP3 is fine for delivery.seed--1unless you're chasing a reproducibility bug.
Outputs
audio is the re-voiced clip - send it to SaveAudio, or into the pack's own Voice Dub / Narration Fit nodes if you're building a narrated video. audio_path is the saved file on disk. seed comes back as an INT, and info is a JSON blob with the request id, the cost estimate, saved files and fal's full answer - handy when you want to know what a run actually cost.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
Restart, and the node shows up under the arkennemasis menu. ComfyUI-Manager works too - it's one pack, comfyui-arkennemasis, installable by Git URL. The pack's requirements.txt is a single line, httpx, and that's for its ChatGPT/Codex nodes; the fal side talks over Python's standard library, so this node adds nothing to your environment.
Then put your key in the .env file of your ComfyUI install - in the portable build, the folder holding run_nvidia_gpu.bat:
FAL_KEY=your-key-from-fal.ai/dashboard/keys
The key is read from that file and nowhere else. There's deliberately no key box on the node, so a key can never leak into a workflow you share.
Where people get burned
The voice field being free text is the number one trip. A typo doesn't always produce a loud error; sometimes you just get a delivery in a voice you didn't ask for.
Second: this changes how you sound, not what you said. It won't fix a flubbed line, cut an um, or translate. If you want text read aloud in a cloned voice, that's TTS - the pack ships a local Qwen3-TTS clone node for free, and it's the right tool when you're starting from a script rather than a recording.
Third: reuse_identical_run is on by default, so re-queueing the exact same audio and settings returns the cached file instead of paying again. Great feature, confusing the first time it "accidentally" gives you an identical result. Flip it off for a fresh take. And if a fal call 429s or a gateway blips, the node retries with backoff before you ever see it - max_concurrent stays at 1 by default for exactly that reason.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | The input audio file | |
| voice | STRING | Rachel | The voice to use for speech generation Empty leaves it out. |
| remove_background_noise | BOOLEAN | false | If set, will remove the background noise from your audio input using our audio isolation model. |
| seed | INT | -1-1–2147483647 | Random seed for reproducibility. -1 leaves it to the model. |
| output_format | COMBO | mp3_44100_128 | Output format of the generated audio. Formatted as codec_sample_rate_bitrate. |
| max_cost_usdopt | FLOAT | 20.00–100000 | Safety cap. If the estimated cost of this run is above this many US dollars the node stops BEFORE sending anything to fal. 0 = no cap. |
| reuse_identical_runopt | BOOLEAN | true | If these exact inputs (the settings AND the same pictures/clips/audio) were already paid for and the files are still in output/fal, return them instead of paying again - also after a ComfyUI restart. Turn off for a fresh take with the same settings. |
| extra_jsonopt | STRING | Advanced: a JSON object merged into the request last, for any fal field this node has no box for. Example: {"seed": 7}. Leave empty normally. | |
| max_concurrentopt | INT | 11–32 | How many paid fal calls may run at the same time in one run, across every fal node. 1 (default) = one after another. This node starts its paid part only while fewer than this many fal calls are running. Once any fal node fails, the ones still waiting are not started, so nothing more is billed. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| audio_path | STRING | — |
| seed | INT | — |
| info | STRING | JSON: request id, cost estimate, saved files and fal's full answer. |