audio primitive gives your agent ears and a voice. One endpoint covers all three speech modalities, routed automatically across a managed catalog of speech models:
You never manage a speech-provider account or key. Naive holds the credentials, picks the model, and bills each call in Naive credits from the exact cost the request reports.
Speech-to-speech is not transcription followed by synthesis. The model listens to the audio itself, so it hears tone, hesitation, and emphasis that a transcript throws away.
CLI First
Endpoints
Routing
Every modality takes either a managed alias or an exact model slug.
Managed routes enable automatic fallbacks; a pinned model does not retry elsewhere unless you opt in with
provider.allow_fallbacks. Responses carry a route object explaining what was considered, filtered, and attempted:
Route by language
Setlanguage and leave model unset. The request goes to the best model for that language, and you never name a model yourself.
Always send
language when you know it. On a managed route it skips language detection entirely — that lowers latency on every request, and the model transcribes against the language you specified instead of guessing, which improves accuracy. Use a BCP-47-style code (de, es, pt-BR); a region tag with no dedicated model falls back to its base language.Steering speech synthesis
Withmodel: "tts/auto" and voice: "auto" you can name the capability that matters and let Naive rank models for it. Omit feature and it is inferred from your text, instructions, language, and length.
Speech-to-speech has its own set:
Emotion Understanding, Emotion Alignment, Expressive Robustness, Voice naturalness, and Problem redirecting.
Constraining the route
The optionalprovider object narrows and orders candidates for a single request:
Requests are pinned to
["us", "global"] unless you say otherwise. The model catalog spans regions including cn-beijing, and a managed alias would otherwise be free to pick any of them. Naive applies this residency floor to every request that doesn’t set provider.region; it costs 3/83 transcription, 5/54 speech, and 2/11 s2s endpoints.Setting provider.region yourself replaces the default entirely — it’s a default, not a ceiling — so pass ["eu"] (or a wider list) when you need different residency.Transcription
Key parameters
Multipart requests take the same fields as form values, but
provider, metadata, options, and keyterms must be JSON-encoded strings. Booleans and numbers are coerced for you.Long recordings
Add?async=true to queue the job. You get a 202 with a request id instead of holding the connection open:
queued → running → succeeded (or failed / canceled). Result fields stay null until it succeeds, and the credit charge lands on the first poll that sees succeeded — polling again never double-charges.
Speech synthesis
The response is binary audio in the requestedresponse_format, streamed straight through.
Naive returns the upstream request id on the
X-Audio-Request-Id response header. Use it with GET /v1/audio/requests/{id} for the route trace, or GET /v1/audio/usage/{id} for the cost — a binary body has nowhere to put a usage object.
Supported formats vary by model. Check
GET /v1/audio/endpoints for a model’s limits.formats before pinning one.Audio conversations
Send one spoken turn and get a spoken reply, plus both transcripts.Catalog & observability
GET /v1/audio/endpoints is the detailed view: per-endpoint capability flags (diarization, word_timestamps, stream, redaction, translation, …), price unit and rate, accepted formats, and byte/duration limits. Use it when you need to pin a model and want to check it can actually do the job first.
Multi-tenant
Like every primitive, the routes are AccountKit-gated and available per-user:Billing
Naive bills the exact cost each request reports, times a small markup, converted to credits ($0.05 = 1 credit) — the same model as LLM, with no per-model rate table to keep in sync.
Catalog, usage, and route-trace reads are free. Async transcriptions are charged once, when the job completes. Very short calls can round below credit precision and cost nothing at all. See Credits.
Agent tools
Theaudio primitive is part of agentTools(). The model can call naive_run_primitive(primitive: "audio", method: "transcribe" | "transcription" | "converse" | "models", arguments: { ... }).
Synthesis is intentionally not exposed as an agent tool: it returns raw audio bytes, which have no useful representation in a model’s context. Call POST /v1/audio/speech (or naive.audio.speech()) directly and write the bytes to a file or a signed URL.