How Skysay handles provider languages and voices
How provider-reported inventories become searchable, what Skysay still validates for live calls, and what happens when a provider changes its catalog.
Skysay separates two different questions:
- What does the provider currently advertise? The provider reports its voices, voice identifiers, languages, models, and metadata.
- What can this Skysay runtime execute? Skysay declares the speech-to-text, model, and text-to-speech adapters and languages that its workers can run end to end.
The first answer drives browsing and search. The second answer controls whether an AI agent can be saved and used for a call. A provider adding a new voice does not require a frontend release, a manual approval queue, or a generated sample. It also does not make an undeclared call stack runnable by itself.
GPT-Live 1 does not use this cascade language list. Its language is prompt guidance: the agent follows the caller, and the opening language does not lock the rest of the call.
Provider-backed voice cache
For each configured provider, Skysay reads the provider's voice inventory through its adapter and stores a scoped cache. The workspace reads that cache; opening the Voices page or an AI agent never waits for a provider request.
- A managed Skysay credential contributes to the shared managed inventory.
- A bring-your-own credential has a private inventory scoped to that workspace, project, credential, and provider. It is never copied into the managed inventory or another workspace.
- The cache refreshes in the background. If a refresh fails or returns an invalid response, Skysay continues serving the last good inventory.
- Large provider inventories are bounded and marked as truncated. A partial result never proves that an unobserved voice was removed.
- Providers that do not expose a listing API may use provider documentation as their inventory source. The UI identifies the source instead of presenting it as a live provider result.
The provider's language and descriptive metadata are provider-reported information, not an Skysay quality score or accuracy guarantee.
Cartesia Sonic 3.6
Cartesia Sonic 3.6 is a streaming TTS option in the same catalog. It does not ship with a checked-in Skysay voice list: the managed inventory contains only Cartesia voices the provider marks public and not owned by the managed account. With your own Cartesia credential, the inventory is private to that credential and can include its owned or cloned voices.
Choose the exact provider-reported voice ID and a language the catalog offers for the declared runtime stack. The worker never infers a runnable language from a voice name or Cartesia metadata alone. You can enter arbitrary bounded text in Test voice before saving; the preview uses the selected credential and exact ID, never a platform-key fallback. Cartesia TTS is priced in submitted text characters; the catalog is the current source for the applicable price and reserve estimate.
Azure AI Speech
Azure AI Speech contributes two catalog options, and they are independent of each other:
- Transcription — an Azure real-time speech-to-text option, offered for every language Skysay runs except Belarusian and Dari, Sinhala and Tamil included. It is offered alongside the existing options rather than replacing any of them, and it is not the default for any language: an agent uses Azure transcription only if you select it. What it listens for follows the agent's selected languages; see below.
- Voices — Azure's neural voice catalog, through the same provider-cached inventory as the options above rather than a checked-in list. Voices appear once the first refresh has completed.
Azure names each voice for the locale it was built for, and a Tamil voice may
be Indian (ta-IN) or Sri Lankan (ta-LK), so a Tamil agent's accent follows
the voice you pick rather than a separate setting. Transcription is a separate
choice with its own locales: Azure offers Indian Tamil for real-time
recognition and does not offer Sri Lankan Tamil for it at all, so an agent may
speak in ta-LK while listening in ta-IN.
The catalog offers many more voices than there are languages an agent can be saved in, because the inventory reports every language Azure declares for a voice. Test voice works across the whole imported library, so you can hear a voice before knowing whether an agent can be built on it; saving an agent still requires a language Skysay runs, and the editor says so at the point of saving.
Choose the exact provider-reported voice ID and a language the catalog offers for the declared runtime stack. The worker never infers a runnable language from a voice name: a multilingual Azure voice speaks the language you selected, not the one in its identifier. Azure transcription is priced in audio seconds and Azure synthesis in submitted text characters — including the markup Skysay adds around your text, and with some scripts counted at more than one billable character each. The catalog is the current source for the applicable price and reserve estimate. Azure runs on an Skysay-managed credential only — there is no bring-your-own-key path for it today.
An agent listens for every language it is configured for
An agent whose transcriber can compare several languages at once listens for all of its configured languages, in any combination. There is no setting for this: the languages you selected for the agent are the languages it listens for. Azure AI Speech and Google Chirp 2 both work this way.
- The reply language does not change. In Choose before the call, the agent still answers in the language that call was published in. This is not automatic switching; only what the recognizer listens for is wider.
- One selected language means one locale. Nothing is added to a single-language agent, and no language is treated specially.
- Speech in another selected language comes back in that language. Listening for one locale alone, a recognizer writes what it heard into that language's script even when the caller used another, with no error and no low-confidence signal, so the agent answers a question nobody asked. A Sinhala line taking English-speaking callers is the case this was measured on.
- It depends on the transcriber. Deepgram Nova-3 and Soniox detect languages a different way, without a per-agent list, so an agent on either of them listens for the one language its call is in, as before.
- An agent published to follow the caller keeps the candidate languages it published, and nothing is added to that set.
- Outbound calls name their language. Selecting a second language is a
change to how the agent is called, not only to what it hears: starting an
outbound call on an agent with more than one selected language requires
languagein the request, since on these transcribers that is what chooses the published profile the call runs on. A caller that omits it is refused with 400. Inbound calls are unaffected.
Azure compares speech against at most ten candidates at once. An agent configured with more selected languages than its transcriber can compare keeps listening for the one language its call is in. The call is not refused, and nothing about it changes.
Recognition speed with several candidates has not been measured separately from single-language recognition. Test your own conversation before relying on a response time.
Gemini 3.8 Flash-Lite TTS
Gemini 3.8 Flash-Lite TTS (gemini-3.8-flash-lite-tts) is a streaming voice
option next to Gemini 2.5 Flash TTS and Gemini 3.1 Flash TTS. It uses the same
30 Gemini prebuilt voices; each voice carries the gender Google publishes for
it, and speaks every language with that language's own accent.
- Languages. Every call language Skysay runs, Estonian included.
- What it is sent. The sentence alone. Delivery profiles do not apply to this model: it reads everything it receives aloud, so Skysay sends it no style instruction.
- Price. $2 per million text tokens sent and $24 per million audio tokens returned, billed on the token counts Google reports for each reply (about $0.051 a minute at the reserve estimate, 1,500 text and 2,000 audio tokens a minute). Google discounts this model to $0.50 and $6 until 31 December 2026 and charges $1 and $12 from 1 January 2027; the Skysay price is based on the full price from the start, so it does not change in January.
- Existing AI agents keep their saved model. Nothing moves an agent onto Flash-Lite, and the Gemini 2.5 and 3.1 options, their languages and their prices are unchanged. The default voice of an existing language does not change.
ElevenLabs v4 Turbo
ElevenLabs v4 Turbo (eleven_v4_turbo) is a cascade text-to-speech option
next to ElevenLabs Flash and ElevenLabs v3. It is not a voice-to-voice engine,
and choosing it does not switch an agent to GPT-Live or Gemini Live.
- Languages. English, Spanish, French, German, Italian, Portuguese, Dutch, Russian, Swedish, and Estonian. Finnish, Ukrainian, Tamil, and Sinhala are not offered on this model.
- What it is sent. Stability and similarity only. No style, no speed, and no SSML.
- Price. $0.050 per 1,000 characters.
- Existing AI agents keep their saved model. English still defaults to
ElevenLabs Flash (
eleven_flash_v2_5) and Estonian still defaults to ElevenLabs v3 (eleven_v3). This model is the default for none of its languages. It uses the ElevenLabs voices already in the library; the background inventory refresh attaches the new model to those voices. - On a phone call it uses ElevenLabs' dialogue connection, because the
Flash connection rejects this model. The end of a reply decays naturally,
so Skysay does not buffer the reply into sentences the way it does for
eleven_v3.
OpenAI GPT-Live 1
GPT-Live 1's fourteen voices come from OpenAI's documented voice table rather than a listing API, so their inventory is documentation-derived like Gemini's. They carry no per-voice language list on purpose: the engine follows the caller's language and is not qualified per language through the Standard speech-to-text and text-to-speech tables. What Skysay has measured per language, and how to test yours, is on Which languages the voice agent follows.
Because there is no language setting, there is no per-language profile to
publish either. An outbound call names its language in
runtime_config.language and the call opens in that language, for any
language Skysay supports — no publishing step comes first. A language Skysay
does not support is refused before the call is placed. The same applies to
Gemini Live.
Call languages
An AI agent can take calls in a language only when Skysay has both a voice that speaks it and a transcriber that hears callers in it, and the catalog offers only those voices and transcribers for that language. There are 69: English, Estonian, Sinhala, Tamil, German, Spanish, Finnish, French, Italian, Dutch, Portuguese, Russian, Swedish and Ukrainian, plus the languages below, added with Gemini 3.8 Flash-Lite TTS. For each of these, Gemini 3.8 Flash-Lite TTS is the voice.
| Language | Code | Transcribers that hear callers |
|---|---|---|
| Afrikaans | af | Azure AI Speech, Deepgram Nova-3 |
| Amharic | am | Azure AI Speech |
| Arabic | ar | Azure AI Speech, Deepgram Nova-3 |
| Armenian | hy | Azure AI Speech, Deepgram Nova-3 |
| Assamese | as | Azure AI Speech, Deepgram Nova-3 |
| Azerbaijani | az | Azure AI Speech |
| Bangla | bn | Azure AI Speech, Deepgram Nova-3 |
| Basque | eu | Azure AI Speech |
| Belarusian | be | Deepgram Nova-3 |
| Bhojpuri | bho | Azure AI Speech |
| Bosnian | bs | Azure AI Speech, Deepgram Nova-3 |
| Bulgarian | bg | Azure AI Speech, Deepgram Nova-3 |
| Cantonese Chinese | yue | Azure AI Speech, Deepgram Nova-3 |
| Catalan | ca | Azure AI Speech, Deepgram Nova-3 |
| Chinese | zh | Azure AI Speech, Deepgram Nova-3 |
| Croatian | hr | Azure AI Speech, Deepgram Nova-3 |
| Czech | cs | Azure AI Speech, Deepgram Nova-3 |
| Danish | da | Azure AI Speech, Deepgram Nova-3 |
| Dari | prs | Deepgram Nova-3 |
| Egyptian Arabic | arz | Azure AI Speech, Deepgram Nova-3 |
| Filipino | fil | Azure AI Speech, Deepgram Nova-3 |
| Galician | gl | Azure AI Speech |
| Georgian | ka | Azure AI Speech, Deepgram Nova-3 |
| Greek | el | Azure AI Speech, Deepgram Nova-3 |
| Gujarati | gu | Azure AI Speech, Deepgram Nova-3 |
| Hebrew | he | Azure AI Speech, Deepgram Nova-3 |
| Hindi | hi | Azure AI Speech, Deepgram Nova-3 |
| Hungarian | hu | Azure AI Speech, Deepgram Nova-3 |
| Indonesian | id | Azure AI Speech, Deepgram Nova-3 |
| Japanese | ja | Azure AI Speech, Deepgram Nova-3 |
| Javanese | jv | Azure AI Speech |
| Kannada | kn | Azure AI Speech, Deepgram Nova-3 |
| Kazakh | kk | Azure AI Speech, Deepgram Nova-3 |
| Khmer | km | Azure AI Speech |
| Korean | ko | Azure AI Speech, Deepgram Nova-3 |
| Lao | lo | Azure AI Speech |
| Latvian | lv | Azure AI Speech, Deepgram Nova-3 |
| Macedonian | mk | Azure AI Speech, Deepgram Nova-3 |
| Malay | ms | Azure AI Speech, Deepgram Nova-3 |
| Malayalam | ml | Azure AI Speech |
| Maltese | mt | Azure AI Speech |
| Marathi | mr | Azure AI Speech, Deepgram Nova-3 |
| Mongolian | mn | Azure AI Speech, Deepgram Nova-3 |
| Nepali | ne | Azure AI Speech, Deepgram Nova-3 |
| Norwegian Bokmål | nb | Azure AI Speech, Deepgram Nova-3 |
| Odia | or | Azure AI Speech |
| Pashto | ps | Azure AI Speech, Deepgram Nova-3 |
| Persian | fa | Azure AI Speech, Deepgram Nova-3 |
| Polish | pl | Azure AI Speech, Deepgram Nova-3 |
| Punjabi | pa | Azure AI Speech, Deepgram Nova-3 |
| Romanian | ro | Azure AI Speech, Deepgram Nova-3 |
| Serbian | sr | Azure AI Speech, Deepgram Nova-3 |
| Slovak | sk | Azure AI Speech, Deepgram Nova-3 |
| Telugu | te | Azure AI Speech, Deepgram Nova-3 |
| Uzbek | uz | Azure AI Speech |
Chinese is Mandarin, whether written in simplified or traditional characters. Arabic is Modern Standard Arabic; Egyptian Arabic is a separate language. The Dari transcriber is a Persian (Iran) model. Every language above was measured before it was added: Flash-Lite spoke a greeting and a short line 15 times each, and a transcriber read every clip back at telephone quality. That is a qualification check, not an accuracy guarantee: test your own conversation before going live.
Choosing a language and voice
Skysay does not choose a default or recommended language or voice for a new AI agent. Choose its languages and opening language explicitly, then a shared voice stack that can run them. Optional per-language overrides do not require separate agent copies or a manually generated sample for each language. The picker shows a flag only where a locale has an unambiguous region; otherwise it uses a neutral language icon rather than guessing a nationality.
Speaking several languages versus listening for them
In Choose before the call, the selected language profile stays fixed for that call. Follow the caller additionally needs a transcriber mode that can recognize the selected languages in the same conversation. Skysay checks that separate capability against the existing provider/model declaration; it does not infer simultaneous recognition by adding together monolingual language lists. A model may therefore work for a fixed-language call but not for that language combination in follow mode.
An unsupported combination produces a configuration error, not an automatic provider or voice replacement. This is a runtime compatibility check, not a manual language approval or audition requirement. The supported provider mode also does not guarantee accent accuracy or acoustic quality; test your actual conversation before relying on it.
Automatic switching availability by language
Follow mode has two paths, and they are not available on the same transcribers. The explicit request path is always available in follow mode: the caller asks for a language, and the agent switches if that language is one of the published ones. Automatic switching additionally needs the transcriber to report which language it heard, and only some do.
Read each STT catalog entry's language_detection metadata for its supported
language set, automatic or request-only behavior, and candidate limit. The
editor combines that information with the selected voice configuration to
show the accepted languages. Do not infer the final set from this table or
from a provider's monolingual language count.
| Transcriber | Listening behavior | Automatic response-language switching |
|---|---|---|
| Azure AI Speech Real-time | A selected candidate set, with a maximum of 10 simultaneously | Yes, when the adapter reports stable language evidence |
| Deepgram Nova-3 | The model's declared multilingual set | Explicit request only with the current integration |
| Soniox Real-time v5 | Broad language identification for new Auto configurations; existing strict-hint publications retain their construction | Yes, within the published reply-language set |
| Google Chirp 2 | Fixed-language recognition | Not available in Follow mode |
Google Chirp 2 is the only Google speech-to-text option the catalog offers. Google Speech V1 is not selectable.
A provider may support more fixed languages than simultaneous candidates. Recognition of a language also does not prove that your selected TTS voice can speak it. Skysay preserves your voice choice and shows configuration conflicts instead of choosing a different voice automatically.
Soniox can hear languages outside a restricted reply-language set. That does not authorize a reply-profile switch outside the published set. Azure compares speech against its candidates and can select one even when the caller spoke another language. Neither mechanism guarantees that unsupported speech will be identified as unsupported.
Where automatic switching is available it takes two consecutive final results that agree on the same language. That is deliberately conservative. A transcriber typically needs a moment to notice a language change, so the first moments after a caller switches are often still transcribed as the previous language; requiring two agreeing results means a single such result cannot move the call. The delay depends on when the recognizer returns those results; it is not a fixed number of milliseconds or sentences. A single final result in another language is insufficient. Ask for the language directly to use the explicit-request path, which does not wait for two detection results.
Automatic switching happens between sentences, never inside one. A caller who drops single foreign words into an otherwise Estonian sentence stays on Estonian, which is the intended behavior.
Authenticated browser tests use the same production conversation runtime as phone calls, including supported provider language evidence. Publish the configuration before testing it. An anonymous homepage demo is a separate runtime path; do not assume its automatic-detection behavior from an authenticated browser test. Test browser and phone behavior separately when both transports matter to your deployment.
What the caller hears when the language changes
A switch is never silent. When a caller asks for one of the published languages, the agent confirms the change out loud in the new language and carries on from what the caller last said — the reply the agent was giving when the request arrived is replaced, not resumed, because the transcriber and voice are exchanged at that boundary.
When a caller asks for a language that is not one of the published ones, the agent says so and names the languages it can speak on this call, then continues in the current one. Publishing a narrower language set than an agent's instructions promise is the usual way to reach this: update the system prompt and the opening message together with the language set, or callers will keep being offered a language the call cannot deliver.
Follow mode on an agent that runs a workflow
Follow the caller can be published on an agent whose calls run an
agent workflow. The workflow is a set of rules that
does not depend on language: when the transcriber reports stable evidence that
the caller is speaking another published language, or, when the workflow
declares a language_change interrupt, the caller asks for one, the voice and
reply language switch and the workflow run continues from the step it is on,
with nothing skipped. A language request is itself a turn: the current step is
entered again, which counts toward its visit limit and the workflow's turn
limit.
- Every published language has its own wording. When you publish a
workflow, each spoken line (every question, statement and farewell) is
rendered once into each of the agent's other selected languages by the
workflow-authoring model and stored with the published version; the language
you wrote the workflow in is kept exactly as written. Placeholders such as
{{balance_amount}}are carried through unchanged and filled with the same approved figures in every language. Nothing is rephrased during a call: a switched caller hears the rendered line, word for word. The rendered languages are listed on the workflow's publish panel. - Adding a language to the agent generates that language's wording automatically. Publishing a language set that the workflow's current version cannot speak renders the missing lines then and there and creates a new workflow version; if the model cannot render them, that language publish is refused with the reason rather than published silently.
- If the switch lands while the agent is speaking a step, that step is spoken again in the new language; if it lands while the caller is speaking, the next step is simply spoken in the new language.
- A caller's spoken request for another published language is handled by the
workflow's
language_changeinterrupt: when it fires and names one of the published languages, the agent switches, speaks the current step again in that language and continues from there, without taking the interrupt's authored route. The authored route runs only for a request the call cannot serve, such as an unpublished language, and does not switch. A workflow without alanguage_changeinterrupt switches only on transcriber evidence; agents that run a workflow have no separate switch-language tool. - Every followed language needs a listener and voice that accept it. On a spoken workflow call the caller is heard by the agent's Voice → Transcriber listener, which must accept every followed language. Each language's voice is checked for its own language only, so the languages can use different voice providers, such as English on ElevenLabs Flash v2.5 and Sinhala on an Azure voice. Otherwise the call is refused before it starts; see Which voices and listeners a spoken workflow accepts.
- Usage is billed per language segment exactly as on a free-form call.
Browse and test the cached catalog
The Voices workspace page is a flat, paginated list rather than a separate curated collection. Its horizontal Language, Accent, Character, and Provider filters are searchable multi-selects:
- selecting several values within one filter means any of those values;
- selections across different filters are combined; and
- clearing every selection means all cached voices again.
The filter values come from the cached provider metadata. Character means provider-reported style or persona tags, not a gender inferred by Skysay. A duplicated human language label stays distinguishable by its provider code rather than collapsing one provider claim into another.
Use Play to hear a voice. When a target language is selected, a compatible cached recording plays immediately only when its catalog provenance proves that it matches the target. At present, that proof exists for English only on an Skysay ingestion-synthesized sample; a provider recording without a spoken-language assertion is not assumed to be English. With no Language filter or chosen preview language, an existing recording can instead play as published, and the row labels unverified spoken language rather than inferring one. If no suitable recording exists, or if you enter your own text, Skysay uses the same explicit live preview command as Test voice. That command is bounded, metered and rate-limited for the workspace. If it cannot run, the page gives a local safe error; it does not show a provider credential, trace, or raw provider response.
With one matching Language filter, the full library previews that language. If several selected languages match a voice, choose one in its searchable preview language control; the library does not silently choose a first match. Text you enter is spoken exactly as written and is not translated. With no text, the library uses a localized sample sentence for the chosen language when available; otherwise enter your own text rather than receiving an English fallback. See Voice Library for the complete browsing and preview behavior.
Browsing or previewing a provider claim does not select it, make it a default, or make it callable. Saving and calling still validate the complete STT, model, TTS, language and billing stack, and name the component that prevents the combination from being used.
Use Test voice with your own text as the practical validation before you save. For a managed credential, a new voice selection must belong to the managed scoped inventory. For a bring-your-own credential, the exact voice ID must be accepted through that credential's own validation/preview path; a similarly named or identical managed voice does not authorize it.
The runnable language set is still bounded by the Skysay worker registry. The selected provider, model, and language must form a declared streaming stack for calls. Provider-advertised languages outside that set may be browsable or previewable, but they are not silently admitted to a live agent.
When a provider removes a voice
Skysay never replaces an AI agent's stored voice with a fallback voice. Changing a voice changes the agent's identity and must remain an explicit user choice.
If a completed provider inventory no longer contains an existing stored voice, the editor keeps that exact selection visible and warns you. An unavailable or partial provider listing is not enough to disable it. If an exact provider request definitively reports that the voice no longer exists, Skysay marks that exact scoped voice unavailable and blocks new call admission until you choose another voice or an explicit successful validation clears the marker.
This fails visibly instead of letting a provider catalog change make an agent sound like somebody else.
Reading the current catalog
The catalog is a pure cached read and never calls a provider while you read it:
GET /v1/agent-catalog?language=ta&metered_only=trueEach runnable entry carries the provider, model, declared languages, scoped
voice inventory, cost and latency provenance, and credential contract. Use
voice_count and voices_truncated before assuming a bounded response is the
provider's complete inventory.
For per-language selection across a campaign, see Multilingual outbound calls. For exact request and response shapes, see the generated API reference.