Voice & language
Voice engines, voice options, dispatch precedence, and language support.
OpenPhn supports voice engines at call runtime. The default engine runs Gemini 3.1 Flash Live (native audio, voice Aoede); Grok Voice Think Fast 1.0 is available as an experimental challenger. The engine is resolved per-call by walking a precedence chain — per-Number override → per-Tenant default → system default — so you can opt one phone line into an experimental engine without touching the rest of your account.
The default engine key is gemini_25 for historical reasons — it
predates the 3.1 upgrade. Despite the name, gemini_25 runs
gemini-3.1-flash-live-preview today. gemini_31 is an explicit alias
of the same model, kept for A/B continuity; selecting it is
equivalent to the default.
Available engines
| Engine | Identifier | Notes |
|---|---|---|
| Gemini 3.1 Flash Live | gemini_25 | Default. Runs gemini-3.1-flash-live-preview, native audio, voice Aoede. Broadest voice catalog. |
| Gemini 3.1 Flash Live (alias) | gemini_31 | The same model under an explicit key — kept for A/B continuity. Equivalent to the default. |
| Grok Voice Think Fast 1.0 | grok_think_fast | Experimental challenger. Leads on tool-use + state-tracking on the Sierra τ-voice benchmark. Currently routed to ~5% of new tenants as an A/B; opt in manually via the precedence chain below. |
Dispatch precedence (highest priority first)
When OpenPhn dispatches a call, it picks the voice engine by walking this chain:
- Per-Number override —
numbers.voice_engine, set viaPATCH /v1/numbers/{id} { "voice_engine": "grok_think_fast" }. Useful when one phone line is a test bed. - Per-Tenant default —
tenants.voice_engine_default, set viaPATCH /v1/tenants/me { "voice_engine_default": "gemini_31" }(owner only). Applies to every call placed without a Number override. - System default —
gemini_25until OpenPhn promotes a challenger.
If the Tenant has set voice_ab_disabled: true, the chain short-circuits
to the system default — useful as a kill switch if an experimental engine
regresses in production.
Choose a voice on call create
The voice_engine field on POST /v1/calls is optional. When you set
it, the call uses that engine directly (bypassing the precedence chain
for that one call):
{
"to": "+14155551234",
"objective": "...",
"outcome_schema": { ... },
"consent_type": "prior_express",
"voice_id": "puck",
"voice_engine": "grok_think_fast",
"language": "en-US"
}voice_engine—gemini_25,gemini_31, orgrok_think_fast. Omit to use the precedence chain.voice_id— picked fromGET /v1/voices(each entry lists which engines support it).language— BCP-47 (en-US,es-US,fr-FR, etc.).
List voices
curl https://api.openphn.com/v1/voices \
-H "Authorization: Bearer sk_live_..."Each entry includes provider, gender, language, supported engines,
and a preview URL.
A/B testing engines
OpenPhn runs a continuous A/B on the system default. Telemetry is
captured per engine: completion rate, transfer rate, error rate, p50/p95
duration, cost per completed call, error rate, plus a Sentry tag and a
PostHog property on every call_completed event.
If you're on the experimental cohort and want to opt out, set
voice_ab_disabled: true on the tenant. If you want to opt INTO an
experimental engine, set voice_engine_default explicitly.
OpenPhn evaluates engine promotion against the voice-engine promotion runbook — a challenger must clear four gates (volume, lift, cost, stability) over a 30-day window before it can become the system default. The next promotion review is 2026-06-22.
Failover & reliability
OpenPhn guards against a voice provider being down at call time:
- Engine health gating + connect-time failover. Before a call connects, OpenPhn checks each engine's recent health. If the chosen engine can't establish the live audio session, OpenPhn retries the next healthy engine on the same call before any audio has started — so the caller never hears a failed connection. A background probe restores an engine once it recovers.
- TTS / STT provider chains. Speech synthesis and transcription each run
an ordered provider chain (configurable under Settings → Voice
providers, e.g.
cartesia, elevenlabsanddeepgram, assemblyai). The first healthy provider wins; a provider whose recent success rate drops below threshold is skipped until a probe recovers it.
Mid-call switching of the speech-to-speech engine is not supported — once audio is flowing, the call stays on its engine. Engine failover happens at connect time, before the caller hears anything.