Quiz audio: 100 questions at 140 characters, one job, sliced per line

A hundred 140-character quiz questions are 14,000 characters: $0.21 on MAI Flash, $0.31 on MAI-Voice-2.1 and $0.67 on Sume, which can slice one job by sentence.

5 min readSume
All posts

A quiz with 100 questions of 140 characters is 14,000 characters of speech, and it costs $0.21 on MAI-Voice-2.1-Flash, $0.31 on MAI-Voice-2.1 and $0.67 on Sume TTS 1.0, where one request can also be cut into one clip per question. At list rates that is 14,000 characters: $0.308 on MAI-Voice-2.1 ($22 per 1M characters), $0.210 on MAI-Voice-2.1-Flash ($15 per 1M), and $0.665 on Sume TTS 1.0 ($47.50 per 1M, or $0.0475 per 1,000 characters).

The inputs are assumptions for this scenario: 100 questions of 140 characters each, run once; the 20,000-character Sume request limit is not reached. 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

Per-clip pricing hides the real choice here, which is one job for the whole round or one job per question.

Cost of 14,000 characters, and of 14,000 characters over one quiz round, at list rates (read 2026-10-05)
ModelRate per 1M charactersOne runTotal over one quiz round
MAI-Voice-2.1$22.00$0.308$0.308
MAI-Voice-2.1-Flash$15.00$0.210$0.210
Sume TTS 1.0$47.50$0.665$0.665

One job or a hundred

One job keeps the narrator's delivery consistent across the round and needs one idempotency key. A hundred jobs let you regenerate a single bad question without touching the others. Sume supports the first with a way back to the second: ask for sentence segmentation and you get one clip per question from the same job.

  • Terminate every question with a full stop or question mark; sentences are grouped on terminal punctuation.
  • Use a WAV or raw container: emit_audio slices are only produced for those, and each slice has its own audio_url.
  • Segments are gapless, so segment[i].end equals segment[i+1].start, with a default 70 ms lead after the last word.
  • Microsoft's pages do not state a per-request limit for MAI-Voice-2.1; Flash's announcement lists 45 seconds of audio, which a 100-question round would exceed.

Run it on Sume

This joins the questions into one transcript, requests slices, and prints the first five clip URLs. Each question stays one numbered segment.

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

questions = [f"Question {i}: what is the capital of country number {i}?" for i in range(1, 101)]
res = speak(" ".join(questions)[:20000], "quiz-round-7", timestamps={"words": True},
            segmentation={"mode": "sentence", "emit_audio": True},
            output_format={"container": "wav", "encoding": "pcm_s16le", "sample_rate": 44100})
for seg in res["segments"][:5]:
    print(seg["index"], round(seg["start"], 2), seg["audio_url"])

When MAI is the better pick

If you already run on Microsoft Foundry and want the lowest per-character price, MAI-Voice-2.1-Flash is $0.46 cheaper on this round. Sume is the better choice if the next step is cutting each question into a video and the per-sentence slices save you a splitting stage.

Sources

Related posts

More in Pricing

All Pricing posts

Written by Sume