ElevenlabsTextToSpeech
Give your ComfyUI video a real voice (you'll need an ElevenLabs key)
- audio
You've got the animated face, the looped motion, the perfectly framed shots - and the whole thing is silent. This node is the "make it talk" step: drop a line of text in, and it returns an audio tensor you can feed straight into a lipsync node or save alongside your video. No local TTS model, no download, no VRAM cost. It's a thin wrapper around the ElevenLabs text-to-speech API, which means the actual voice work happens in someone else's cloud and you pay for it in API credits.
What it actually does
Under the hood it's simple: it takes your text, voice, and voice-settings, calls ElevenLabs' text_to_speech.convert, streams the returned MP3 bytes into a temp file, decodes them with soundfile to float32, averages stereo down to mono, reshapes to a [1, 1, samples] tensor, and hands you the standard ComfyUI audio dict: {"waveform": tensor, "sample_rate": 44100}. Every execution is a fresh API call - there's no caching. Rerun the graph and you spend credits again. That's the one thing beginners consistently forget: this isn't a local generator, it's a billing meter with a nice UI.
The inputs that matter
The required set is small: text (multiline, what gets spoken), api_key (your ElevenLabs key), voice_id (the ID string from any voice in your ElevenLabs library - grab it from the voice's URL or your account), and model_id. The model dropdown is already populated: eleven_multilingual_v2 is the sensible default (good quality, ~29 languages), and eleven_turbo_v2_5 / eleven_flash_v2_5 exist if you care more about latency than polish. The eleven_*_sts_v2 entries are the style-transfer voices - worth ignoring until you know you need them.
The voice settings are where the personality comes from, and they're all floats you can leave alone at first:
- stability (0–1, default 0.5): emotional range and variation. Low = more energy and wobble, high = flat and steady.
- similarity_boost (0–1, default 0.8): how closely the output matches the original voice. Crank it for cloned voices; back it off if it sounds uncanny.
- style (default 0), speed (0.5–2, default 1), use_speaker_boost (default on): all self-explanatory.
Two quiet traps. First, seed is a string input, not a number - and it's only sent to the API if it's non-empty, so leave it blank unless you're hunting reproducible takes. Second, the README lists an output_format input, but the shipped code hardcodes mp3_44100_128. Don't go hunting for that field in the node; you get 44.1 kHz mono, period. apply_text_normalization (auto/on/off) just controls whether the API expands things like "vs." and numbers before speaking.
Where the output goes
The single output is audio (type AUDIO). That dict format is what lipsync-style nodes expect - EchoMimic, Live Portrait lipsync and friends take it as the "talking audio" - and it also plugs straight into VHS (VideoHelperSuite) audio nodes if you want to save the video with the voice burned in. Typical flow: text → this node → lipsync node → video out, with the same audio going to a save node.
Installing it
ComfyUI Manager is the easy route: search "ElevenLabs" and install the pack. Or the manual way:
cd ComfyUI/custom_nodes
git clone https://github.com/sysL-padawan/comfyui-elevenlabs-integration.git
cd comfyui-elevenlabs-integration
pip install -r requirements.txt
Then restart ComfyUI. The dependencies are genuinely light - just elevenlabs and soundfile - and there are no model files to download anywhere. The heavy lifting all happens server-side.
Issues and gotchas
Because the pack is a thin API wrapper, almost nothing can go wrong locally. The failures you'll actually see are: an invalid or unfunded API key (ElevenLabs returns an auth error and the node fails), no network, or missing soundfile if you skipped the pip step. The silent killer is cost - if you leave this node in a graph you re-run a lot, each queue run is a fresh API charge. Tuck the API key in properly, don't leave it in a workflow you share (it's plaintext in the saved JSON), and you're fine. It's an obscure, zero-reputation pack that does one thing, but that one thing it does cleanly.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | text to speech | — |
| api_key | STRING | — | |
| voice_id | STRING | — | |
| model_id | COMBO | eleven_multilingual_v2 | 9 options: eleven_multilingual_v2, eleven_flash_v2_5, eleven_turbo_v2_5, eleven_turbo_v2, eleven_flash_v2, eleven_english_sts_v2, +3 |
| seedopt | STRING | — | |
| apply_text_normalizationopt | COMBO | auto | 3 options: auto, on, off |
| voice_settings_stabilityopt | FLOAT | 0.500–1 | — |
| voice_settings_use_speaker_boostopt | BOOLEAN | true | — |
| voice_settings_similarity_boostopt | FLOAT | 0.800–1 | — |
| voice_settings_styleopt | FLOAT | 0.000–1 | — |
| voice_settings_speedopt | FLOAT | 1.000.5–2 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |