Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.getpatter.com/llms.txt

Use this file to discover all available pages before exploring further.

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:
TransportClassUse when
HTTP / RESTElevenLabsTTS (this page)Default. Simpler, more forgiving on flaky networks, supports every model including eleven_v3*.
WebSocketElevenLabsWebSocketTTSYou’re latency-bound on TTS time-to-first-byte and willing to give up eleven_v3 support. Saves ~50 ms per utterance vs REST.
Pick REST unless you’ve measured a per-utterance latency problem and confirmed you don’t need 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:
npm install getpatter

Quickstart

// npx tsx example.ts
import { Patter, Twilio, DeepgramSTT, ElevenLabsTTS } from "getpatter";

const phone = new Patter({ carrier: new Twilio(), phoneNumber: "+15550001234" });

const agent = phone.agent({
  stt: new DeepgramSTT(),                              // DEEPGRAM_API_KEY from env
  tts: new ElevenLabsTTS({ voiceId: "rachel" }),       // ELEVENLABS_API_KEY from env
  systemPrompt: "You are a helpful assistant.",
});

await phone.serve({ agent });

Carrier-tuned factories

For real phone calls always reach for the carrier-specific factories — they pre-set the right outputFormat so the SDK can skip resampling and PCM ↔ μ-law transcoding on the audio path:
import { ElevenLabsTTS } from "getpatter";

// Twilio: ulaw_8000 + speaker_boost off, moderate stability for clean μ-law
const ttsTwilio = ElevenLabsTTS.forTwilio({ voiceId: "rachel" });

// Telnyx: pcm_16000 (matches L16/16000 default Telnyx codec)
const ttsTelnyx = ElevenLabsTTS.forTelnyx({ voiceId: "rachel" });
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".

Constructor

new ElevenLabsTTS({
  apiKey?: string;                   // ELEVENLABS_API_KEY from env when omitted
  voiceId?: string;                  // default "21m00Tcm4TlvDq8ikWAM" (Rachel)
  modelId?: ElevenLabsModel | string;     // default "eleven_flash_v2_5"
  outputFormat?: ElevenLabsOutputFormat;  // default "pcm_16000"
  voiceSettings?: ElevenLabsVoiceSettings;
  languageCode?: string;
  chunkSize?: number;                // default 4096
})

interface ElevenLabsVoiceSettings {
  stability?: number;
  similarity_boost?: number;
  style?: number;
  use_speaker_boost?: boolean;
}
ParameterDefaultDescription
apiKeyenvElevenLabs 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 }.
languageCodeBCP-47 / ISO 639-1 language hint.
chunkSize4096Stream chunk size in bytes.

API surface

// Buffer the full utterance
const audio: Buffer = await tts.synthesize("Hello!");

// Or stream chunks
for await (const chunk of tts.synthesizeStream("Hello!")) {
  forwardToCaller(chunk);
}
synthesizeStream cancels the underlying HTTP stream when the consumer breaks out of the loop, so ElevenLabs stops billing for unconsumed characters.

Models

Model IDNotes
eleven_flash_v2_5 (default)Fastest TTFT (~75 ms). Best for live phone calls.
eleven_turbo_v2_5Balanced quality / speed.
eleven_multilingual_v2Best multilingual support.
eleven_monolingual_v1Legacy English-only.
eleven_v3Newest, highest quality. Slower TTFT. Not supported by the WebSocket variant.
Exposed as a typed as const object for autocomplete:
import { ElevenLabsModel } from "getpatter";

ElevenLabsModel.FLASH_V2_5         // "eleven_flash_v2_5"
ElevenLabsModel.V3                 // "eleven_v3"

Output formats

FormatUse case
pcm_16000 (default)Web playback, dashboard previews, Telnyx L16/16000 carrier path.
ulaw_8000Twilio Media Streams (μ-law @ 8 kHz native).
pcm_8000 / pcm_22050 / pcm_24000 / pcm_44100Other PCM rates.
mp3_22050_32mp3_44100_192MP3 at various bitrates.
import { ElevenLabsOutputFormat } from "getpatter";

ElevenLabsOutputFormat.ULAW_8000   // "ulaw_8000"
ElevenLabsOutputFormat.PCM_16000   // "pcm_16000"

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_50.05
eleven_multilingual_v20.18
eleven_monolingual_v10.18
eleven_v30.30
Pricing is auto-resolved from 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