Listing narration in 3 languages: 1,200 characters, $0.17 on Sume

A 1,200-character listing description spoken in three languages is 3,600 characters of Sume TTS at $0.0475 per 1,000, which is $0.17 per listing.

5 min readSume
All posts

Speaking a 1,200-character listing description in three languages costs $0.171 per listing on Sume TTS 1.0, which is 3,600 characters at $0.0475 per 1,000 characters. If you translate with Bilibili's free Index-Translate API, the speech is the only cost.

The 1,200 characters per language is an assumption: translated text can be longer or shorter than the English source, so use the real length after translation. Spaces and punctuation count, and one request takes up to 20,000 characters, per the pricing page and API reference, read 2026-10-05.

What a batch of listings costs

The cost is linear in characters, so a month of listings is easy to budget.

Narration cost per listing and per batch, 1,200 characters per language (read 2026-10-05)
ListingsLanguagesCharactersSume TTS cost
133,600$0.17
10336,000$1.71
503180,000$8.55
2003720,000$34.20

One voice per language

A TTS voice has a primary language. If the voice you select does not match the language you request, the API answers 409 tts_voice_language_mismatch before it creates a job or charges anything, so choose a Spanish voice for Spanish, and so on. Select a voice with voice.id (a TTS voice UUID), avatar_handle or avatar_id.

Run it

This translates one description and speaks it with a matching voice, reading the voice ids from environment variables.

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

def translate(text, lang):
    p = f"Translate the following English text into {lang}, output only the translation without explanation.\n\n{text}"
    r = requests.post("https://index-translate.bilibili.com/v1/chat/completions", timeout=120,
                      json={"model": "Index-Translate-35B-A3B", "temperature": 0,
                            "messages": [{"role": "user", "content": p}]})
    r.raise_for_status()
    return r.json()["choices"][0]["message"]["content"].strip()

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 not requests.get(job["status_url"], headers=H, timeout=30).json()["data"]["terminal"]:
        time.sleep(2)
    res = requests.get(job["result_url"], headers=H, timeout=30)
    res.raise_for_status()
    return res.json()["data"]["result"]

text = "Sunny two-bedroom near the park, new kitchen, ten minutes to the station."
for lang, code in (("Spanish", "es"), ("German", "de")):
    out = run("/v1/tts-1.0/generate", {"transcript": translate(text, lang), "language": code,
              "voice": {"mode": "id", "id": os.environ[f"VOICE_{code.upper()}"]}}, f"listing-0412-{code}")
    print(code, out["artifacts"][0]["url"])

Sources

Related posts

More in Pricing

All Pricing posts

Written by Sume