20 product clips in Spanish and French: 40 caption jobs, $8.00

Index-Translate has a free public API, and Sume burns authored caption cues for $0.20 a job: 20 product clips in 2 languages is 40 jobs and $8.00.

5 min readSume
All posts

Captioning 20 product clips in Spanish and French is 40 caption jobs at $0.20 each, which is $8.00 on Sume. The translation step costs nothing on Bilibili's listed free public API for Index-Translate-35B-A3B, so the Sume bill is the whole bill for this scenario.

The inputs are assumptions: 20 clips, one short on-screen line per clip, two target languages, one caption job per clip and language. Rates are the Video captions page and the Sume pricing page; the free API is described in the Index-Translate README, all read 2026-10-05.

What the batch costs

Each accepted caption job reserves and captures a flat price for clips of up to 60 seconds, so the total is the job count times the rate and does not depend on the length of the line.

Cost of 20 clips in two languages at list rates (read 2026-10-05)
StepCountRateTotal
Translate the line (Index-Translate public API)40 requestsListed as free$0.00
Burn authored cues (Sume video captions)40 jobs$0.20 per job$8.00
Batch total$8.00

Why authored cues fit a product clip

A product loop often has no speech. Speech-to-captions fails on a silent clip with caption_no_speech, so send cues with text, start and end and Sume burns that text without running speech-to-text. The caption docs also say the default style for Latin text is slam, which has no Hangul glyphs, so Spanish and French need no style override.

  • One Idempotency-Key per clip and language, such as sku0412-es, so a retry does not create a second charge.
  • Keep product names out of the translation request or pin them with a glossary; see the glossary post linked below.
  • Clips must be public HTTPS video URLs that Sume can fetch.

Run it

This translates each line and submits one caption job per clip and language, then prints the status URLs. Set SUME_API_KEY and edit the catalog.

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()

CATALOG = {"https://cdn.example.com/mug.mp4": "Dishwasher safe. Ships free."}
for url, line in CATALOG.items():
    for lang, code in (("Spanish", "es"), ("French", "fr")):
        body = {"video_url": url, "style": "punch",
                "cues": [{"text": translate(line, lang), "start": 0.5, "end": 5.5}]}
        r = requests.post(f"{API}/v1/video-captions", timeout=60, json=body,
                          headers={**H, "Idempotency-Key": f"{url[-8:]}-{code}"})
        r.raise_for_status()
        print(lang, r.json()["data"]["status_url"])

Check before you scale

Run two clips first and read the burned text. Index-Translate is a model, so check prices, sizes and product names in the output before you submit the other 38 jobs; each rejected render is still a $0.20 job.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume