Daily two-hour radio show transcripts: a month on MAI vs Sume STT

A two-hour show every day for 30 days is 3,600 audio minutes: about $32.40 on MAI-Transcribe-2-Streaming and $36.30 on Sume STT with 12 chunks a day.

5 min readSume
All posts

A two-hour daily radio show produces 60 hours of audio in a 30-day month. That is 3,600 audio minutes, about $32.40 on MAI-Transcribe-2-Streaming ($0.54 an audio hour, an introductory rate Microsoft says runs through the end of 2026) and $36.30 on Sume STT 1.0 ($0.01 per audio minute) including the one-cent split job that cuts each recording into pieces of 10 minutes or less.

Inputs are assumptions: one 120-minute English show a day, transcribed after broadcast, 30 days. Microsoft's rate is from its announcement and Sume's from the API reference, pricing page and timeline audio docs, all read 2026-10-05.

What the bill looks like

A 120-minute show is 12 ranges, so one split job per show covers it, and 12 transcription jobs follow.

Cost of 3,600 audio minutes (60.0 hours) across 30 daily shows (read 2026-10-05)
OptionRateTotalJobs
MAI-Transcribe-2-Streaming$0.54 per audio hour (intro rate through end of 2026)$32.40Streaming; no chunking
Sume STT 1.0 (transcription)$0.01 per audio minute ($0.60 an hour)$36.00360 jobs of up to 10 minutes
Sume timeline audio split$0.01 flat per job$0.30030 split jobs, up to 20 ranges each
Sume total$36.30

Batch overnight, not live

If the transcript is for the website the next morning, the whole day's work can run overnight. Sume STT 1.0 takes duration_seconds from 1 to 600, so a recording longer than 10 minutes is cut into pieces first. The timeline audio split job takes up to 20 ranges, so one split covers up to 200 minutes of audio.

  • Twelve 10-minute jobs per show run as separate jobs; submit them and poll their status_url values.
  • Use mode: "webhook" with a public HTTPS webhook_url and Sume delivers a signed event when each job reaches a terminal state.
  • The webhook is terminal-only: there are no partial callbacks, so keep polling available as a backup.
  • Retry a failed chunk with the same idempotency key rather than resubmitting the show.

Run it on Sume

This transcribes one show and saves the text under the date. A cron job calls it once a day with that day's hosted recording URL.

The recording URL passed in must already be a media.sume.com audio file, because the split job only reads Sume-hosted audio; import it first.

import os, time, requests
API = "https://api.sume.com"
H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
def run(path, body, key):
    r = requests.post(API + path, headers={**H, "Idempotency-Key": key}, json=body, timeout=60)
    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(2)
    if s["sume_status"] != "completed":
        raise RuntimeError(s["sume_status"])
    return requests.get(job["result_url"], headers=H, timeout=30).json()["data"]["result"]
def transcribe_long(media_url, total_s, key):
    ranges = [{"start": a, "end": min(a + 600, total_s)} for a in range(0, total_s, 600)]
    split = {"operation": "split", "url": media_url, "ranges": ranges, "output": {"format": "mp3"}}
    parts = run("/v1/timeline-1.0/audio", split, key + "-split")["segments"]
    texts = []
    for i, p in enumerate(parts):
        body = {"audio_url": p["audio_url"], "language_code": "en",
                "duration_seconds": min(600, total_s - 600 * i)}
        texts.append(run("/v1/stt-1.0/transcribe", body, f"{key}-{i}")["text"])
    return " ".join(texts)

day = os.environ["SHOW_DATE"]
text = transcribe_long(os.environ["SHOW_URL"], 120 * 60, f"show-{day}")
open(f"show-{day}.txt", "w", encoding="utf-8").write(text)

When MAI is the better pick

MAI-Transcribe-2-Streaming is $3.90 cheaper over the month. If the station also wants live captions on air, that is a different job, and a streaming model is the right tool. For a next-day transcript, the batch route is enough.

Sources

Related posts

More in Pricing

All Pricing posts

Written by Sume