Restaurant menu audio: 60 dishes at 90 characters, MAI vs Sume cost

Reading a 60-dish menu aloud is 5,400 characters: about 8 cents on MAI-Voice-2.1-Flash, 12 cents on MAI-Voice-2.1 and 26 cents on Sume TTS 1.0.

5 min readSume
All posts

A 60-dish menu read aloud at 90 characters a dish is 5,400 characters, about 8 cents on MAI-Voice-2.1-Flash, 12 cents on MAI-Voice-2.1 and 26 cents on Sume TTS 1.0, and four seasonal menus a year cost four times that. At list rates that is 21,600 characters: $0.475 on MAI-Voice-2.1 ($22 per 1M characters), $0.324 on MAI-Voice-2.1-Flash ($15 per 1M), and $1.03 on Sume TTS 1.0 ($47.50 per 1M, or $0.0475 per 1,000 characters).

The inputs are assumptions for this scenario: 60 dishes of 90 characters, a new menu each season, one voice. 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 total column is four seasonal menus. At this volume the voice bill is rounding error next to the time spent checking pronunciations.

Cost of 5,400 characters, and of 21,600 characters over four seasonal menus a year, at list rates (read 2026-10-05)
ModelRate per 1M charactersOne runTotal over four seasonal menus a year
MAI-Voice-2.1$22.00$0.119$0.475
MAI-Voice-2.1-Flash$15.00$0.081$0.324
Sume TTS 1.0$47.50$0.257$1.03

Dish names are the real problem

Menus are full of words a general voice gets wrong: foreign dish names, brand names and units. The price is trivial, so spend the effort on a pronunciation pass.

  • Sume TTS accepts an optional pronunciation_dict_id for fixed spellings of names.
  • Write numbers and prices the way they should be spoken, for example 'twelve dollars' rather than '$12'.
  • Set language to the language of the dish names' sentence, not the cuisine: a voice that does not match the language of the request returns a tts_voice_language_mismatch error before any charge.
  • Run a ten-dish test first; at 90 characters a dish it is about half a cent to hear each one.

Run it on Sume

This reads a menu file with one dish per line and prints each hosted URL. A line is one job, so a corrected dish is regenerated alone.

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

dishes = open("menu.txt", encoding="utf-8").read().splitlines()
for i, line in enumerate(dishes, 1):
    res = speak(line, f"menu-autumn-{i:03d}")
    print(i, res["artifacts"][0]["url"])
total = sum(len(d) for d in dishes) * 47.5 / 1e6
print(f"list-rate estimate: {total:.3f} USD")

When MAI is the better pick

Microsoft's model page lists 23 languages for MAI-Voice-2.1, which is the more attractive angle if the menu is read in several languages with one voice. For a single-language menu both services cost cents, so choose on the pronunciation controls and the file workflow you already have.

Sources

Related posts

More in Pricing

All Pricing posts

Written by Sume