> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pipecat.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Expressive TTS Services

> The TTS services and models that perform expression tags, what each performs, the Tavus avatar, and ExpressionCapabilities.

## Overview

A TTS service performs expression tags through its expression adapter, which declares what the service performs and writes each tag in the provider's markup. The services below have one for the models or voices listed. Any other TTS service, or model, speaks only the words: tags are left out of its speech.

For a walkthrough, see [Expressive Conversation](https://docs.pipecat.ai/pipecat/features/expressive-conversation.md).

## Supported Services

| Service | Models or voices | Sounds | Deliveries | Pauses (ms) | Emphasis | Delivery changes |
| - | - | - | - | - | - | - |
| [`AzureTTSService`, `AzureHttpTTSService`](https://docs.pipecat.ai/api-reference/server/services/tts/azure) | DragonHD and DragonHD Omni voices | Listed | Listed | | | Anywhere |
| [`CartesiaTTSService`, `CartesiaHttpTTSService`](https://docs.pipecat.ai/api-reference/server/services/tts/cartesia) | All | Laughter | Listed | 100–5000 | | Between sentences |
| [`ElevenLabsHttpTTSService`](https://docs.pipecat.ai/api-reference/server/services/tts/elevenlabs) | `eleven_v3`, `eleven_v4` models | Listed or free text | Listed or free text | 100–3000 | Yes | Anywhere |
| [`ElevenLabsDialogueTTSService`](https://docs.pipecat.ai/api-reference/server/services/tts/elevenlabs) | All | Listed or free text | Listed or free text | 100–3000 | Yes | Anywhere |
| [`FishAudioTTSService`](https://docs.pipecat.ai/api-reference/server/services/tts/fish) | S2 models | Listed or free text | Listed or free text | 100–1500 | Yes | Anywhere |
| [`GeminiTTSService`](https://docs.pipecat.ai/api-reference/server/services/tts/google) | Gemini 3.8 TTS models, on the Gemini API | Listed | Free text, `slow` and `fast` | 100–2000 | Yes | Between sentences |
| [`InworldTTSService`, `InworldHttpTTSService`](https://docs.pipecat.ai/api-reference/server/services/tts/inworld) | `inworld-tts-2` | Listed | Free text, `slow` and `fast` | 100–10000 | Yes | Anywhere |
| [`InworldTTSService`, `InworldHttpTTSService`](https://docs.pipecat.ai/api-reference/server/services/tts/inworld) | `inworld-tts-2-flash` | Listed | | 100–10000 | | Anywhere |
| [`MiniMaxHttpTTSService`](https://docs.pipecat.ai/api-reference/server/services/tts/minimax) | `speech-2.8` models | Listed | Listed | 10–99990 | | Between sentences |
| [`MistralTTSService`](https://docs.pipecat.ai/api-reference/server/services/tts/mistral) | Voxtral 3 models, such as `voxtral-mini-tts-3-0` | Listed | Listed | | | Anywhere |
| [`SonioxTTSService`](https://docs.pipecat.ai/api-reference/server/services/tts/soniox) | `tts-rt-v2` | Listed | Listed | 100–2000 | Yes | Anywhere |

* **Listed**: the service performs the names it declares, the provider's own, which the LLM is offered by their universal names. See the provider's documentation for its list.
* **Free text**: the service also takes a delivery or sound described in a few words, so any name is passed through as written.
* **Pauses**: a pause outside the range is clamped to it. A service without a range performs no pauses.
* **Delivery changes**: where in a reply the delivery can change. Between sentences, a sentence is spoken in the delivery its words start in, and a span's whole sentence is spoken in the span's delivery.

The expression adapter is chosen by the service's model or voice, so a settings change can change what the service performs, and the LLM is taught the new tags.

## Avatars

### Tavus

[`TavusTransport`](https://docs.pipecat.ai/api-reference/server/services/transport/tavus) sets the replica's facial emotion to follow the delivery of the bot's speech, as each word is spoken. The replica shows the emotion of the delivery's first name other than `slow`, `fast` and emphasis, such as happiness for `["warm", "slow"]`. The voice's baseline, and a delivery not in the table, show neutral. At start, a warning names the policy's deliveries that have no emotion.

| Delivery | `TavusEmotion` |
| - | - |
| `calm`, `curious`, `confident` | `NEUTRAL` |
| `warm`, `excited`, `grateful`, `happy` | `HAPPINESS` |
| `sympathetic`, `apologetic`, `sad` | `SADNESS` |
| `surprised` | `SURPRISE` |
| `angry` | `ANGER` |
| `fearful`, `scared` | `FEAR` |
| `disgusted` | `DISGUST` |
| `contemptuous` | `CONTEMPT` |

```python theme={null}
from pipecat.transports.tavus.transport import TAVUS_DELIVERY_EMOTIONS, TavusEmotion
```

`TAVUS_DELIVERY_EMOTIONS` holds this table, as `dict[str, TavusEmotion]`.

## ExpressionCapabilities

What a TTS service performs, as its expression adapter declares it and as `TTSMetadataFrame.expression` carries it at start.

```python theme={null}
from pipecat.expressive.expression import (
    DeliveryScope,
    ExpressionCapabilities,
    ExpressionTerm,
)
```

| Field | Type | Description |
| - | - | - |
| `sounds` | `list[ExpressionTerm]` | Sounds the service makes, by its own names. |
| `delivery` | `list[ExpressionTerm]` | Deliveries the service applies to the words after them, by its own names. |
| `allows_free_text_sounds` | `bool` | Whether the service also takes sounds outside `sounds`, described in a few words. Defaults to `False`. |
| `allows_free_text_delivery` | `bool` | Whether the service also takes deliveries outside `delivery`. Defaults to `False`. |
| `pause_range_ms` | `tuple[int, int] \| None` | The shortest and longest pause, in milliseconds, or `None` when the service can't pause. |
| `emphasis` | `bool` | Whether the service stresses words marked `^^word^^`. Defaults to `False`. |
| `delivery_scope` | `DeliveryScope` | Where in a reply the delivery can change: `ANYWHERE` (the default) or `SENTENCE`. |
| `service_vocabulary` | `dict[ExpressionDelivery \| ExpressionSound, list[str]]` | The service's names for universal names it calls something else, best first, such as `{ExpressionDelivery.WARM: ["warmly"]}`. A universal name left out is sent as written. |

`ExpressionTerm` is one sound or delivery: its `name`, by the service's own name, and a `description` of when to use it, which the LLM is shown, or `""`.

### delivery\_name

```python theme={null}
delivery_name(name: str) -> str | None
```

Returns the name the service performs a delivery by, given the name written in its tag, or `None` when it can't perform it.

### sound\_name

```python theme={null}
sound_name(name: str) -> str | None
```

Returns the name the service performs a sound by, or `None` when it can't perform it.

## Adding an Adapter

To make another TTS service expressive, subclass `BaseExpressionAdapter` and set it as the service's `expression_adapter_class`, or override `get_expression_adapter()` to choose an adapter by model or voice. The service calls the adapter only with what its capabilities say it performs, by the service's own names.

```python theme={null}
from pipecat.adapters.tts.base_expression_adapter import BaseExpressionAdapter
```

| Method | Returns |
| - | - |
| `capabilities()` | The service's `ExpressionCapabilities`, or `None` for none. |
| `format_text(text, delivery, previous_delivery)` | The words to send, in their delivery. `previous_delivery` is that of the words before them, or `None` for a reply's first words. |
| `format_sound(name)` | The markup for a sound at its place in the text. |
| `format_pause(duration_ms)` | The markup for a pause, its length within the service's range. |
| `format_end(delivery)` | Text to end a sentence's request with, for markup that would otherwise last past it, or `""`. |
| `request_settings(delivery)` | Settings to send beside a request's text, for a service that takes some expression as settings, such as a speed, or `{}`. |

Set the markup apart from the words with spaces, so the word timestamps a service reports line up with the text it was sent.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.