ElevenLabs TTS (REST)
ElevenLabsTTS is the default ElevenLabs TTS adapter. It streams audio chunks over the HTTP /v1/text-to-speech/{voiceId}/stream endpoint and exposes the same synthesize / synthesizeStream shape as the rest of Patter’s TTS providers.
REST vs WebSocket — when to use which
ElevenLabs ships two streaming transports. Patter wraps both:| Transport | Class | Use when |
|---|---|---|
| HTTP / REST | ElevenLabsTTS (this page) | Default. Simpler, more forgiving on flaky networks, supports every model including eleven_v3*. |
| WebSocket | ElevenLabsWebSocketTTS | You’re latency-bound on TTS time-to-first-byte and willing to give up eleven_v3 support. Saves ~50 ms per utterance vs REST. |
eleven_v3. The REST adapter is the canonical choice and gets every new ElevenLabs model on day one.
Install
ElevenLabsTTS ships in the core getpatter package — no extras needed:
Quickstart
Carrier-tuned factories
For real phone calls always reach for the carrier-specific factories — they pre-set the rightoutputFormat so the SDK can skip resampling and PCM ↔ μ-law transcoding on the audio path:
forTwilio saves ~30–80 ms first-byte plus per-frame CPU and removes a potential aliasing source. If your Telnyx profile is pinned to PCMU/8000 instead, construct directly with outputFormat: "ulaw_8000".
Carrier auto-detect — setTelephonyCarrier
When you don’t know the carrier at construction time, StreamHandler calls setTelephonyCarrier(carrier) at call start to advise the provider of the wire format:
outputFormat was passed explicitly to the constructor (or via forTwilio / forTelnyx), setTelephonyCarrier is a no-op — the user’s choice always wins. Calling with an unknown carrier ("" / "custom") is also a no-op.
Constructor
| Parameter | Default | Description |
|---|---|---|
apiKey | env | ElevenLabs API key. |
voiceId | "21m00Tcm4TlvDq8ikWAM" (Rachel) | Voice ID or curated display name ("rachel", "alloy", …). |
modelId | "eleven_flash_v2_5" | See Models. |
outputFormat | "pcm_16000" | See Output formats. |
voiceSettings | — | { stability, similarity_boost, style, use_speaker_boost }. |
languageCode | — | BCP-47 / ISO 639-1 language hint. |
chunkSize | 4096 | Stream chunk size in bytes. |
API surface
synthesizeStream cancels the underlying HTTP stream when the consumer breaks out of the loop, so ElevenLabs stops billing for unconsumed characters.
Models
| Model ID | Notes |
|---|---|
eleven_flash_v2_5 (default) | Fastest TTFT (~75 ms). Best for live phone calls. |
eleven_turbo_v2_5 | Balanced quality / speed. |
eleven_multilingual_v2 | Best multilingual support. |
eleven_monolingual_v1 | Legacy English-only. |
eleven_v3 | Newest, highest quality. Slower TTFT. Not supported by the WebSocket variant. |
as const object for autocomplete:
Output formats
| Format | Use case |
|---|---|
pcm_16000 (default) | Web playback, dashboard previews, Telnyx L16/16000 carrier path. |
ulaw_8000 | Twilio Media Streams (μ-law @ 8 kHz native). |
pcm_8000 / pcm_22050 / pcm_24000 / pcm_44100 | Other PCM rates. |
mp3_22050_32 … mp3_44100_192 | MP3 at various bitrates. |
Voice ID resolution
Pass either an opaque 20-char ElevenLabs voice ID ("21m00Tcm4TlvDq8ikWAM") or a curated display name. The SDK ships a built-in name → ID map for common voices ("rachel", "bella", "matilda", etc.) plus an "alloy" alias for cross-provider portability with OpenAI naming. Unknown strings are passed through unchanged so custom voices keep working.
Pricing
| Model | $/1k chars |
|---|---|
eleven_flash_v2_5 (default) | 0.06 |
eleven_turbo_v2_5 | 0.05 |
eleven_multilingual_v2 | 0.18 |
eleven_monolingual_v1 | 0.18 |
eleven_v3 | 0.30 |
DEFAULT_PRICING per model — no override needed unless you’re on a custom ElevenLabs plan. See Metrics for how to register custom rates.
See also
- TTS overview — provider table and shared concepts.
ElevenLabsWebSocketTTS— opt-in low-latency WebSocket variant.ElevenLabsConvAI— managed-agent engine using ElevenLabs end-to-end.

