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

Quickstart

agent.yaml
That is a whole transcriber. provider: says who runs it, model: says which one, and the name you give the entry, transcriber here, is how the rest of the package refers to it.

Every key a listen binding takes

Only model: is required. The rest narrow where the model runs and what happens when it fails.
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
BCP-47 language tag, such as en or en-US, on listen or speak. Omit to leave language selection to the integration.
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 or a model. 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 has no custom speech endpoint at all, and neither does the slng target.
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.
list of strings
Names from the same think or listen section, in retry order. Omit for no fallback chain. Cycles and other roles are refused; Pipecat refuses generated fallback.

One key, many models

SLNG serves a speech 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 model. The difference is who runs the model and how it is billed, which docs.slng.ai covers.

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.

Which shape to pick for listening

The scaffold and every example take the proxied route. Routing through a hosted id adds a hop the proxied route skips, on the one leg the caller waits through on every turn, from the end of their speech to the final transcript. Measure your own route rather than assuming this holds for you; see Optimizing your agent.
Those are the only exact ids the docs name, because they are the ones the examples run. The full SLNG catalog, with languages, regions and hosting, is at docs.slng.ai/models; any id from there goes in model: as written.

Pipecat

An unlisted provider is legal on Pipecat on one condition: it has to be a genuinely OpenAI-compatible endpoint, named with endpoint_env. Without that it is refused, and the message lists what the role does take.

LiveKit

This list is closed. LiveKit speech to text has no custom endpoint slot, so a provider that is not here cannot be bound at all.

The difference between the two

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

Fallback

fallback: names other listen entries, tried in order when the primary transcriber’s call fails:
agent.yaml
What that one block compiles to depends on the target:
Pipecat does not emit a generated fallback yet, so validating the same package against a Pipecat target refuses it. The SLNG list uses the same vendor/model shape as the primary binding.

Troubleshooting

The provider is refused, and the message lists other names

The vendor is not on your target’s list for this role. Fix: pick one from the list above, or on Pipecat point endpoint_env at a variable holding an OpenAI-compatible endpoint. On LiveKit there is no such escape for listening.

language is refused on a provider that clearly supports languages

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

voice, speed, temperature, top_p or top_k is refused

Those are speak and think fields. A transcriber takes none of them. Fix: move the key to the binding it belongs to, or delete it.

pace, endpointing_delay or semantic_endpointing is refused

All three belong on a turn binding, which decides when the caller has finished. Fix: move them; see Turn detection.

The package compiles for LiveKit and is refused for Pipecat

Pipecat does not emit listen fallback yet. Fix: remove fallback: from the listen section, or keep that package on LiveKit or slng.

Where to go next

Text to speech

The voice the caller hears.

SLNG Execution Layer

The SLNG Execution Layer behind these models.

Regional infrastructure

Place speech compute and the agent worker separately.