MiniMax H3 Open Weights | Try in Video Generator →

WaveSpeedAI Subtitle OCR API

wavespeed-ai/

WaveSpeedAI Subtitle OCR is a fast AI subtitle extraction model that extracts subtitles from videos and returns an SRT file URL. Ready-to-use REST inference API for OCR-based subtitle extraction, video caption recovery, subtitle generation, content localization, accessibility workflows, social media videos, and professional video processing with simple integration, no coldstarts, and affordable pricing.

video-to-text
Input

ExamplesView all

Related Models

README

WaveSpeed AI Subtitle OCR

WaveSpeed AI Subtitle OCR extracts subtitles from a video using OCR and returns an SRT file URL. It is designed for subtitle recovery, caption extraction, accessibility workflows, localization prep, and video processing tasks where on-screen subtitles need to be converted into reusable subtitle files.

Why Choose This?

  • OCR-based subtitle extraction
    Detect and extract burned-in or embedded on-screen subtitles from video frames.

  • Direct SRT output
    Returns a subtitle file URL that can be reused in editing, publishing, or localization workflows.

  • Simple one-input workflow
    Upload a video and generate subtitle output with minimal setup.

  • Useful for accessibility and repurposing
    Supports caption recovery, subtitle reuse, localization prep, and content accessibility workflows.

  • Production-ready API
    Suitable for subtitle extraction pipelines, social media processing, archive recovery, and post-production workflows.

Parameters

ParameterRequiredDescription
videoYesInput video to analyze for subtitle extraction.

How to Use

  1. Upload your video — provide the source video that contains visible subtitles.
  2. Submit — run the OCR subtitle extraction request.
  3. Download the result — use the returned SRT file URL in your editing, publishing, or localization workflow.

Example Use Case

Extract burned-in subtitles from a fitness or tutorial clip and reuse them as an editable SRT file for republishing or translation.

Output

Returns one SRT file URL in the standard WaveSpeed prediction response.

Pricing

Pricing is billed in started 60-second units.

Video DurationCost
1s–60s$0.16
61s–120s$0.32
121s–180s$0.48
181s–240s$0.64

Billing Rules

  • Base price is $0.16 per started minute
  • Videos shorter than 60 seconds are billed as 60 seconds
  • Billing rounds up in 60-second increments
  • Pricing depends only on video duration

Best Use Cases

  • Subtitle recovery — Extract hardcoded subtitles from existing videos.
  • Accessibility workflows — Recover captions for reuse in accessible publishing.
  • Localization prep — Turn on-screen subtitles into editable SRT assets for translation.
  • Archive processing — Recover subtitle text from older video assets.
  • Social media repurposing — Reuse subtitles from clips for editing or reposting.

Pro Tips

  • Use the cleanest source video possible for better OCR accuracy.
  • Videos with high subtitle contrast generally produce better extraction results.
  • Subtitle extraction works best when text is clearly visible and not heavily stylized.
  • Review the generated SRT before final use, especially for fast-moving or low-resolution footage.

Notes

  • video is required.
  • The model returns an SRT file URL, not a burned-in subtitle video.
  • Pricing is fixed at $0.16 per started minute, with a minimum billed length of 60 seconds.
  • Very small, low-contrast, stylized, or heavily animated subtitles may reduce OCR quality.

Related Models

  • VEED Subtitles — Add styled subtitles to a video with automatic transcription or imported SRT.
  • Other WaveSpeed subtitle and caption workflows — Useful when you need subtitle burn-in or subtitle styling instead of OCR extraction.
Note:This website uses AI models provided by third parties.

Subtitle Ocr API — Quick start

Grab a WaveSpeedAI API key, then call POST https://api.wavespeed.ai/api/v3/wavespeed-ai/subtitle-ocr with your input as JSON. The endpoint returns a prediction id. Start polling the result endpoint around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. On completed, read output values from data.outputs. Examples for Subtitle Ocr below.

HTTP example
set -euo pipefail

: "${WAVESPEED_API_KEY:?Set WAVESPEED_API_KEY}"

REQUEST_BODY=$(cat <<'JSON'
{
    "video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4"
}
JSON
)

# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
  -X POST "https://api.wavespeed.ai/api/v3/wavespeed-ai/subtitle-ocr" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $WAVESPEED_API_KEY" \
  -d "$REQUEST_BODY")

TASK=$(printf '%s' "$SUBMIT_RESPONSE" | jq 'if has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "$TASK" | jq -r '.id')
if [ -z "$PREDICTION_ID" ] || [ "$PREDICTION_ID" = "null" ]; then
  printf 'Submission response did not contain a prediction id
' >&2
  exit 1
fi
RESULT_URL=$(printf '%s' "$TASK" | jq -r '.urls.get // empty')
if [ -z "$RESULT_URL" ]; then
  RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/$PREDICTION_ID/result"
fi

# 2. Poll until the prediction finishes.
while true; do
  RESPONSE=$(curl --silent --show-error --fail-with-body "$RESULT_URL" \
    -H "Authorization: Bearer $WAVESPEED_API_KEY")
  RESULT=$(printf '%s' "$RESPONSE" | jq 'if has("data") then .data else . end')
  STATUS=$(printf '%s' "$RESULT" | jq -r '.status')
  case "$STATUS" in
    completed) printf '%s\n' "$RESULT" | jq '.outputs'; break ;;
    failed|cancelled|timeout) printf '%s\n' "$RESULT" | jq . >&2; exit 1 ;;
    created|processing) sleep 2 ;;
    *) printf 'Unexpected status: %s
