Twelve 750-character match recaps a weekend: a year of TTS cost

Twelve recaps of 750 characters every weekend for 52 weeks is 468,000 characters: $7.02 on MAI Flash, $10.30 on MAI-Voice-2.1, $22.23 on Sume TTS.

5 min readSume
All posts

Twelve match recaps of 750 characters every weekend for a year is 468,000 characters, which costs $7.02 on MAI-Voice-2.1-Flash, $10.30 on MAI-Voice-2.1 and $22.23 on Sume TTS 1.0. At list rates that is 468,000 characters: $10.30 on MAI-Voice-2.1 ($22 per 1M characters), $7.02 on MAI-Voice-2.1-Flash ($15 per 1M), and $22.23 on Sume TTS 1.0 ($47.50 per 1M, or $0.0475 per 1,000 characters).

The inputs are assumptions for this scenario: twelve recaps of 750 characters per weekend, 52 weekends, one narrator. Microsoft's prices are from its announcement page and Sume's from the API reference and pricing page, all read 2026-10-05. The totals are rate times characters, before any per-job rounding.

What the bill looks like

The one-run column is a single weekend of twelve recaps (9,000 characters).

Cost of 9,000 characters, and of 468,000 characters over 52 weekends, at list rates (read 2026-10-05)
ModelRate per 1M charactersOne runTotal over 52 weekends
MAI-Voice-2.1$22.00$0.198$10.30
MAI-Voice-2.1-Flash$15.00$0.135$7.02
Sume TTS 1.0$47.50$0.427$22.23

Same voice, twelve jobs, one weekend

A recap series lives or dies on a consistent narrator, and on getting twelve files out in an hour rather than one file out in a second. That is a throughput and consistency question more than a latency one.

  • Pick the voice by avatar_handle or voice.id once and reuse it for every recap, so the narrator does not change between weekends.
  • Sume jobs are asynchronous: poll each status_url until terminal is true, and a retried recap reuses its job through the idempotency key.
  • Set generation_config.volume and speed once in a shared config so the first and the twelfth recap match.
  • Microsoft lists instant voice matching from a short reference clip for MAI-Voice-2.1; check the voice-rights terms for any voice you clone on either service.

Run it on Sume

This runs the recaps one after another, using the match id in the idempotency key. Replace the two sample recaps with your own text.

import os, time, requests

API = "https://api.sume.com"
H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}

def speak(text, key, **extra):
    body = {"transcript": text, "language": "en", **extra}
    body.setdefault("avatar_handle", os.environ.get("SUME_AVATAR_HANDLE", ""))
    r = requests.post(f"{API}/v1/tts-1.0/generate", timeout=60,
                      headers={**H, "Idempotency-Key": key}, json=body)
    r.raise_for_status()
    job = r.json()["data"]
    while True:
        s = requests.get(job["status_url"], headers=H, timeout=30).json()["data"]
        if s["terminal"]:
            break
        time.sleep(s["next_poll_after_seconds"] or 2)
    if s["sume_status"] != "completed":
        raise RuntimeError(s["sume_status"])
    res = requests.get(job["result_url"], headers=H, timeout=30).json()["data"]["result"]
    return res

recaps = {"m01": "Home side won two to one after a late goal.",
          "m02": "A goalless draw in the rain."}
cfg = {"generation_config": {"speed": 1.05, "volume": 1.0}}
for match_id, text in recaps.items():
    res = speak(text, f"recap-wk41-{match_id}", **cfg)
    print(match_id, res["artifacts"][0]["url"])

When MAI is the better pick

For a weekend batch the cheapest option is MAI-Voice-2.1-Flash and the gap to Sume is $15.21 over the year on this volume. The case for Sume is that a recap is rarely audio alone: the same account can burn captions and render a vertical video from the file.

Sources

Related posts

More in Pricing

All Pricing posts

Written by Sume