Sume TTS tts_duration_exceeded: splitting a script over 1,200 seconds
Sume TTS fails audio longer than 1,200 seconds with tts_duration_exceeded, and caps a request at 20,000 characters. Split at paragraph breaks and rejoin.

Sume TTS rejects a request over 20,000 characters, and fails a job whose audio would run longer than 1,200 seconds (20 minutes) with tts_duration_exceeded. Split the script at paragraph breaks into several requests, each under both limits, then join the results.
Sume does not publish a characters-to-seconds conversion, so measure the speaking rate of your voice on a short test before you pick a chunk size.
The two ceilings
They apply per request.
| Limit | Value | What happens beyond it |
|---|---|---|
| Transcript length | 20,000 characters | The request is rejected |
| Audio length | 1,200 seconds | The job fails with tts_duration_exceeded |
A split-and-join plan
The steps are mechanical.
- Measure: run a 500-character sample, read the finished duration, and compute characters per second for that voice and speed.
- Size: choose a chunk with a margin under 1,200 seconds. Slower speeds, such as 0.6, lengthen the audio for the same characters.
- Split at paragraph or chapter breaks, never mid-sentence, so the joins sit in natural pauses.
- Submit each chunk as its own job with its own Idempotency-Key, in wav so the seams stay clean.
- Join the finished files with timeline audio, at most 20 parts per call, for $0.01.
What it costs
TTS is $0.0475 per 1,000 characters, rounded up to the cent per job, so splitting a long script costs about the same as one long job plus a small rounding gap. Four 20,000-character requests are 95 cents each, or $3.80, and the join is another cent. Chunks of around 1,000 characters or more keep the rounding loss small.
Keep one voice and setting
Use the same voice, language, speed and emotion string for every chunk, or the join will be audible. If you need chapter markers afterwards, ask each job for word timestamps and add the previous parts' durations to the offsets. The jobs and results guide shows how to fetch each finished result.
Sources
Related posts
More in Developers
- Sume TTS 409 tts_voice_language_mismatch: confirm and retry safely
A Sume TTS 409 means the voice's language differs from your request. Nothing was charged. Ask the user, then retry with confirm_language_mismatch true.
- $2.00 balance: one 10-second Omni 1080p job, then a 402
With $2.00 in the wallet, one 10-second Omni 1080p job reserves $1.875. A second identical submit gets 402, not 429: balance and queue are separate.
- TypeScript union for Sume bulk queue items, checked with Deno
Model queue items by status so run_id and error are typed per case: null while queued, null for a child that never started, and an exhaustive switch.
- TypeScript SDK: createVideoGeneration, then poll for 'cancelled'
The @sume-com/sdk video functions return {data, error, response} and never throw. An 18-line loop passes an Idempotency-Key and handles the British spelling.
Written by Sume