Skip to main content
models.speak picks the service that turns the agent’s words into audio.
SLNG is a host and a proxy, and one key covers both. It runs its own copies of voice models, and it also forwards to the vendors’ own endpoints. So a single SLNG_API_KEY reaches many vendors’ voices, and you choose which of thirteen regions the audio is generated in. One key, many voices is the whole picture.
On this page:

Quickstart

agent.yaml
This role usually takes a voice as well as a model. The entry’s name, voice here, is how the rest of the package refers to it; the voice: key inside it is the vendor’s voice id.

Every key a speak binding takes

Which of model: and voice: are required depends on the vendor, and the refusal names whichever one is missing.
string
A provider supported for this role and target, listed on the model pages. Required for an API binding; there is no inferred API provider. local selects local placement.
string
Provider model id, passed through as written. Required where the selected integration requires a model; otherwise its default applies. No model id is checked against a provider catalog.
string
A voice id accepted by the selected model and provider. Unmute forwards it without checking a voice list. If omitted, the integration may choose its default or require a value. An unknown id can fail only when speech runs.
number
Speaking speed on a speak entry. Provider-defined values and limits; omitted leaves the provider default.
string
A fixed BCP-47 language tag such as es or en-US, on listen or speak where the integration supports it. Accepted languages depend on the selected provider and model. Omission keeps that integration’s default; it does not promise automatic detection. {{language}} is refused. Unmute exposes no tool or variable binding that changes this setting during a call.
api | local
Whether the model is called over the network or runs in the agent’s own process. Left out, it is api whenever the entry names a provider, a model or a voice. local is refused on the slng target, which has no machine of yours to run on.
an environment variable name
Points at a variable holding an OpenAI-compatible endpoint URL. This is what lets a vendor that is not on Pipecat’s list through. Pipecat only: LiveKit’s OpenAI plugin carries no language slot for speech, so there is no custom endpoint for this role there, and the slng target has none either.
object
Provider parameter names and values. Omit to add no extra parameters. Provider limits apply; Unmute does not define a universal accepted set. SLNG params.world_part is checked against its supported regions.
A speak entry cannot carry fallback:. That key is legal only on think and listen; see Reasoning model.

One key, many voices

SLNG serves a voice model two ways, and the shape of the id says which: Both are one binding and one SLNG_API_KEY. The point is that you do not collect a key per vendor to reach a vendor’s voice. The difference is who runs the model and how it is billed, which docs.slng.ai covers. For listening the two differ in speed by enough to matter, and Speech to text explains the gap. For speaking nobody has measured them against each other. The scaffold takes the proxied route here to match the transcriber, not because it is known to be faster.

Where it runs

params.world_part picks the SLNG speech gateway that serves the call:
agent.yaml
Thirteen are accepted: us-east, us-west, br, eu-west, eu-north, gb, za, il, jp, sg, id, au and in. Left out, the SDK default stands. A hosted slng/ id is a separate question: those run only where SLNG has put them, so a region you need may rule one out. Regional infrastructure explains the separate model, worker and media regions.
These are the ids used by the scaffold and examples. The full SLNG catalog is at docs.slng.ai/models; any id from there goes in model: as written, for example slng/cartesia/sonic-3 with a voice id of its own.

Pipecat

An unlisted provider is legal on Pipecat on one condition: it has to be a genuinely OpenAI-compatible endpoint, named with endpoint_env.

LiveKit

This list is closed, and closed harder than Pipecat’s: LiveKit’s OpenAI plugin carries no language slot for speech, so there is no custom-endpoint fallback for this role at all.

The difference between the two

Pipecat has openai, LiveKit has gemini. Everything else matches.

Troubleshooting

The binding is missing a model, or missing a voice

The vendor needs both and the package gave one. Fix: add whichever the message names. Which of the two a vendor needs is the vendor’s own decision, not a rule this page can shorten.

voice is refused on a provider that clearly has voices

The vendor carries the voice inside the model id rather than in a separate field, so the binding has no slot for it. Fix: drop voice: and name the voice variant in model:.

fallback is refused

A speak binding cannot have one, on any target. Fix: remove it. Fallback is legal on think and listen only.

temperature, top_p or top_k is refused

Those are think fields, which shape what the model writes rather than how it is spoken. Fix: move them to the think binding, or delete them.

endpoint_env is refused on LiveKit

LiveKit has no custom speech endpoint at all. Fix: bind a vendor from the LiveKit list above, or compile to Pipecat, which emits the endpoint_env lookup.

Find a Soniox voice

Use the SLNG Soniox voice catalog to hear voices and find their ids. Check the SLNG dashboard for voices available to your selected model if the catalog differs. Copy the id exactly; do not infer an id from a person’s name or change its capitalization. For a direct Soniox binding, use Soniox’s voice documentation.

Multilingual speech

The reply text and its spoken delivery are separate. A model can produce correct Spanish text while TTS still uses an English language setting or voice accent. Listen to each intended language before shipping a multilingual agent. See SLNG’s Soniox catalog and ElevenLabs language guidance. Provider support for runtime changes does not mean Unmute exposes those changes. STT has its own language behavior. Do not assume that leaving listen.language out enables detection for every provider. For example, Deepgram multilingual recognition uses language: multi; see its LiveKit integration. Check the selected STT model separately from TTS. For a Spanish-only agent, use a Spanish prompt and a speech binding configured for Spanish. For a multilingual brief, choose TTS that handles the required languages with the settings Unmute can emit. If that is not possible, explain the tradeoff before reducing the agent to one language.

Where to go next

Reasoning model

The model that decides what to say.

SLNG Execution Layer

The SLNG Execution Layer behind these models.

Regional infrastructure

Place speech compute and the agent worker separately.