' "$STATUS" >&2; exit 1 ;;
  esac
done
Node.js example
const submitUrl = "https://api.wavespeed.ai/api/v3/wavespeed-ai/subtitle-ocr";
const apiKey = process.env.WAVESPEED_API_KEY;
if (!apiKey) throw new Error('Set WAVESPEED_API_KEY');

async function requestJson(url, options = {}) {
  const response = await fetch(url, options);
  if (!response.ok) throw new Error(await response.text());
  return response.json();
}

// 1. Submit the prediction.
const body = await requestJson(submitUrl, {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
        "video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4"
}),
});
const task = body.data ?? body;
if (!task.id) throw new Error("Submission response did not contain a prediction id");
const resultUrl = task.urls?.get ||
  `https://api.wavespeed.ai/api/v3/predictions/${task.id}/result`;

// 2. Poll until the prediction finishes.
while (true) {
  const resultBody = await requestJson(resultUrl, {
    headers: { "Authorization": `Bearer ${apiKey}` },
  });
  const result = resultBody.data ?? resultBody;
  if (result.status === "completed") {
    console.log(result.outputs);
    break;
  }
  if (["failed", "cancelled", "timeout"].includes(result.status)) throw new Error(JSON.stringify(result));
  if (!["created", "processing"].includes(result.status)) throw new Error("Unexpected status: " + result.status);
  await new Promise(resolve => setTimeout(resolve, 2000));
}
Python example
import json
import os
import time
from urllib.request import Request, urlopen

api_key = os.environ["WAVESPEED_API_KEY"]
headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
payload = {
    "video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4"
}

def request_json(url, data=None):
    request = Request(url, data=data, headers=headers, method="POST" if data else "GET")
    with urlopen(request) as response:
        return json.load(response)

# 1. Submit the prediction.
body = request_json("https://api.wavespeed.ai/api/v3/wavespeed-ai/subtitle-ocr", json.dumps(payload).encode())
task = body.get("data", body)
if not task.get("id"):
    raise RuntimeError("Submission response did not contain a prediction id")
result_url = task.get("urls", {}).get("get") or f"https://api.wavespeed.ai/api/v3/predictions/{task['id']}/result"

# 2. Poll until the prediction finishes.
while True:
    result_body = request_json(result_url)
    result = result_body.get("data", result_body)
    status = result.get("status")
    if status == "completed":
        print(result.get("outputs", []))
        break
    if status in {"failed", "cancelled", "timeout"}:
        raise RuntimeError(result)
    if status not in {"created", "processing"}:
        raise RuntimeError(f"Unexpected status: {status}")
    time.sleep(2)

Subtitle Ocr API — Frequently asked questions

What is the Subtitle Ocr API?

Subtitle Ocr is a WaveSpeedAI model for AI inference, exposed as a REST API on WaveSpeedAI. WaveSpeedAI Subtitle OCR is a fast AI subtitle extraction model that extracts subtitles from videos and returns an SRT file URL. Ready-to-use REST inference API for OCR-based subtitle extraction, video caption recovery, subtitle generation, content localization, accessibility workflows, social media videos, and professional video processing with simple integration, no coldstarts, and affordable pricing. You can call it programmatically or try it from the playground above.

How do I call the Subtitle Ocr API?

POST your input parameters to the model's REST endpoint (shown in the API tab of this playground) with your WaveSpeedAI API key in the Authorization header. Submission returns a prediction ID. Poll the result endpoint starting around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. The playground generates production-oriented Python, JavaScript, and cURL examples with timeouts, transient-error handling, and safe GET retries. Full request/response shape is documented at https://wavespeed.ai/docs/docs-api/wavespeed-ai/subtitle-ocr.

How much does Subtitle Ocr cost per run?

Subtitle Ocr starts at $0.16 per run. That figure is the base price — the final charge scales with the parameters you set in the form (output size, length, count, references, or whatever knobs this model exposes), so a higher-quality or larger output costs more than a minimal one. The exact cost for your current input is shown live next to the Generate button before you submit, and the actual per-call charge is recorded on the prediction afterwards.

What inputs does Subtitle Ocr accept?

Key inputs: `video`. The full JSON schema (types, defaults, allowed values) is rendered above the Generate button and mirrored in the API reference at https://wavespeed.ai/docs/docs-api/wavespeed-ai/subtitle-ocr.

How do I get started with the Subtitle Ocr API?

Sign up for a free WaveSpeedAI account to claim starter credits, copy your API key from /accesskey, then call the endpoint shown in the API tab of the playground. The playground also auto-generates a code sample in Python, JavaScript, or cURL for the parameters you've set.

Can I use Subtitle Ocr outputs commercially?

Commercial usage rights depend on the model's license, set by its provider (WaveSpeedAI). The license summary appears on the model card above; see WaveSpeedAI's Terms of Service for platform-level conditions.

WaveSpeedAI Subtitle OCR API on WaveSpeedAI