Shorts voiceover: how many characters fill 15, 30, 45 and 60 s
Planning table from script length to seconds and TTS cost, with the 15 characters per second assumption labeled and a way to measure the real value.

Before voicing a script you want to know if it fits the Short. The table below uses 15 characters per second as an assumption for a normal narration pace. Your voice and script will differ, so measure once and replace the number.
Planning table
| Target | Characters | TTS cost |
|---|---|---|
| 15 s | 225 | $0.0107 |
| 30 s | 450 | $0.0214 |
| 45 s | 675 | $0.0321 |
| 60 s | 900 | $0.0428 |
Measure your own pace
Ask TTS for word timestamps. Divide the character count by the last word's end time and use that figure next time.
Code to compute characters for a target:
rate = 15 # characters per second, assumed
price = 0.0475 / 1000
for secs in (15, 30, 45, 60):
chars = secs * rate
print(secs, "s", chars, "chars", round(chars * price, 4))
Sources
Related posts
More in Developers
- A zod schema for the Sume /v1/videos poll response, ported from Sora
Replace Sora's four-status type with a zod schema for Sume's five statuses. It rejects a completed job without unsigned_urls and a failed one without an error.
- 10-minute 1080p YouTube video at 8 Mbps is about 629 MB: $1.00 on Sume
At YouTube's 8 Mbps for 1080p plus 384 kbps audio, 600 seconds is 628.8 MB. A 600 second Sume Timeline render at 1920x1080 costs $1.00. The arithmetic.
- A 10-minute TikTok ad from 120 five-second slots: 600 s, $1.00
Timeline takes up to 200 slots and 1,800 s. 120 slots of 5 s make exactly 600 s, which meets TikTok's 10-minute ad limit and bills 10 minutes, $1.00.
- 100 Omni clips on Sume Pro: queue_full after 24 jobs
Sume Pro runs 4 jobs at once and accepts 24 in total. Submitting 100 Omni clips at once returns 429 queue_full. A Python wave loop that retries safely.
Written by Sume