Add Fish Audio to LiveKit Agents through LiveKit Inference or the Fish Audio plugin, with model choices, voice IDs, latency controls and launch tests.
LiveKit text to speech can use Fish Audio in two production paths. LiveKit Inference exposes Fish Audio model IDs without a separate Fish Audio API key, while LiveKit's Fish Audio plugin connects directly to Fish Audio when you need your own billing or an existing custom voice.
The first choice is therefore deployment architecture, not voice quality. Pick the path that matches your voice inventory, billing owner and data-residency requirements, then test the exact Fish Audio model and voice through a real LiveKit turn.
For the complete speech-to-speech loop around LiveKit, start with the AI voice agent guide. For the speech request and credential layer, use the text to speech API guide.
Yes. LiveKit's current TTS documentation lists Drama 3, S2 Pro and S2.1 Pro under the Fish Audio provider. Those models are available through LiveKit Inference, and LiveKit also documents a Fish Audio plugin that uses a Fish Audio API key.
That matters because older integration advice often assumes every provider needs a custom webhook bridge. With LiveKit, Fish Audio is already part of the documented model layer. Confirm the model ID and voice support in the LiveKit TTS documentation before writing implementation code.
Use LiveKit Inference when you want the shortest setup and a single vendor relationship. LiveKit manages the provider connection, rate limits and billing inside LiveKit Cloud, so the agent does not need a separate Fish Audio credential.
Use the Fish Audio plugin when you already own Fish Audio credits, need to keep Fish Audio billing separate, or must use a custom voice that is not exposed through LiveKit Inference. The plugin requires FISH_API_KEY and lives in your own LiveKit agent process.
| Requirement | LiveKit Inference | Fish Audio plugin |
|---|---|---|
| Separate Fish Audio API key | No | Yes |
| Billing owner | LiveKit Cloud | Your Fish Audio account |
| Built-in Fish Audio voices | Yes | Yes |
| Existing custom voice | Verify current support | Supported with the voice reference ID |
| Production responsibility | LiveKit manages provider routing | You manage the direct provider connection |
LiveKit Inference uses the TTS class from its inference module and a Fish Audio model ID such as fishaudio/s2.1-pro. Set the language, voice and model options in the AgentSession, then audition the result with the same network and audio transport used by callers.
Start with s2.1-pro when expression and conversational delivery matter. Compare Drama 3 when the role needs more dramatic contrast, and S2 Pro when its voice fit or latency behaviour is better for the workflow. Model names are versioned provider contracts, so pin the exact ID you test instead of silently following a moving alias.
For anything beyond a prototype, keep the model ID, voice ID, language, latency mode and other speech settings in versioned agent configuration. A prompt change can alter sentence length and therefore perceived latency even when the TTS provider is unchanged.
Install LiveKit's Fish Audio plugin in the Python agent environment, store a Fish Audio API key as FISH_API_KEY, and pass the voice reference ID, model and latency mode into the plugin configuration. Do not place the key in model prompts, front-end code or tracked environment files.
Choose the plugin when the approved voice is the reason for using Fish Audio. A custom voice is a product asset, not a display preference: keep the voice ID, speaker consent and intended use beside the agent version that references it.
The LiveKit Fish Audio plugin guide lists the current model names, parameters and voice limitations. Product APIs change; use that page as the implementation source of truth and this guide for architecture and launch decisions.
Latency mode is the first control. A normal mode favours quality, balanced mode reduces delay, and low mode prioritizes the fastest response. Test all three on the same call scripts before setting a default, because the acceptable tradeoff depends on whether the agent reads a confirmation or explains a complex policy.
Prosody controls are the second. Speed, volume, temperature and text normalization affect whether a reply sounds clear on a telephone or a browser speaker. Normalization helps with numbers, dates and currencies in supported languages, but names and mixed-language terms still need a listening test.
Voice stability is the third. Long responses may be split into chunks, and previous-chunk conditioning can preserve delivery across those sections. Measure the whole answer, not one isolated sentence.
Measure from the caller's final syllable to the first audible Fish Audio reply through the complete LiveKit path. Record p50 and p95 rather than an average, and separate STT, LLM, Fish Audio time to first audio, network transport and client playback.
Then interrupt the agent at the start, middle and end of a response. Confirm that in-flight speech stops, the transcript records the right turn and the next response does not repeat stale text. These behaviours belong to the orchestration layer, so changing the TTS model alone cannot fix a poor turn-taking policy.
Use short answer, long-answer and failure scripts. Include product names, account numbers, dates, prices and one escalation phrase. Review at least one real telephone recording because the codec and handset alter clarity in ways a studio sample will not reveal.
Configure a second voice that preserves the same role, language and approximate pace. A technically successful fallback that changes from a calm support agent to an energetic announcer is still a failed customer experience.
Keep fallback configuration in LiveKit rather than attempting to hide provider failures inside the prompt. Alert when fallback traffic rises, and document whether the call continues on the fallback voice or escalates to a human after a threshold.
The Vapi custom TTS guide and Retell fallback guide explain the same architectural boundary in other agent orchestration platforms.
LiveKit Inference usage is billed by LiveKit Cloud, while the Fish Audio plugin uses your Fish Audio balance. In either path, the agent platform, telephony, STT, LLM and fallback provider are separate cost lines.
At fishaudio.lol, one Fish Audio credit covers about 1,000 characters and the Studio pack includes API access. A typical minute of natural speech is about 140–150 English words, so plan by the characters the agent will actually speak, including greetings, confirmations and retries.
The TTS API pricing guide shows how to convert character volume into credits. Review current LiveKit Inference pricing separately because managed provider pricing and Fish Audio prepaid credits are not interchangeable.
fishaudio/s2.1-pro, then verify model and voice availability for every language.Yes. LiveKit documents Fish Audio models in LiveKit Inference and also provides a Fish Audio plugin for connecting directly to the Fish Audio API with your own key.
Use LiveKit Inference when you want managed billing, LiveKit infrastructure and no separate Fish Audio key. Use the plugin when you need your own Fish Audio billing or an existing custom voice that is not available through Inference.
Start with fishaudio/s2.1-pro in LiveKit Inference for expressive real-time speech. Compare Drama 3 or S2 Pro on the exact voices and languages in your call flows before choosing a production model.
Use the Fish Audio plugin with a Fish Audio API key and reference ID when the agent must use an existing custom or community voice. Verify the current LiveKit Inference and plugin voice support before launch.
Measure p50 and p95 time from the caller finishing a turn to the first audible Fish Audio reply through the full LiveKit, STT, LLM, network and playback path.