arkennemasis fal · Resemble ChatterboxHD Speech to Speech · $0.02/min
Keep the performance, swap the voice
- source_audio
- target_voice_audio
- audio
- audio_path
- info
Chatterbox is the model that made open TTS stop feeling like a compromise - a 0.5B Llama-backbone model, MIT licensed, zero-shot cloning from about five seconds of reference audio, and good enough that when it launched the community's question was whether it had just killed a paid subscription. This node is the other half of Chatterbox: speech to speech. You don't give it text and a voice. You give it a recording, and it re-says it in a different voice.
That distinction matters more than it looks. TTS invents a performance from your punctuation; speech-to-speech inherits one. Pauses, emphasis, the little stumble, the rise at the end of a question - all of that survives, which is exactly what you want when you have a good take and the wrong voice.
Inputs and what they do
source_audio is required - the clip to convert. Feed it a clean single-speaker recording; overlapping voices or a lot of room noise is where conversion gets mushy.
target_voice is a dropdown of the ten built-in voices: Aurora, Blade, Britney, Carl, Cliff, Richard, Rico, Siobhan and Vicky, plus (not set). Leave it unset and the model picks a random target voice, which is fun exactly once.
target_voice_audio is the interesting one: give it a sample of the voice you want and it overrides target_voice entirely. That's local-voice-cloning behaviour, except you're not running a 0.5B model and a clone stack on your own card - you're paying $0.02 per minute of audio to have fal do it. At that rate, a 30-second clip costs a penny.
high_quality_audio is off by default, which means 24 kHz output. Turn it on and you get 48 kHz and a longer wait. For anything that's going to be mixed with music or delivered as a finished track, turn it on; for scratch audio you're going to re-record anyway, don't bother.
Outputs: audio (an AUDIO, ready for the pack's assembly or a Save Audio node), audio_path, and info with the request id, the cost estimate and fal's full response.
The pack's shared controls sit underneath in the optional section: max_cost_usd (default $20), reuse_identical_run, extra_json, max_concurrent.
One thing worth knowing before you use it commercially
Chatterbox ships with built-in perceptual watermarking - Resemble builds it into the family, and the node's own description repeats it. That's a feature, not a bug, but it's the kind of feature you want to know about before a client asks. Voice cloning also inherits every obligation that comes with a person's voice; cloning someone without their permission is a legal problem regardless of which endpoint did the compute.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
pip install httpx
Manager → search arkennemasis. Then in the .env next to run_nvidia_gpu.bat:
FAL_KEY=your-key-from-fal.ai/dashboard/keys
Restart ComfyUI. The audio node appears under arkennemasis/fal/Audio/Chatterbox.
Gotchas
- This is not TTS. If you have words and no recording, this is the wrong node - you want a text-to-speech endpoint. Speech-to-speech needs audio in.
- Random voice if you set nothing. Both
target_voiceandtarget_voice_audioempty means the model picks, so a "why does it sound different every run" complaint is usually an unset dropdown. - Length drives cost. The estimate is per minute of source audio, so trimming silence off the front of a long take is a real saving.
reuse_identical_run(on by default) means an unchanged graph won't re-bill you, which is also why an unchanged graph won't give you a different take. - Everything queues at
max_concurrent: 1, and a failed fal node stops the queue rather than letting the rest spend.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| source_audio | AUDIO | URL to the source audio file to be voice-converted. | |
| target_voice | COMBO | (not set) | The voice to use for the speech-to-speech request. If neither target_voice nor target_voice_audio_url are provided, a random target voice will be used. '(not set)' leaves it to the model. |
| high_quality_audio | BOOLEAN | false | If True, the generated audio will be upscaled to 48kHz. The generation of the audio will take longer, but the quality will be higher. If False, the generated audio will be 24kHz. |
| target_voice_audioopt | AUDIO | URL to the audio file which represents the voice of the output audio. If provided, this will override the target_voice setting. If neither target_voice nor target_voice_audio_url are provided, the default target voice will be used. | |
| 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 (3)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| audio_path | STRING | — |
| info | STRING | JSON: request id, cost estimate, saved files and fal's full answer. |