Speech, timed
Every other speech endpoint hands you a file and leaves you to guess where the words fell. Speaker hands you the file and every word's start and end in milliseconds — enough to cut captions, drive a timeline or sync a mouth, without a second pass over the audio.
The timings are derived, and every response says how. No speech engine hands back word timings; Speaker works them out — from the engine's own character alignment where there is one, otherwise by transcribing the audio and aligning it back onto your text. The words returned are always yours.
No subscription — pay in Ounie credits, per 1,000 characters
Your agent just found its voice.
{ "word": "found", "startMs": 1020, "endMs": 1380 }Voices
Every voice below comes from the engine currently serving requests, with the accent, age and the kind of work it was built for. Three quality rungs sit across them: Fast, Balanced, Rich — fastest, warmest, and the most natural.
Speaker runs several speech engines and falls through to the next when one refuses work, so voices are not interchangeable between them. GET /api/voices always returns the voices of the engine that would take your call right now, and a voice it does not have is refused rather than swapped for someone else.
Adam
socialDominant, Firm
male · american · middle aged
Alice
explainerClear, Engaging Educator
female · british · middle aged
Bella
explainerProfessional, Bright, Warm
female · american · middle aged
Bill
adsWise, Mature, Balanced
male · american · old
Brian
socialDeep, Resonant and Comforting
male · american · middle aged
Callum
characterHusky Trickster
male · american · middle aged
Charlie
conversationDeep, Confident, Energetic
male · australian · young
Chris
conversationCharming, Down-to-Earth
male · american · middle aged
Daniel
explainerSteady Broadcaster
male · british · middle aged
Eric
conversationSmooth, Trustworthy
male · american · middle aged
George
narrationWarm, Captivating Storyteller
male · british · middle aged
Harry
characterFierce Warrior
male · american · young
21 voices in the catalogue. GET /api/voices returns all of them, with the models and every language each one speaks.
The timings contract
No speech engine returns word timings, so there are two honest ways to get them and every response tells you which one it used, in timings_source.
provider_alignment
The engine returns characters, each with a start and an end. A word is a run of those characters between two spaces. Exact — no model looks at it, nothing is estimated, and you can re-derive every number from the same response.
transcribed
The engine returns audio alone, so Speaker transcribes it and aligns the transcript back onto your text. Transcribers mishear names — ours came back with “Oni” for “Ounie”. So the transcript supplies the clock and your text supplies the words. Any word the transcriber missed is interpolated and flagged estimated.
A word takes its first character's start and its last character's end. Whitespace ends a word and belongs to none. Punctuation stays attached, so a token is usable as a caption exactly as it arrives.
If the timings don't come back, you don't pay.
A run that produces audio but no usable word timings settles at zero credits and refunds in full, and on the keyless rail it is refused before the payment is settled. Audio on its own is not what you asked for — and it was never something you could have caused.
Pronunciations
Send a map of terms to respellings and the engine reads the respelling instead. It is the trick Ounie's own video pipeline uses on its own name, exposed as a parameter rather than hidden in somebody's script.
Ounie
The spelling your brand actually uses.
Oonie
A plain respelling, applied before synthesis. Not a phoneme dictionary, and nothing is stored.
Ounie
Your spelling, back where it belongs — the captions are publishable as they arrive.
A respelling has to be a single word. Two tokens where you wrote one would put the timings out of step with your script, so that request is refused up front rather than answered with something quietly wrong.
For developers & AI agents
Three rails, one meter. Every call refuses rather than overdraws: an agent that runs out of credits gets a 402 with the exact shortfall and a link to top up, never a silent debt. And while the engine is down, every rail refuses up front — no quote, no hold, no signature.
Bearer key or the shared Ounie session cookie. Synchronous — the audio URL and every word's start and end come back on the same response.
curl -X POST https://speak.ounie.com/api/speak \
-H "Authorization: Bearer spk_live_…" \
-H "Content-Type: application/json" \
-d '{"text":"Your agent just found its voice.",
"model":"fast",
"pronunciations":{"Ounie":"Oonie"}}'speak, estimate_speech_cost, get_speech, list_speech, list_voices, get_credit_balance, get_pricing, whoami. Works in Claude, Cursor, ChatGPT and the Ounie AI Team — that last one can't set headers, so the key rides the URL.
Endpoint https://speak.ounie.com/api/mcp (legacy SSE: /api/sse)
Auth Authorization: Bearer spk_live_…
# Hosts that can't set headers (e.g. the Ounie AI Team):
https://speak.ounie.com/api/mcp?api_key=spk_live_…Keyless agents pay on Base. The price depends on how much text you sent, so POST it unpaid and the 402 quotes THAT call. A bad model or an unknown voice is refused before anything is quoted, so you never sign for work that cannot succeed.
curl -X POST https://speak.ounie.com/api/x402/speak \
-H "Content-Type: application/json" \
-d '{"text":"…", "voice_id":"JBFqnCBsd6RMkjVDRZzb"}'
# → 402 { accepts: [{ scheme:"exact", network:"base",
# maxAmountRequired:"144000", payTo:"0x…" }] }
curl -X POST https://speak.ounie.com/api/x402/speak \
-H "X-Payment: <base64 signed payload>" -d '{"text":"…"}'10 credits per 1,000 characters (20 on the rich engine) · 1,200 characters = 12 credits, or $0.144 on x402 · every run stays in the dashboard, free to re-read and re-download.
Credit math
Speech bills per character upstream, so it bills per character here. Drag the slider — the price moves the way the cost does, which is the whole argument for not charging a flat fee per call.
Fast · Balanced
9 credits
10 cr / 1,000 characters
Rich
18 credits
20 cr / 1,000 characters
One credit is one cent, rounded up, with a one-credit floor. Held on the characters you submit, settled on the characters actually spoken. Listing your runs, re-reading one and downloading its audio again cost nothing, forever.
Up to 5,000 characters per call. Credits come from the same Ounie wallet as every other app on the account — there is no plan to pick and nothing to cancel.
Questions
No, and we would rather say so here than have you find out. No speech engine returns word timings, so Speaker derives them one of two ways and every response names which in `timings_source`. Where an engine returns CHARACTER-level alignment, words are an exact reduction over it: group on whitespace, take the first character's start and the last character's end. Where an engine returns audio alone, Speaker transcribes its own output and aligns the transcript's word boundaries back onto your text — the clock comes from the transcript, the words are always yours.
You are not charged. A synthesis that returns audio but no usable word timings settles at zero credits and refunds in full, and on the keyless rail it is refused before the payment is settled. This product is voice with the clock attached; audio on its own is not what you asked for, and it was not your fault, so it is the house's loss.
Because `model` names a quality rung, not an engine's internal model. Speaker runs a chain of speech engines and falls through to the next when one refuses work, so a vocabulary made of one supplier's model names would be a promise the product could not keep the moment that supplier was down. Each engine maps Fast, Balanced and Rich onto its own models, and every engine's Rich is genuinely more expensive on that engine's own rate card. The response reports what actually ran, in `engine_model`.
Because that is how the cost behaves. Speech bills per character upstream, so a 4,000-character script genuinely costs forty times a 100-character one — and a flat per-call price is wrong at both ends: too expensive for a one-line reply, sold below cost for anything long. Fast and Balanced are 10 credits per 1,000 characters; Rich is 20, because every engine's own rate card charges roughly twice as much for the model it maps Rich onto. The price follows the rung you ask for and never the engine that serves it.
Send a pronunciations map: {"Ounie": "Oonie"}. It is applied to your text before synthesis, so the engine reads the respelling — and the word timings you get back carry YOUR spelling, not ours, so the captions are publishable as they arrive. That holds on every engine: where the timings come from a transcript, they are aligned onto your text in the first place, so the transcript mishearing the name (ours came back with "Oni") cannot reach you. A respelling has to be a single word; two tokens where you wrote one would put the timings out of step with your script, so that request is refused instead.
Your run is: the text, the voice, the timings and the audio, so you can list your history, re-read a run and download the audio again without paying twice. It is scoped to your account and nothing else. The audio object itself is private — every download is a signature minted for that request and expiring on its own, never a public URL.
5,000 characters, roughly five minutes of speech. The engine allows more, but this is a synchronous endpoint: the whole synthesis has to finish inside one request, and a limit the request timeout would break anyway is not a real capability. Longer scripts are several calls, and the word timings make them straightforward to stitch back onto one timeline.
Yes. The x402 endpoint takes USDC on Base with no account and no key. POST your text unpaid and the 402 carries the price for that exact text; sign, retry, and it verifies the signature, synthesises, and settles only once the audio and its timings both exist. An on-chain settlement is final, so a non-answer is refused before the money moves rather than refunded after.
You get an immediate 503 and nothing is charged — no credits held, no payment quoted, no signature asked for. A scheduled probe checks the engine on its own, so nobody's request pays for the discovery, and the moment it recovers the app starts working again with no deploy.
One call returns the audio and the timeline. Everything downstream — captions, cuts, sync — stops being a guess.