ElevenLabs Pro - Text to Speech
The full ElevenLabs TTS front door, minus the jank
- audio
- raw_response_info
This is the node the whole pack is named for, and it's the one you'll reach for when you want ElevenLabs-quality narration inside a ComfyUI graph instead of bouncing between a browser tab and your editor. Text to Speech takes a string, a voice ID, and a model, and returns a decoded AUDIO tensor plus a JSON blob about the call. ElevenLabs' API has every parameter exposed here - which is genuinely rare for a ComfyUI wrapper, most integrations give you five knobs and hide the rest.
The mechanism is straightforward: it POSTs to /v1/text-to-speech/{voice_id} with your voice_settings bundled in, then decodes whatever bytes come back into ComfyUI's AUDIO format (PCM is decoded directly as int16 so it works even without an MP3 decoder; wav/mp3/opus go through soundfile first with a torchaudio fallback). What makes this node worth your time is what it does before the request: it validates text length against the model's limit, and it knows the API's quirks so you don't have to. Pick eleven_turbo_v2_5 or eleven_flash_v2_5 without an explicit language and it stops you before the inevitable 422; eleven_v3 silently forces text normalization to "off" because that's the only value the flagship accepts.
The three inputs you can't skip:
- text - supports v3 expression tags right in the prompt, so
[whispers]or[laughs]actually do something. - voice_id - connect the Voice Selector node's output here (or Fetch Voices / Get Voice By Name).
- model - default
eleven_v3. Character limits differ per model: 5,000 for v3, 10,000 for multilingual v2, up to 40,000 for the flash/turbo lines.
After that, the tuning knobs most people actually set: stability (lower = more expressive, higher = more consistent monotone), similarity_boost (closer to the original voice, but too high introduces artifacts), speed (0.5–2.0), and output_format. The formats list has a gotcha baked into its tooltip: mp3_44100_192 and the opus options require Creator tier or better, so on a free plan they'll fail with a permission error that reads like a mystery until you remember tier limits.
There are also two context-only fields, previous_text and next_text, that are easy to misread. They don't generate audio - they give the model the surrounding text so you can chunk a long script without losing pacing. The tooltips are explicit about this, and it matters: people who skip them end up with per-paragraph reads that don't sound like one continuous narration.
Outputs are audio (wire it to Save Audio, a preview, Audio Concat, or any audio consumer) and raw_response_info, a JSON string with model, voice, format, byte count, and character count - handy for logging or a quick cost check.
Install is the usual clone-and-pip, and it's light:
cd ComfyUI/custom_nodes
git clone https://github.com/IxMxAMAR/ComfyUI-ElevenLabs-Pro.git
pip install -r ComfyUI-ElevenLabs-Pro/requirements.txt
Then restart ComfyUI, or use ComfyUI Manager to install "ComfyUI-ElevenLabs-Pro". Only requests and soundfile in requirements - no models to download, the synthesis happens on ElevenLabs' side. You'll want an API key in the node or the ELEVENLABS_API_KEY env var.
The big gotcha, same as every paid node in this pack: it's billed per character, and it's cached by input hash so identical inputs don't re-bill on re-queue. That cache was the whole point of the v2.1 rewrite - v2.0 re-billed you on every single queue. Change any input and you pay again, so make your text edits before you hit queue, not after.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| api_key | STRING | — | |
| text | STRING | Text to convert to speech. Supports v3 audio tags like [whispers], [laughs], [excited]. | |
| voice_id | STRING | Voice ID. Connect from Voice Selector or Fetch Voices node. | |
| model | COMBO | eleven_v3 | 8 options: eleven_v3, eleven_multilingual_v2, eleven_flash_v2_5, eleven_turbo_v2_5, eleven_flash_v2, eleven_turbo_v2, +2 |
| stabilityopt | FLOAT | 0.500–1 | Voice stability. Lower = more expressive/emotional, Higher = more consistent/monotone. Creative(<0.5), Natural(0.5), Robust(>0.5). |
| similarity_boostopt | FLOAT | 0.750–1 | How closely AI adheres to the original voice. Too high may introduce artifacts. |
| styleopt | FLOAT | 0.000–1 | Style exaggeration. Increases expressiveness but reduces stability. Recommended: 0 for most use cases. |
| speedopt | FLOAT | 1.000.5–2 | Speech speed. 1.0 = normal, <1.0 = slower, >1.0 = faster. |
| use_speaker_boostopt | BOOLEAN | true | Boost similarity to original speaker. Increases latency slightly. |
| languageopt | COMBO | Auto Detect | Language for the model. Auto Detect lets the model decide. NOTE: turbo/flash v2.5 models require an explicit language. |
| apply_text_normalizationopt | COMBO | auto | Text normalization mode. eleven_v3 is auto-forced to 'off' (the only valid value for that model). |
| output_formatopt | COMBO | mp3_44100_128 | Audio output format. mp3_44100_192 and opus require Creator tier+. |
| seedopt | INT | 00–4294967295 | Seed for reproducibility. 0 = random. Determinism not guaranteed. |
| previous_textopt | STRING | Context only — text that came BEFORE this segment. Does NOT generate audio for this text. Used for seamless chunking across long inputs. | |
| next_textopt | STRING | Context only — text that comes AFTER this segment. Does NOT generate audio for this text. Used so the model can anticipate pacing. | |
| use_pvc_as_ivcopt | BOOLEAN | false | Use the IVC version of a Professional Voice Clone. |
| enable_loggingopt | BOOLEAN | true | If False, requests zero-retention mode (audio + text not stored by ElevenLabs). Required for HIPAA / privacy-sensitive content. |
| pronunciation_dictionary_locatorsopt | STRING | JSON array of {"pronunciation_dictionary_id": ..., "version_id": ...} objects. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| raw_response_info | STRING | — |