OpenAI tts-1 vs tts-1-hd vs ElevenLabs: cost for 10,000 characters
OpenAI lists tts-1 at $15 per 1M characters and tts-1-hd at $30; ElevenLabs Flash is $0.04 per 1K. For 10,000 characters: $0.15, $0.30 and $0.40.

Ten thousand characters of speech cost $0.15 on OpenAI tts-1, $0.30 on tts-1-hd and $0.40 on ElevenLabs Flash or Turbo, from the vendors' current pages. ElevenLabs' newer Eleven v4 is $0.22 for the same text until October 12 and $0.80 afterwards.
OpenAI's pricing page lists tts-1 at $15.00 per 1M characters and tts-1-hd at $30.00 per 1M, with no per-minute rate. ElevenLabs' API pricing gives per 1K character rates. Sume does not publish a speech rate in its docs, so no Sume price is stated here.
Per 1K and per volume
Cost = characters / 1,000 x rate per 1K. OpenAI's $15.00 per 1M is $0.015 per 1K.
| Model | Per 1K chars | 10,000 chars | 1,000,000 chars |
|---|---|---|---|
| OpenAI tts-1 | $0.015 | $0.15 | $15.00 |
| OpenAI tts-1-hd | $0.030 | $0.30 | $30.00 |
| ElevenLabs Flash / Turbo | $0.04 | $0.40 | $40.00 |
| ElevenLabs v4 (promo to Oct 12) | $0.022 | $0.22 | $22.00 |
| ElevenLabs v4 (regular) | $0.08 | $0.80 | $80.00 |
Characters per ad
A 30 second voiceover is a few hundred characters, so the per-ad speech cost is a fraction of a cent in every row: at 500 characters, $0.0075 on tts-1 and $0.02 on ElevenLabs Flash. Characters per second varies by language and pace, so measure your own scripts.
At that scale the choice should rest on voice quality and licensing, not on a price gap of a cent per hundred ads.
Sources
Related posts
More in Comparisons
- OpenRouter video expired status vs Sume job statuses
OpenRouter video jobs can end as expired, 'exceeded maximum time to live'. Sume has queued, processing, completed, failed and canceled. Map them in a client.
- OpenRouter video: frame_images and input_references together
Send both frame_images and input_references to an OpenRouter-style video API and Sume treats it as image-to-video. What changes, and how to split the fields.
- OpenRouter video webhook idempotency key vs Sume job_id
OpenRouter's video webhook sends X-OpenRouter-Idempotency-Key as job_id-status. Sume says use job_id alone. How to dedupe both, with a runnable verifier.
- OpenRouter video unsigned_urls need an API key: Sume too
OpenRouter's unsigned_urls require your API key in the Authorization header, and so does Sume's content endpoint. Why a browser video tag fails and a safe fix.
Written by Sume