Video OCR

Subtitle Extractor API — OCR + speech transcription in one call

Extract on-screen text and spoken dialogue with per-frame timestamps, exported as SRT, VTT or JSON for subtitling, search and metadata pipelines.

VideoOCR & ASR

Before & after

See the difference

Speech hidden inside the video becomes a timestamped subtitle file — no manual transcription needed.

Input video with spoken audio and no captions00:00:04 / 00:00:18
INPUT · speech with no captions

The audio is locked inside the video — no way to search, translate or edit it.

1
00:00:01,120 --> 00:00:03,450
Let’s take a closer look at how the model works.

2
00:00:04,020 --> 00:00:06,980
Transcription runs automatically with per-speaker timestamps.

3
00:00:07,510 --> 00:00:09,900
Export to .srt, .vtt or plain text in 40+ languages.

A timestamped, editable subtitle file — searchable, translatable, ready to burn in.

What it does

Most OCR models are trained on clean documents and fall apart on compressed video frames. Subtitle Extractor is trained on video: it handles overlays, gradients and motion blur, then merges visual OCR with an ASR transcript, deduplicating both and aligning them to the timeline. You get subtitle-ready lines with in/out points, not just raw text.

Full API reference
Python
import requests

url = "https://api.mlslabs.io/v1/subtitle-extractor/jobs"
resp = requests.post(
    url,
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "input": "s3://bucket/movie.mp4",
        "output": "s3://bucket/subtitles/",
        "formats": ["srt", "json"],
        "ocr": True,
        "asr": True,
        "asr_languages": ["en", "zh"],
    },
)
job = resp.json()
print(job["job_id"])

Key features

Why teams pick this API

Video-tuned OCR

Detection models trained on compressed video frames — handles overlays, gradients and motion blur.

Speech + text hybrid

Merges ASR transcripts with visual OCR, deduplicating and aligning both to the timeline.

Precise timestamps

Frame-accurate in/out points per line, ready for subtitle editors and downstream localization.

Structured output

SRT, VTT, JSON or sidecar files delivered straight to your storage bucket.

Use cases

Built for real workflows

Distribution subtitles

Generate SRT/VTT files for every episode without manual transcription or alignment.

Searchable archives

Index what is said and what is on screen — dual-layer search for media libraries.

Localization handoff

Hand translators complete, timestamped source files instead of rough drafts.

Pricing

Credit-based pricing

Every request draws from your credit pool. This API bills 30 credits per minute of video.

Billing unitCost in creditsNotes
Processing time30 creditsPer minute of video
Failed jobs0 creditsCredits auto-refunded
Batch processingSame rateOne queue, per-file callbacks

See credit packs & full pricing

Learn

Guides, tutorials & comparisons

Browse all tutorials

FAQ

Common questions

Which ASR languages do you support?

English, Chinese and a growing set of major languages. Check the docs for the current list.

Can I get styled output or bounding boxes?

Yes — JSON output includes per-line bounding boxes and style attributes for the OCR track.

What if a subtitle is part of the picture?

It is still extracted by OCR. If you also want it removed, chain with the Subtitle Eraser API.

Do you merge OCR and ASR?

Yes, by default. You can disable either source if you only need one track.