Speaker

Speech, timed

Text in. Voice out,
with the clock attached.

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

script

Your agent just found its voice.

word timingsderived
Youragentjustfounditsvoice.
0.0s0.5s1.0s1.5s2.0s
{ "word": "found", "startMs": 1020, "endMs": 1380 }

Voices

Pick a voice the way you'd cast a person.

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

social

Dominant, Firm

male · american · middle aged

Alice

explainer

Clear, Engaging Educator

female · british · middle aged

Bella

explainer

Professional, Bright, Warm

female · american · middle aged

Bill

ads

Wise, Mature, Balanced

male · american · old

Brian

social

Deep, Resonant and Comforting

male · american · middle aged

Callum

character

Husky Trickster

male · american · middle aged

Charlie

conversation

Deep, Confident, Energetic

male · australian · young

Chris

conversation

Charming, Down-to-Earth

male · american · middle aged

Daniel

explainer

Steady Broadcaster

male · british · middle aged

Eric

conversation

Smooth, Trustworthy

male · american · middle aged

George

narration

Warm, Captivating Storyteller

male · british · middle aged

Harry

character

Fierce 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

Where the numbers actually come from.

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.

what an aligning engine returns
H0
i0.1
0.2
t0.3
h0.4
e0.5
r0.6
e0.7
group on whitespace
what you get
Hi0200 ms
there300800 ms

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

For the name it keeps getting wrong.

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.

you write

Ounie

The spelling your brand actually uses.

the engine reads

Oonie

A plain respelling, applied before synthesis. Not a phoneme dictionary, and nothing is stored.

the timing says

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

Built to be called by something that isn’t a person.

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.

REST

One POST, audio and timings together

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"}}'
MCP

A tool your agent already knows how to hold

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_…
x402

No account, no key — pay per call in USDC

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

Priced on the thing that actually costs money.

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.

900161 words

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.

What never costs anything

  • Listing the runs you have already made.
  • Re-reading a run, with its full word timings.
  • Downloading the audio again, as many times as you like.
  • Browsing the voice catalogue, signed in or not.
  • Estimating what a script would cost before you run it.

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

The parts worth reading twice.

Are the word timings really from the engine?

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.

What happens if the timings don't come back?

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.

Why only 3 models?

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`.

Why per 1,000 characters instead of per call?

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.

How do I make it say a name properly?

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.

Is my text stored?

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.

How long can one call be?

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.

Can an agent use this without an Ounie account?

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.

What happens when the engine is down?

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.

Give your agent a voice it can edit.

One call returns the audio and the timeline. Everything downstream — captions, cuts, sync — stops being a guess.