500 store-specific 180-character ad reads: Sume vs MAI-Voice-2.1 cost

Five hundred local ad reads of 180 characters cost $5.00 on Sume, $1.98 on MAI-Voice-2.1 and $1.35 on Flash. Why the one-cent minimum decides it.

4 min readSume
All posts

Five hundred separate 180-character ad reads cost $5.00 on Sume (1 cent each), $1.98 on MAI-Voice-2.1 and $1.35 on MAI-Voice-2.1-Flash. At that script length Sume's one-cent minimum, not the per-character rate, sets the bill.

Arithmetic

A 180-character read is 180 x $0.0475 / 1,000 = $0.00855 unrounded, which Sume rounds up to the 1-cent minimum. Five hundred jobs are 500 x $0.01 = $5.00. On Microsoft's rates, 180 characters at $22 per million is $0.00396 and at $15 per million is $0.0027; times 500 that is $1.98 and $1.35.

500 reads of 180 characters (read 2026-10-05)
OptionPer read500 readsBasis
Sume TTS Router$0.01$5.00One-cent minimum per job
MAI-Voice-2.1$0.00396$1.98$22 per 1M characters
MAI-Voice-2.1-Flash$0.0027$1.35$15 per 1M characters

Submitting 500 jobs safely

Sume jobs are async: the submit response carries data.request_id, and you read GET /v1/jobs/:id/status and /result. Send an Idempotency-Key derived from the row so a retry after a network failure returns the same job (data.idempotency_hit) instead of billing twice. The loop below reads reads.tsv (store id, tab, text) and prints one request id per row.

while IFS=$'\t' read -r id text; do
  curl -sS -X POST https://api.sume.com/v1/tts-router/generate \
    -H "Authorization: Bearer $SUME_API_KEY" \
    -H "Content-Type: application/json" \
    -H "Idempotency-Key: store-$id-v1" \
    -d "$(jq -n --arg t "$text" '{model:"sonic-3.6",transcript:$t,avatar_handle:"product_host",language:"en"}')" \
    | jq -r --arg id "$id" '[$id, .data.request_id, .data.idempotency_hit] | @tsv'
done < reads.tsv

Pack to cut the bill

If your reads do not need separate files, joining them reduces the rounding penalty. Five reads of 180 characters joined with blank lines are 900 characters, a 5-cent job, so 100 jobs cost $5.00 as well; the saving only appears once the packed script is long enough to exceed the minimum meaningfully. At 1,000 characters a job costs 5 cents, the same price as five separate 200-character reads. Packing therefore pays only if you need fewer files, not if you want a lower price per read.

What this leaves out

Concurrency limits apply when workers move jobs to processing, and queued is a normal state, so a 500-row batch will drain over time rather than finish at once. Poll with exponential backoff and never resubmit a paid request that is merely queued.

Sources

Related posts

More in Pricing

All Pricing posts

Written by Sume