Ultravox is a platform for real-time voice agents. Kova plugs in through Ultravox’s generic external-TTS adapter: you point an agent straight at the Kova API, no Kova-side setup required, so this works today.
Set an externalVoice of type generic on call (or agent) creation, pointed at the Kova /v1/tts endpoint. Kova returns the audio base64-encoded inside a JSON body, so jsonAudioFieldPath and jsonByteEncoding tell Ultravox how to read it.
{
"externalVoice": {
"generic": {
"url": "https://api.kova.ai/v1/tts",
"headers": {
"x-api-key": "kova_sk_your_key_here",
"Content-Type": "application/json"
},
"body": {
"text": "{text}",
"voice": "ash",
"response_format": { "encoding": "pcm", "sample_rate": 24000 }
},
"responseSampleRate": 24000,
"responseMimeType": "application/jsonl",
"jsonAudioFieldPath": "audio"
}
}
}
body.text: keep it as "{text}". Ultravox replaces it with the agent’s text on each turn.
body.voice: any speaker id from /v1/tts/speakers, for example ash.
body.response_format: encoding: "pcm" returns raw 16-bit mono little-endian PCM. Keep sample_rate equal to responseSampleRate.
responseMimeType / jsonAudioFieldPath: Kova returns { "audio": "<base64>" }, so Ultravox treats the response as JSON, reads the audio field, and base64-decodes it. This exact config is validated end to end against Ultravox Realtime.
headers.x-api-key: your Kova API key from platform.kova.ai. Ultravox sends it on every request; Kova validates and bills it.
externalVoice is mutually exclusive with the voice field, set one or the other. Each config maps to one Kova voice; create one externalVoice per voice you want to offer.
Billing and errors
Usage is billed to the API key in the x-api-key header, the same as direct API calls. An invalid key returns 401; an account out of credits returns 402. Top up at platform.kova.ai/dashboard/billing.