v7.3.0 — Per-agent voices
Voice now belongs to agents. Configure one provider, create multiple agents that share it — each with its own voice.
✨ Highlights
🎙️ Per-agent voice selection
- Provider-aware voice picker in the Agent form: dropdowns of validated catalogs for OpenAI Realtime (10 GA voices), Google Live (30 prebuilt voices), and Deepgram Voice Agent (Aura models) — plus suggestions with custom cloned-voice IDs for xAI Grok. ElevenLabs Agent voices remain managed on the ElevenLabs platform; pipeline TTS voices are unchanged (per-agent pipeline voice is planned).
- Safe by default. The provider-level voice becomes the Default Voice — every agent without its own voice behaves exactly as before this release. Unrecognized values (including stale text from the old informational field) log a warning and fall back to the provider default — a bad voice value never fails a call.
- Observable end-to-end. Every call logs the resolved voice and its source (
override/agent/provider-default), and Call History shows it per call — e.g. "Voice: marin (from agent)" — so you can always verify what a call actually used. - Instant. Agent voice changes apply on the next call — no engine restart.
🧰 Under the hood
- Single-source voice catalog (
src/utils/voice_catalog.py) shared by the engine's validation, the newGET /api/config/providers/metaendpoint, and the Agent form — verified complete against official OpenAI / xAI / Google / Deepgram documentation. - Call History gains
voice/voice_source(additive, nullable — no migration steps). - Optional
voice:key on YAML contexts for headless installs, with identical semantics.
⬆️ Upgrading
Standard upgrade — no migration steps, no config changes required. Existing agents have no voice set and keep using their provider's voice.
git fetch --tags && git checkout v7.3.0
docker compose build admin_ui && docker compose up -dOr use the Admin UI's Updates page.
Docs: Voice Selection guide · validation matrix (7 live PSTN calls, including the per-agent override validated by ear)
Thanks to @foytech, whose PR #497 seeded this feature and whose production testing shaped it — co-authored on the core commits.