Speaker

Pricing

10 credits per 1,000 characters.

A credit is one cent, drawn from the same Ounie wallet as every other app on your account. No plan, no minimum, nothing to cancel — and nothing at all for reading back work you have already paid for.

Fast

10credits / 1,000 characters

Lowest latency. The right default for anything an agent speaks in a loop.

fast

32 languages

Balanced

10credits / 1,000 characters

A little more expressive than Fast, at the same price.

balanced

32 languages

Rich

20credits / 1,000 characters

The most natural delivery. Costs the engine twice as much, so it costs you twice as much.

rich

29 languages

What a run costs at each length, on each engine
A run of this lengthcharactersfast / balancedrich
A social caption2803 cr6 cr
A short voiceover9009 cr18 cr
A two-minute read2,40024 cr48 cr
The per-call limit5,00050 cr100 cr

Work it out yourself

The price moves the way the cost does.

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.

Held, then settled

Credits are held on the characters you submit and settled on the characters the engine reported speaking — never above the hold. The difference comes back to the exact pool it left, in reverse order, so a monthly allowance is never quietly turned into a purchased balance.

Agents, without an account

The x402 endpoint takes USDC on Base. Because the price depends on how much text you sent, there is no fixed figure to publish: POST your call unpaid and the 402 quotes that call, at 1.2× the credit price.

POST https://speak.ounie.com/api/x402/speak

Free, forever

Up to 5,000 characters per call and 5 runs in flight at once. Credits are bought on your Ounie account, and every Ounie app draws the same wallet.

Questions

Before you spend anything.

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.