Nano Banana 2.1 is LIVE — Google's Latest | Try Now →

wavespeed-ai/subtitle-ocr

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 Understanding
Input
Enable Safety Checker

Idle

Subtitles · SRT

    $0.16per run·~62 / $10

    ExamplesView all

    srt

    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.
    
    ## Duration limit
    
    The maximum supported video duration is 10 minutes. Longer video is automatically trimmed to 10 minutes before processing.
    
    Note:This website uses AI models provided by third parties. Documentation prices are for reference and may be outdated. The Generate button shows an estimate; the final task charge prevails.

    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="https://api.wavespeed.ai/api/v3/predictions/$PREDICTION_ID/result"
    
    # 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|deleted) printf '%s\n' "$RESULT" | jq . >&2; exit 1 ;;
        *) sleep 2 ;;
      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 = `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", "deleted"].includes(result.status)) throw new Error(JSON.stringify(result));
      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 = 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", "deleted"}:
            raise RuntimeError(result)
        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 Python, JavaScript, and cURL examples for submitting requests and polling results. 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 long does Subtitle Ocr take to generate?

    Reported generation time on WaveSpeedAI is around 289 seconds per request. This is an estimate, not a latency guarantee; queue time and input settings can change the total wait. live status is visible in the prediction record.

    Can I use Subtitle Ocr outputs commercially?

    Commercial usage rights depend on the model's license, set by its provider (WaveSpeedAI). Check the provider's applicable terms and WaveSpeedAI's Terms of Service before commercial use.

    llms.txt — wavespeed-ai/subtitle-ocr for AI agents and LLMs