Polly takes 3,000 billed characters; Sume TTS takes 20,000
Polly SynthesizeSpeech accepts 3,000 billed characters and cuts audio at 10 minutes. Sume TTS 1.0 accepts 20,000 characters and 1,200 seconds of audio per job.

Amazon Polly's quotas page says a SynthesizeSpeech request takes up to 3,000 billed characters (6,000 total) and that the output stream "is limited to 10 minutes. After this is reached, any remaining speech is cut off." Sume TTS 1.0 takes 1 to 20,000 characters and fails a job over 1,200 seconds of audio with tts_duration_exceeded, with no credit captured, instead of cutting it off.
Polly's numbers are from its quotas page, read 2026-10-01; Sume's from the OpenAPI schema behind the API reference.
What is the difference between billed and total characters?
Polly says SSML tags are not counted as billed characters, which is why 3,000 billed can be 6,000 total with markup. Sume's TTS has a plain transcript, so there is no markup to discount: spaces and punctuation count toward usage, up to 20,000.
How do the limits compare?
Real-time request on Polly against the standard job on Sume.
| Item | Polly SynthesizeSpeech | Sume TTS 1.0 |
|---|---|---|
| Text | 3,000 billed characters (6,000 total) | 20,000 characters |
| Audio length | 10 minutes, then cut off | 1,200 seconds, else tts_duration_exceeded |
| Over the audio limit | Remaining speech is dropped | Job fails, no credit captured |
Which failure mode is safer?
Failing is safer than truncating. A cut-off file looks like a success until someone listens to the end. If you stay on Polly, check the returned audio length against what your text should produce; on Sume, check for the error code instead.
What does a Sume request near the limit look like?
Use async mode and keep a polling or webhook path, since a long job outlasts the 30-second sync wait.
curl -X POST https://api.sume.com/v1/tts-1.0/generate \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: chapter-03" \
-d '{
"transcript": "Chapter three begins here.",
"avatar_handle": "@narrator",
"mode": "async"
}'Sources
Related posts
More in Developers
- Postgres 17.11 pgcrypto change: verify a Sume webhook with hmac()
The Postgres minor release changed legacy pgcrypto ciphers. Its listed changes never mention hmac(), so a Sume sume-v1 signature check in SQL still works.
- Punch-in zoom on video by API: crop or zoompan, no keyframes
Sume has no auto zoom switch. Use a crop op for a fixed punch-in or the allowlisted zoompan filter in a video-filter graph; there are no keyframes.
- Qwen Image 2.1: when you must show Built with Qwen
The Qwen Research License requires Built with Qwen or Improved using Qwen when outputs train a distributed model, and bars Qwen as a derivative's main name.
- QwenImage21Pipeline in diffusers vs an HTTP image request on Sume
QwenImage21Pipeline runs Qwen-Image-2.1 locally on a GPU. Sume has no 2.1 id: a hosted call is one POST /v1/images with a listed model. Side-by-side.
Written by Sume