Audio, video & images

Subtitle Studio

Convert SRT, VTT, ASS and SBV; shift, re-sync, fix overlaps, wrap lines and check CPS.

Paste SRT, WebVTT, ASS/SSA or SBV, or upload a file below.

Max 2 MB. UTF-8, UTF-16 (with BOM) or Windows-1252. Used instead of the text when given.

ms

Positive = later, negative = earlier. 1000 ms = 1 s.

Two-point sync fixes subtitles that drift (e.g. 25 vs 23.976 fps). Give two cues and when they should start.

characters

0 = no wrapping. 42 is a common limit for TV/streaming subtitles.

Longer cues are split into several cues, with time shared by text length.

ms

Used with "Fix overlapping cues". 83 ms ≈ 2 frames at 24 fps.

chars/s

Cues faster than this are listed. 15–20 characters per second are common guidelines.

Try an example: Clean an SRT: remove [music] tags, wrap at 42, fix overlaps, export WebVTT · Re-sync a drifting WebVTT by two points and save as SRT · Shift an SRT 1.5 s earlier

How it works

Parses SRT, WebVTT, ASS/SSA (basic) and YouTube SBV subtitles and converts between them. Shift all times, re-sync by two reference points (fixes drifting subtitles), fix overlaps with a minimum gap, wrap or merge lines, remove hearing-impaired tags like [music] or (sighs), and get a reading-speed (characters per second) report and validation errors with line numbers.

  • The format is detected from the content (WEBVTT header, [Script Info]/Dialogue lines, "-->" timing lines, or SBV "start,end" lines). Files are decoded as UTF-8 or UTF-16 with BOM, falling back to Windows-1252.
  • Each block is validated: missing or out-of-sequence numbers, malformed timing lines, end before start, empty cues, cues longer than 10 s and overlaps are reported with the line number in your file. Broken blocks are skipped, not guessed.
  • Operations run in this order: remove hearing-impaired tags → merge lines → wrap/split long lines → two-point sync → shift → fix overlaps. Two-point sync maps time linearly: t′ = T₁ + (t − S₁) × (T₂ − T₁) ÷ (S₂ − S₁), where S are the current and T the wanted start times of the two reference cues; it corrects both offset and drift (frame-rate mismatch).
  • Line wrapping first tries two balanced lines split near the middle, otherwise wraps greedily; cues needing more lines than allowed are split into consecutive cues with time shared by text length.
  • Reading speed = visible characters (without markup and line breaks) ÷ display time in seconds. ASS output uses one default style; ASS input styles, positions and effects are dropped (italic/bold are kept as <i>/<b>). SRT keeps <i>, <b> and <u>.

Sources

For scripts and AI agents

  • JSON API: POST https://subtitlestudio.usefulweb.site/api/v1/calculate (same calculation as this page)
  • Interface description: OpenAPI 3.1 · AI guide: llms.txt
  • MCP server (Streamable HTTP): https://subtitlestudio.usefulweb.site/mcp · tool name subtitle_studio
Example request
curl -s -X POST https://subtitlestudio.usefulweb.site/api/v1/calculate \
  -H 'content-type: application/json' \
  -d '{"text":"1\n00:00:01,000 --> 00:00:03,200\n[MUSIC PLAYING]\nHello there!\n\n2\n00:00:03,000 --> 00:00:05,500\nJOHN: (sighs) This line is quite a bit longer than forty-two characters and needs wrapping.\n\n3\n00:00:06,000 --> 00:00:06,400\nToo fast to read comfortably.\n","outputFormat":"vtt","removeHi":true,"maxLineLength":42,"fixOverlaps":true,"minGapMs":80}'

Related tools

Feedback