> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.jambonz.org/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.jambonz.org/_mcp/server.

# ElevenLabs

ElevenLabs tuning is passed in `synthesizer.options`. Most of it lives under a nested `voice_settings` object, matching ElevenLabs' own API.

```json
{
  "verb": "say",
  "text": "Thanks for calling, how can I help you today?",
  "synthesizer": {
    "vendor": "elevenlabs",
    "language": "en",
    "voice": "21m00Tcm4TlvDq8ikWAM",
    "options": {
      "optimize_streaming_latency": 3,
      "voice_settings": {
        "stability": 0.5,
        "similarity_boost": 0.5,
        "use_speaker_boost": true
      }
    }
  }
}
```

## Options

**`optimize_streaming_latency`** `number`

Latency optimisation level. Defaults to `3`. Higher values reduce time-to-first-audio, trading off some quality — `0` disables the optimisation entirely.

---

**`pronunciation_dictionary_locators`** `array`

Pronunciation dictionaries to apply, in ElevenLabs' locator form.

---

### voice_settings

**`voice_settings.stability`** `number`

`0.0` – `1.0`, defaults to `0.5`. Lower values make delivery more varied and expressive; higher values make it more consistent and monotone.

---

**`voice_settings.similarity_boost`** `number`

`0.0` – `1.0`, defaults to `0.5`. How closely the output tracks the original voice.

---

**`voice_settings.style`** `number`

Style exaggeration. Raising it increases expressiveness but costs latency, and can destabilise the voice at high values.

---

**`voice_settings.use_speaker_boost`** `boolean`

Defaults to `true`. Improves similarity to the original speaker at a small latency cost.

---

**`voice_settings.speed`** `number`

Speaking rate.

---

> **Note**
>
> `stability` and `style` pull against each other. If you raise `style` for expressiveness and the voice starts to wander or produce artifacts, raise `stability` rather than lowering `style` back down.

## Streaming

ElevenLabs supports [TTS streaming](/guides/features/tts-streaming) with word-level alignment. It has no cancel message, so barge-in is handled by dropping and re-establishing the connection.

## Eleven v3, v4 and audio tags

The Eleven v3 and v4 models (`eleven_v3`, `eleven_v3_conversational`, `eleven_v4` and `eleven_v4_turbo`) support inline audio tags such as `[laughs]`, `[whispers]`, `[excited]` and `[sighs]`. Write them in square brackets in the text, and the voice performs them instead of reading them out.

Select the model with `model_id` in `synthesizer.options`, or set it as the default model on the ElevenLabs speech credential. Nothing else changes: you use the same vendor, credential and voices as for the other ElevenLabs models.

```json
{
  "verb": "say",
  "text": "[laughs] Oh, that is the funniest thing I have heard all day.",
  "stream": true,
  "synthesizer": {
    "vendor": "elevenlabs",
    "voice": "JBFqnCBsd6RMkjVDRZzb",
    "options": {
      "model_id": "eleven_v3_conversational"
    }
  }
}
```

The same tags work in the text the `agent` verb streams to TTS, so you can prompt its LLM to use them.

For voice agents, `eleven_v4_turbo` is the low-latency choice: first audio arrives about 150 ms after the text is flushed, compared with about 800 ms for `eleven_v4`.

These models work on both paths:

* **Streaming** (`say` with `stream: true`, the `agent` verb, and other token-streaming TTS). ElevenLabs serves these models only on its Text to Dialogue websocket, and jambonz switches to it automatically when `model_id` starts with `eleven_v3` or `eleven_v4`. The session keeps conversational context across the agent's turns and starts a new turn for each reply. Barge-in reconnects the socket, as for the other models, so context starts again after an interruption.
* **Non-streaming** (`say` without `stream`) uses the HTTP API, as for the other models.

> **Warning**
>
> Audio tags depend on the voice. Some older voices, such as Rachel (`21m00Tcm4TlvDq8ikWAM`), are rejected by the ElevenLabs streaming API when the text contains any audio tag. The stream then fails and the call falls back to your fallback TTS vendor, if you configured one. Test your voice with a tagged sentence before you rely on it. A voice with a wide emotional range, such as George (`JBFqnCBsd6RMkjVDRZzb`), works.

On the streaming path these models use only `voice_settings.stability` and `pronunciation_dictionary_locators`. The other `voice_settings` fields and `optimize_streaming_latency` are ignored. A lower `stability` makes the voice follow audio tags more closely. The synthesizer language is sent without its region, so `en-US` is sent as `en`. It is sent only when ElevenLabs accepts that language for the model, because the Text to Dialogue websocket ends the session on any other value. For a language it does not accept, no language is sent and ElevenLabs detects it from the text, which is least reliable on short replies such as "Ja." or "OK". `eleven_v4` and `eleven_v4_turbo` accept more languages than `eleven_v3` and `eleven_v3_conversational`, including Maltese, Mongolian, Cantonese and Yoruba.