LiveKit docs › Build Agents › Models › TTS › Overview

---

# Text-to-speech (TTS) models overview

> Voices and plugins to add realtime speech to your voice agents.

## Overview

Voice agent speech is produced by a TTS model, configured with a voice profile that specifies tone, accent, and other qualitative characteristics of the speech. The TTS model runs on output from an [LLM](https://docs.livekit.io/agents/models/llm.md) model to speak the agent response to the user.

You can choose a voice model served through LiveKit Inference, included with LiveKit Cloud. With LiveKit Inference, your agent runs on LiveKit's infrastructure to minimize latency. No separate provider API key is required, and usage and rate limits are managed through LiveKit Cloud. Use the plugin instead if you prefer to manage billing and rate limits yourself, or need access to a provider not currently available through LiveKit Inference.

## LiveKit Inference

LiveKit Inference provides a curated set of TTS models with managed billing and rate limits. Each model comes with a limited selection of [Suggested voices](#voices), plus a wider selection through each provider's documentation.

### Models

The following models are available in [LiveKit Inference](https://docs.livekit.io/agents/models.md#inference). Refer to the guide for each model for more details on additional configuration options.

A checkmark in the **EU endpoint** column in the following tables means the model has a dedicated EU endpoint, in addition to the global endpoint. To learn more, see [Data residency](https://docs.livekit.io/agents/models/inference.md#data-residency).

#### [Cartesia](https://docs.livekit.io/agents/models/tts/cartesia.md)

| Model name | Model ID | Languages | EU endpoint |
| ---------- | -------- | --------- | ------ |
| Sonic 3 | `cartesia/sonic-3` | `en`, `de`, `es`, `fr`, `ja`, `pt`, `zh`, `hi`, `ko`, `it`, `nl`, `pl`, `ru`, `sv`, `tr`, `tl`, `bg`, `ro`, `ar`, `cs`, `el`, `fi`, `hr`, `ms`, `sk`, `da`, `ta`, `uk`, `hu`, `no`, `vi`, `bn`, `th`, `he`, `ka`, `id`, `te`, `gu`, `kn`, `ml`, `mr`, `pa` | ✓ |
| Sonic 3 (2026-01-12) | `cartesia/sonic-3-2026-01-12` | `en`, `de`, `es`, `fr`, `ja`, `pt`, `zh`, `hi`, `ko`, `it`, `nl`, `pl`, `ru`, `sv`, `tr`, `tl`, `bg`, `ro`, `ar`, `cs`, `el`, `fi`, `hr`, `ms`, `sk`, `da`, `ta`, `uk`, `hu`, `no`, `vi`, `bn`, `th`, `he`, `ka`, `id`, `te`, `gu`, `kn`, `ml`, `mr`, `pa` | ✓ |
| Sonic 3 Latest | `cartesia/sonic-3-latest` | `en`, `de`, `es`, `fr`, `ja`, `pt`, `zh`, `hi`, `ko`, `it`, `nl`, `pl`, `ru`, `sv`, `tr`, `tl`, `bg`, `ro`, `ar`, `cs`, `el`, `fi`, `hr`, `ms`, `sk`, `da`, `ta`, `uk`, `hu`, `no`, `vi`, `bn`, `th`, `he`, `ka`, `id`, `te`, `gu`, `kn`, `ml`, `mr`, `pa` | ✓ |
| Sonic 3.5 | `cartesia/sonic-3.5` | `en`, `de`, `es`, `ja`, `pt`, `zh`, `hi`, `ko`, `nl`, `pl`, `ru`, `sv`, `tr`, `tl`, `bg`, `ro`, `ar`, `cs`, `el`, `fi`, `hr`, `ms`, `sk`, `da`, `ta`, `uk`, `hu`, `no`, `vi`, `bn`, `th`, `he`, `ka`, `id`, `te`, `gu`, `kn`, `ml`, `mr`, `pa` | ✓ |
| Sonic 3.5 (2026-05-04) | `cartesia/sonic-3.5-2026-05-04` | `en`, `de`, `es`, `ja`, `pt`, `zh`, `hi`, `ko`, `nl`, `pl`, `ru`, `sv`, `tr`, `tl`, `bg`, `ro`, `ar`, `cs`, `el`, `fi`, `hr`, `ms`, `sk`, `da`, `ta`, `uk`, `hu`, `no`, `vi`, `bn`, `th`, `he`, `ka`, `id`, `te`, `gu`, `kn`, `ml`, `mr`, `pa` | ✓ |
| Sonic 3.6 | `cartesia/sonic-3.6` | `en`, `fr`, `de`, `es`, `ja`, `pt`, `zh`, `hi`, `it`, `ko`, `nl`, `pl`, `ru`, `sv`, `tr`, `tl`, `bg`, `ro`, `ar`, `cs`, `el`, `fi`, `hr`, `ms`, `sk`, `da`, `ta`, `uk`, `hu`, `no`, `vi`, `bn`, `th`, `he`, `ka`, `id`, `te`, `gu`, `kn`, `ml`, `mr`, `pa`, `or`, `ur` | ✓ |
| Sonic 3.6 (2026-08-27) | `cartesia/sonic-3.6-2026-08-27` | `en`, `fr`, `de`, `es`, `ja`, `pt`, `zh`, `hi`, `it`, `ko`, `nl`, `pl`, `ru`, `sv`, `tr`, `tl`, `bg`, `ro`, `ar`, `cs`, `el`, `fi`, `hr`, `ms`, `sk`, `da`, `ta`, `uk`, `hu`, `no`, `vi`, `bn`, `th`, `he`, `ka`, `id`, `te`, `gu`, `kn`, `ml`, `mr`, `pa`, `or`, `ur` | ✓ |
| Sonic Latest | `cartesia/sonic-latest` | `en`, `de`, `es`, `ja`, `pt`, `zh`, `hi`, `ko`, `nl`, `pl`, `ru`, `sv`, `tr`, `tl`, `bg`, `ro`, `ar`, `cs`, `el`, `fi`, `hr`, `ms`, `sk`, `da`, `ta`, `uk`, `hu`, `no`, `vi`, `bn`, `th`, `he`, `ka`, `id`, `te`, `gu`, `kn`, `ml`, `mr`, `pa` | ✓ |
| Sonic Preview | `cartesia/sonic-preview` | `en`, `fr`, `de`, `es`, `ja`, `pt`, `zh`, `hi`, `it`, `ko`, `nl`, `pl`, `ru`, `sv`, `tr`, `tl`, `bg`, `ro`, `ar`, `cs`, `el`, `fi`, `hr`, `ms`, `sk`, `da`, `ta`, `uk`, `hu`, `no`, `vi`, `bn`, `th`, `he`, `ka`, `id`, `te`, `gu`, `kn`, `ml`, `mr`, `pa`, `or`, `ur` | ✓ |
| Sonic 2 | `cartesia/sonic-2` **DEPRECATED** (retires October 20, 2026; use `cartesia/sonic-3.5`) | `en`, `fr`, `de`, `es`, `pt`, `zh`, `ja`, `ko` | ✓ |
| Sonic 3 (2025-10-27) | `cartesia/sonic-3-2025-10-27` **DEPRECATED** (retires October 20, 2026; use `cartesia/sonic-3.5`) | `en`, `de`, `es`, `fr`, `ja`, `pt`, `zh`, `hi`, `ko`, `it`, `nl`, `pl`, `ru`, `sv`, `tr`, `tl`, `bg`, `ro`, `ar`, `cs`, `el`, `fi`, `hr`, `ms`, `sk`, `da`, `ta`, `uk`, `hu`, `no`, `vi`, `bn`, `th`, `he`, `ka`, `id`, `te`, `gu`, `kn`, `ml`, `mr`, `pa` | ✓ |
| Sonic Turbo | `cartesia/sonic-turbo` **DEPRECATED** (retires October 20, 2026; use `cartesia/sonic-3.5`) | `en`, `fr`, `de`, `es`, `pt`, `zh`, `ja`, `hi`, `ko` | ✓ |
| Sonic | `cartesia/sonic` **RETIRED** (retired June 1, 2026; use `cartesia/sonic-3`) | `en`, `fr`, `de`, `es`, `pt`, `zh`, `ja`, `hi`, `it`, `ko`, `nl`, `pl`, `ru`, `sv`, `tr` | ✓ |

#### [Deepgram](https://docs.livekit.io/agents/models/tts/deepgram.md)

| Model name | Model ID | Languages | EU endpoint |
| ---------- | -------- | --------- | ------ |
| Aura-2 | `deepgram/aura-2` | `en`, `en-US`, `en-PH`, `en-GB`, `en-AU`, `es`, `es-CO`, `es-MX`, `es-ES`, `es-419`, `es-AR`, `nl`, `nl-NL`, `fr`, `fr-FR`, `de`, `de-DE`, `it`, `it-IT`, `ja`, `ja-JP` | ✓ |
| Flux TTS | `deepgram/flux-tts` | `en`, `en-US`, `en-GB`, `en-AU`, `en-IN` | ✓ |
| Aura-1 | `deepgram/aura` **RETIRED** (retired February 13, 2026; use `deepgram/aura-2`) | `en`, `en-US`, `en-IE`, `en-GB` |  |

#### [Fish Audio](https://docs.livekit.io/agents/models/tts/fishaudio.md)

| Model name | Model ID | Languages | EU endpoint |
| ---------- | -------- | --------- | ------ |
| S2 Pro | `fishaudio/s2-pro` | `en`, `zh`, `ja`, `de`, `fr`, `es`, `ko`, `ar`, `ru`, `nl`, `it`, `pl`, `pt` |  |
| S2.1 Pro | `fishaudio/s2.1-pro` | `en`, `zh`, `ja`, `de`, `fr`, `es`, `ko`, `ar`, `ru`, `nl`, `it`, `pl`, `pt` |  |
| S2.1 Pro Free | `fishaudio/s2.1-pro-free` **DEPRECATED** (retires September 25, 2026; use `fishaudio/s2.1-pro`) | `en`, `zh`, `ja`, `de`, `fr`, `es`, `ko`, `ar`, `ru`, `nl`, `it`, `pl`, `pt` |  |

#### [Gradium](https://docs.livekit.io/agents/models/tts/gradium.md)

| Model name | Model ID | Languages | EU endpoint |
| ---------- | -------- | --------- | ------ |
| Gradium TTS | `gradium/default` | `en`, `fr`, `de`, `es`, `pt` | ✓ |

#### [Inworld](https://docs.livekit.io/agents/models/tts/inworld.md)

| Model name | Model ID | Languages | EU endpoint |
| ---------- | -------- | --------- | ------ |
| Realtime TTS 1.5 Max | `inworld/inworld-tts-1.5-max` | `en`, `zh`, `ja`, `ko`, `ru`, `it`, `es`, `pt`, `fr`, `de`, `pl`, `nl`, `hi`, `he`, `ar` |  |
| Realtime TTS 1.5 Mini | `inworld/inworld-tts-1.5-mini` | `en`, `zh`, `ja`, `ko`, `ru`, `it`, `es`, `pt`, `fr`, `de`, `pl`, `nl`, `hi`, `he`, `ar` |  |
| Realtime TTS 2.0 | `inworld/inworld-tts-2` | `en`, `zh`, `ja`, `ko`, `ru`, `it`, `es`, `pt`, `fr`, `de`, `pl`, `nl`, `hi`, `he`, `ar`, `af`, `sq`, `am`, `hy`, `as`, `az`, `eu`, `be`, `bn`, `bg`, `my`, `yue`, `ca`, `ceb`, `hr`, `cs`, `da`, `yih`, `arz`, `et`, `fil`, `fi`, `gl`, `gbm`, `ka`, `el`, `gu`, `afb`, `ht`, `acw`, `hu`, `is`, `id`, `jv`, `kn`, `kk`, `kok`, `lo`, `lv`, `ayl`, `lt`, `lb`, `mk`, `mai`, `mg`, `ms`, `ml`, `mr`, `mn`, `ars`, `ne`, `uzn`, `nb`, `nn`, `or`, `acx`, `ps`, `fa`, `pms`, `pa`, `ro`, `sr`, `sd`, `si`, `sk`, `sl`, `sw`, `sv`, `ta`, `te`, `th`, `aeb`, `tr`, `uk`, `ur`, `uz`, `vi`, `vro`, `cy` |  |
| Realtime TTS 2.0 Flash | `inworld/inworld-tts-2-flash` | `en`, `zh`, `ja`, `ko`, `ru`, `it`, `es`, `pt`, `fr`, `de`, `pl`, `nl`, `hi`, `he`, `ar`, `af`, `sq`, `am`, `hy`, `as`, `az`, `eu`, `be`, `bn`, `bg`, `my`, `yue`, `ca`, `ceb`, `hr`, `cs`, `da`, `yih`, `arz`, `et`, `fil`, `fi`, `gl`, `gbm`, `ka`, `el`, `gu`, `afb`, `ht`, `acw`, `hu`, `is`, `id`, `jv`, `kn`, `kk`, `kok`, `lo`, `lv`, `ayl`, `lt`, `lb`, `mk`, `mai`, `mg`, `ms`, `ml`, `mr`, `mn`, `ars`, `ne`, `uzn`, `nb`, `nn`, `or`, `acx`, `ps`, `fa`, `pms`, `pa`, `ro`, `sr`, `sd`, `si`, `sk`, `sl`, `sw`, `sv`, `ta`, `te`, `th`, `aeb`, `tr`, `uk`, `ur`, `uz`, `vi`, `vro`, `cy` |  |
| Realtime TTS | `inworld/inworld-tts-1` **RETIRED** (retired June 1, 2026; use `inworld/inworld-tts-1.5-mini`) | `en`, `es`, `fr`, `ko`, `nl`, `zh`, `de`, `it`, `ja`, `pl`, `pt`, `ru`, `hi`, `he`, `ar` |  |
| Realtime TTS Max | `inworld/inworld-tts-1-max` **RETIRED** (retired June 1, 2026; use `inworld/inworld-tts-1.5-max`) | `en`, `es`, `fr`, `ko`, `nl`, `zh`, `de`, `it`, `ja`, `pl`, `pt`, `ru`, `hi`, `he`, `ar` |  |

#### [Rime](https://docs.livekit.io/agents/models/tts/rime.md)

| Model name | Model ID | Languages | EU endpoint |
| ---------- | -------- | --------- | ------ |
| Coda | `rime/coda` | `en`, `es`, `fr`, `de`, `hi`, `ja`, `pt`, `ar` |  |
| Mist v3 | `rime/mistv3` | `en`, `es`, `fr`, `de`, `hi` |  |
| Mist | `rime/mist` **DEPRECATED** (retires October 1, 2026; use `rime/mistv3`) | `en` |  |
| Mist v2 | `rime/mistv2` **DEPRECATED** (retires October 1, 2026; use `rime/mistv3`) | `en`, `es`, `fr`, `de` |  |
| Arcana | `rime/arcana` **RETIRED** (retired August 19, 2026; use `rime/coda`) | `en`, `es`, `fr`, `de`, `hi`, `he`, `ja`, `pt`, `ar` |  |

#### [SpaceXAI](https://docs.livekit.io/agents/models/tts/spacexai.md)

| Model name | Model ID | Languages | EU endpoint |
| ---------- | -------- | --------- | ------ |
| Text to Speech | `xai/tts-1` | `auto`, `en`, `ar-EG`, `ar-SA`, `ar-AE`, `bn`, `zh`, `fr`, `de`, `hi`, `id`, `it`, `ja`, `ko`, `pt-BR`, `pt-PT`, `ru`, `es-MX`, `es-ES`, `tr`, `vi` | ✓ |

> ⚠️ **Retired models**
> 
> Retired models are no longer accessible. If you're using a retired model, switch to a currently available model.

### Custom voices

You can create and use custom voices with LiveKit Inference. Upload or record a sample, and LiveKit clones it to all [supported TTS providers](https://docs.livekit.io/agents/models/tts/custom-voices.md#providers) on your plan. You can then use the clone in your agent sessions with any of those providers.

- **[Custom voices](https://docs.livekit.io/agents/models/tts/custom-voices.md)**: Create voice clones from short audio samples.

### Expressive mode

Expressive mode lets the LLM add emotion, pacing, and non-verbal sounds to your agent's speech automatically, using markup that LiveKit renders through the TTS. It's available for supported providers on LiveKit Inference.

- **[Expressive mode](https://docs.livekit.io/agents/models/tts/expressive.md)**: Add emotion, pacing, and non-verbal sounds automatically.

### Suggested voices

The following voices are good choices for overall quality and performance. Each provider has a much larger selection of voices to choose from, which you can find in their documentation. In addition to the voices below, you can choose to use other TTS provider voices through LiveKit Inference.

Click the copy icon to copy the voice ID to use in your agent session.

| Provider | Name | Description | Language | ID |
| -------- | ---- | ----------- | -------- | -------- |
| Cartesia | Blake | Energetic American adult male | `en-US` | `cartesia/sonic-3:a167e0f3-df7e-4d52-a9c3-f949145efdab` |
| Cartesia | Daniela | Calm and trusting Mexican female | `es-MX` | `cartesia/sonic-3:5c5ad5e7-1020-476b-8b91-fdcbe9cc313c` |
| Cartesia | Jacqueline | Confident, young American adult female | `en-US` | `cartesia/sonic-3:9626c31c-bec5-4cca-baa8-f8ba9e84c8bc` |
| Cartesia | Robyn | Neutral, mature Australian female | `en-AU` | `cartesia/sonic-3:f31cc6a7-c1e8-4764-980c-60a361443dd1` |
| Deepgram | Apollo | Comfortable, casual male | `en-US` | `deepgram/aura-2:apollo` |
| Deepgram | Athena | Smooth, professional female | `en-US` | `deepgram/aura-2:athena` |
| Deepgram | Odysseus | Calm, professional male | `en-US` | `deepgram/aura-2:odysseus` |
| Deepgram | Theia | Expressive, polite female | `en-AU` | `deepgram/aura-2:theia` |
| Fish Audio | Adrian | Friendly, casual American male | `en-US` | `fishaudio/s2.1-pro:bf322df2096a46f18c579d0baa36f41d` |
| Fish Audio | Ethan | A curious explainer. | `en-US` | `fishaudio/s2.1-pro:536d3a5e000945adb7038665781a4aca` |
| Fish Audio | Hannah | A conversational specialist. | `en-US` | `fishaudio/s2.1-pro:9a9cf47702da476aa4629e2506d4a857` |
| Fish Audio | Jordan | A motivational speaker. | `en-US` | `fishaudio/s2.1-pro:79d0bd3e4e5444b18f7b6d89b5927bf1` |
| Fish Audio | Laura | A confident female narrator. | `en-US` | `fishaudio/s2.1-pro:e3cd384158934cc9a01029cd7d278634` |
| Fish Audio | Sarah | An engaged speaker. | `en-US` | `fishaudio/s2.1-pro:933563129e564b19a115bedd57b7406a` |
| Fish Audio | Selene | A meditative female voice. | `en-US` | `fishaudio/s2.1-pro:b347db033a6549378b48d00acb0d06cd` |
| Gradium | Harper | Modern, confident and friendly American female | `en-US` | `gradium/default:4SZHfMpw-p46Ywgs` |
| Gradium | Sterling | Warm, energetic American male with theatrical flair | `en-US` | `gradium/default:6MFfc37kq0sBjBjy` |
| Gradium | Solène | Bright, warm and enthusiastic French female | `fr-FR` | `gradium/default:YhIHaAfQ0cQPDV9R` |
| Gradium | Marius | Energetic, confident French male | `fr-FR` | `gradium/default:biuhvu17TxVKOcyy` |
| Gradium | Lorena | Warm and lively young German female | `de-DE` | `gradium/default:aBNlTApBeOlVKa23` |
| Gradium | Mats | Sparky, attentive German male | `de-DE` | `gradium/default:Kf5m22mROozoMWj3` |
| Gradium | Vera | Sweet, expressive Castilian Spanish female | `es-ES` | `gradium/default:iTQW2xFICXk8riV4` |
| Gradium | Mateo | Sparky, attentive Peninsular Spanish male | `es-ES` | `gradium/default:sVLgzKMqaptUdaY8` |
| Gradium | Bianca | Bright, welcoming Brazilian female | `pt-BR` | `gradium/default:uCqxlQCKi8sPHwG2` |
| Gradium | Mateus | Warm, friendly Brazilian male | `pt-BR` | `gradium/default:AByHrwi1S-yLzW-s` |
| Rime | Astra | Chipper, upbeat American female | `en-US` | `rime/coda:astra` |
| Rime | Celeste | Chill Gen-Z American female | `en-US` | `rime/coda:celeste` |
| Rime | Luna | Chill but excitable American female | `en-US` | `rime/coda:luna` |
| Inworld | Ashley | Warm, natural American female | `en-US` | `inworld/inworld-tts-1:Ashley` |
| Inworld | Diego | Soothing, gentle Mexican male | `es-MX` | `inworld/inworld-tts-1:Diego ` |
| Inworld | Edward | Fast-talking, emphatic American male | `en-US` | `inworld/inworld-tts-1:Edward` |
| Inworld | Olivia | Upbeat, friendly British female | `en-GB` | `inworld/inworld-tts-1:Olivia` |
| xAI | Ara | Warm, friendly | `en-US` | `xai/tts-1:ara` |
| xAI | Eve | Energetic, upbeat | `en-US` | `xai/tts-1:eve` |
| xAI | Leo | Authoritative, strong | `en-US` | `xai/tts-1:leo` |
| xAI | Rex | Confident, clear | `en-US` | `xai/tts-1:rex` |
| xAI | Sal | Smooth, balanced | `en-US` | `xai/tts-1:sal` |
| xAI | Carina | Soft, empathetic | `en-US` | `xai/tts-1:carina` |
| xAI | Zagan | Powerful, dramatic | `en-US` | `xai/tts-1:zagan` |
| xAI | Helix | Bold, dynamic | `en-US` | `xai/tts-1:helix` |
| xAI | Orion | Rich, cinematic | `en-US` | `xai/tts-1:orion` |
| xAI | Luna | Gentle, patient | `en-US` | `xai/tts-1:luna` |
| xAI | Iris | Friendly, upbeat | `en-US` | `xai/tts-1:iris` |
| xAI | Altair | Elegant, refined | `en-US` | `xai/tts-1:altair` |
| xAI | Zenith | Sharp, focused | `en-US` | `xai/tts-1:zenith` |
| xAI | Perseus | Strong, confident | `en-US` | `xai/tts-1:perseus` |
| xAI | Helios | Upbeat, energetic | `en-US` | `xai/tts-1:helios` |
| xAI | Lux | Grounded, calm | `en-US` | `xai/tts-1:lux` |
| xAI | Kepler | Inventive, forward-thinking | `en-US` | `xai/tts-1:kepler` |
| xAI | Rigel | Precise, professional | `en-US` | `xai/tts-1:rigel` |
| xAI | Cosmo | Bright, curious | `en-US` | `xai/tts-1:cosmo` |
| xAI | Celeste | Compassionate, confident | `en-US` | `xai/tts-1:celeste` |
| xAI | Ursa | Friendly, warm | `en-US` | `xai/tts-1:ursa` |
| xAI | Sirius | Quick-witted, clever | `en-US` | `xai/tts-1:sirius` |
| xAI | Lumen | Warm, articulate | `en-US` | `xai/tts-1:lumen` |
| xAI | Castor | Charismatic, down-to-earth | `en-US` | `xai/tts-1:castor` |
| xAI | Naksh | Warm, thoughtful | `en-US` | `xai/tts-1:naksh` |
| xAI | Atlas | Confident, commanding | `en-US` | `xai/tts-1:atlas` |

## Plugins

The LiveKit Agents framework includes open source [plugins](https://docs.livekit.io/agents/models.md#plugins) for a wide range of TTS providers. Use a plugin when you need provider-specific features not available through Inference, want to manage billing directly, or need a provider not currently in Inference. Plugins require your own API key and account.

| Provider | Python | Node.js |
| -------- | ------ | ------- |
| [Amazon Polly](https://docs.livekit.io/agents/models/tts/plugins/aws.md) | ✓ | — |
| [AsyncAI](https://docs.livekit.io/agents/models/tts/plugins/asyncai.md) | ✓ | — |
| [Azure AI Speech](https://docs.livekit.io/agents/models/tts/plugins/azure.md) | ✓ | — |
| [Azure OpenAI](https://docs.livekit.io/agents/models/tts/plugins/azure-openai.md) | ✓ | — |
| [Baseten](https://docs.livekit.io/agents/models/tts/plugins/baseten.md) | ✓ | — |
| [Bland](https://docs.livekit.io/agents/models/tts/plugins/bland.md) | ✓ | — |
| [Camb.ai](https://docs.livekit.io/agents/models/tts/plugins/cambai.md) | ✓ | — |
| [Cartesia](https://docs.livekit.io/agents/models/tts/plugins/cartesia.md) | ✓ | ✓ |
| [Deepgram](https://docs.livekit.io/agents/models/tts/plugins/deepgram.md) | ✓ | ✓ |
| [ElevenLabs](https://docs.livekit.io/agents/models/tts/plugins/elevenlabs.md) | ✓ | ✓ |
| [Fish Audio](https://docs.livekit.io/agents/models/tts/plugins/fishaudio.md) | ✓ | — |
| [Gemini](https://docs.livekit.io/agents/models/tts/plugins/gemini.md) | ✓ | — |
| [Gnani](https://docs.livekit.io/agents/models/tts/plugins/gnani.md) | ✓ | — |
| [Google Cloud](https://docs.livekit.io/agents/models/tts/plugins/google.md) | ✓ | — |
| [Gradium](https://docs.livekit.io/agents/models/tts/plugins/gradium.md) | ✓ | — |
| [Groq](https://docs.livekit.io/agents/models/tts/plugins/groq.md) | ✓ | — |
| [Hume](https://docs.livekit.io/agents/models/tts/plugins/hume.md) | ✓ | — |
| [Inworld](https://docs.livekit.io/agents/models/tts/plugins/inworld.md) | ✓ | ✓ |
| [Kokoro](https://docs.livekit.io/agents/models/tts/plugins/kokoro.md) | ✓ | — |
| [LMNT](https://docs.livekit.io/agents/models/tts/plugins/lmnt.md) | ✓ | — |
| [Microsoft AI](https://docs.livekit.io/agents/models/tts/plugins/microsoft-ai.md) | ✓ | — |
| [MiniMax](https://docs.livekit.io/agents/models/tts/plugins/minimax.md) | ✓ | — |
| [Mistral AI](https://docs.livekit.io/agents/models/tts/plugins/mistralai.md) | ✓ | ✓ |
| [Murf AI](https://docs.livekit.io/agents/models/tts/plugins/murf.md) | ✓ | — |
| [Neuphonic](https://docs.livekit.io/agents/models/tts/plugins/neuphonic.md) | ✓ | ✓ |
| [Nvidia](https://docs.livekit.io/agents/models/tts/plugins/nvidia.md) | ✓ | — |
| [OpenAI](https://docs.livekit.io/agents/models/tts/plugins/openai.md) | ✓ | ✓ |
| [Resemble AI](https://docs.livekit.io/agents/models/tts/plugins/resemble.md) | ✓ | ✓ |
| [Respeecher](https://docs.livekit.io/agents/models/tts/plugins/respeecher.md) | ✓ | — |
| [Rime](https://docs.livekit.io/agents/models/tts/plugins/rime.md) | ✓ | ✓ |
| [Sarvam](https://docs.livekit.io/agents/models/tts/plugins/sarvam.md) | ✓ | ✓ |
| [Simplismart](https://docs.livekit.io/agents/models/tts/plugins/simplismart.md) | ✓ | — |
| [SLNG](https://docs.livekit.io/agents/models/tts/plugins/slng.md) | ✓ | — |
| [Smallest AI](https://docs.livekit.io/agents/models/tts/plugins/smallestai.md) | ✓ | — |
| [Soniox](https://docs.livekit.io/agents/models/tts/plugins/soniox.md) | ✓ | ✓ |
| [SpaceXAI](https://docs.livekit.io/agents/models/tts/plugins/spacexai.md) | ✓ | — |
| [Speechify](https://docs.livekit.io/agents/models/tts/plugins/speechify.md) | ✓ | — |
| [Speechmatics](https://docs.livekit.io/agents/models/tts/plugins/speechmatics.md) | ✓ | — |
| [Spitch](https://docs.livekit.io/agents/models/tts/plugins/spitch.md) | ✓ | — |

Have another provider in mind? LiveKit is open source and welcomes [new plugin contributions](https://docs.livekit.io/agents/models.md#contribute).

## TTS Usage

To set up TTS in an `AgentSession`, provide a descriptor with both the desired model and voice. LiveKit Inference manages the connection to the model automatically. Consult the [Suggested voices](#voices) list for suggested voices, or view the model reference for more voices.

**Python**:

```python
from livekit.agents import AgentSession, inference

session = AgentSession(
    tts=inference.TTS(
        model="fishaudio/s2.1-pro",
        voice="fa4c9eb3dccc4806b382b40d61c6b10a",
        language="en",
    ),
    # ... llm, stt, etc.
)

```

---

**Node.js**:

```typescript
import { AgentSession, inference } from '@livekit/agents';

const session = new AgentSession({
    tts: new inference.TTS({
        model: "fishaudio/s2.1-pro",
        voice: "fa4c9eb3dccc4806b382b40d61c6b10a",
        language: "en",
    }),
    // ... llm, stt, etc.
})

```

### Additional parameters

More configuration options, such as custom pronunciation, are available for each model. To set additional parameters, use the `TTS` class from the `inference` module. Consult each model reference for examples and available parameters.

### Language codes

All TTS plugins and LiveKit Inference use the `LanguageCode` type for the `language` parameter. `LanguageCode` accepts any common language format and normalizes it automatically to [BCP-47](https://www.rfc-editor.org/info/bcp47). You don't need to look up the specific format each provider expects — pass any of the following and the framework handles the conversion:

- ISO 639-1: `"en"`, `"es"`, `"fr"`
- BCP-47 with region: `"en-US"`, `"zh-Hans-CN"`
- ISO 639-3: `"eng"`, `"spa"`
- Language names: `"english"`, `"spanish"`
- Underscored variants: `"en_us"` (normalized to `"en-US"`)

For example, all of the following are equivalent:

**Python**:

```python
from livekit.agents import LanguageCode

LanguageCode("english")  # → "en"
LanguageCode("eng")      # → "en"
LanguageCode("en")       # → "en"
LanguageCode("en-US")    # → "en-US"
LanguageCode("en_us")    # → "en-US"

```

`LanguageCode` is a `str` subclass, so you can use it anywhere a string is expected. It also provides properties for extracting parts of the code:

- `.language`: Base ISO 639-1 code (e.g., `"en"` from `"en-US"`).
- `.region`: Region subtag, if present (e.g., `"US"` from `"en-US"`).
- `.iso`: ISO 639-1 tag with region (e.g., `"zh-CN"` from `"cmn-Hans-CN"`).

---

**Node.js**:

```typescript
import { normalizeLanguage } from '@livekit/agents';

normalizeLanguage("english")  // → "en"
normalizeLanguage("eng")      // → "en"
normalizeLanguage("en")       // → "en"
normalizeLanguage("en-US")    // → "en-US"
normalizeLanguage("en_us")    // → "en-US"

```

In Node.js, `LanguageCode` is a branded `string` type. Use `normalizeLanguage()` to convert a plain string to a `LanguageCode`, and the standalone helper functions to extract parts of the code:

- `getBaseLanguage(lang)`: Base ISO 639-1 code (e.g., `"en"` from `"en-US"`).
- `getLanguageRegion(lang)`: Region subtag, if present (e.g., `"US"` from `"en-US"`).
- `getIsoLanguage(lang)`: ISO 639-1 tag with region (e.g., `"zh-CN"` from `"cmn-Hans-CN"`).

### Custom TTS

To create an entirely custom TTS, implement the [TTS node](https://docs.livekit.io/agents/build/nodes.md#tts_node) in your agent.

### Standalone TTS

You can use a `TTS` instance as a standalone component by creating a stream. Use `push_text` to add text to the stream, and then consume a stream of `SynthesizedAudio` to publish as [realtime audio](https://docs.livekit.io/transport/media.md) to another participant.

Here is an example of a standalone TTS app:

** Filename: `agent.py`**

```python
import asyncio
from livekit import agents, rtc
from livekit.agents import AgentServer
from livekit.agents.tts import SynthesizedAudio
from livekit.plugins import cartesia
from typing import AsyncIterable


server = AgentServer()

@server.rtc_session(agent_name="my-agent")
async def my_agent(ctx: agents.JobContext):
    text_stream: AsyncIterable[str] = ... # you need to provide a stream of text
    audio_source = rtc.AudioSource(44100, 1)

    track = rtc.LocalAudioTrack.create_audio_track("agent-audio", audio_source)
    await ctx.room.local_participant.publish_track(track)

    tts = cartesia.TTS(model="sonic-english")
    tts_stream = tts.stream()

    # create a task to consume and publish audio frames
    asyncio.create_task(send_audio(tts_stream))

    # push text into the stream, TTS stream will emit audio frames along with events
    # indicating sentence (or segment) boundaries.
    async for text in text_stream:
        tts_stream.push_text(text)
    tts_stream.end_input()

    async def send_audio(audio_stream: AsyncIterable[SynthesizedAudio]):
        async for a in audio_stream:
            await audio_source.capture_frame(a.audio.frame)

if __name__ == "__main__":
    agents.cli.run_app(server)

```

## Additional resources

The following resources cover related topics that may be useful for your application.

- **[Agent speech docs](https://docs.livekit.io/agents/build/audio.md)**: Explore the speech capabilities and features of LiveKit Agents.

- **[Pipeline nodes](https://docs.livekit.io/agents/build/nodes.md)**: Learn how to customize the behavior of your agent by overriding nodes in the voice pipeline.

- **[Inference pricing](https://livekit.com/pricing/inference#tts)**: The latest pricing information for TTS models in LiveKit Inference.

---

This document was rendered at 2026-10-07T16:22:58.440Z.
For the latest version of this document, see [https://docs.livekit.io/agents/models/tts.md](https://docs.livekit.io/agents/models/tts.md).

To explore all LiveKit documentation, see [llms.txt](https://docs.livekit.io/llms.txt).