SUBS: Edit, Retime and Convert Subtitles
Subtitles go wrong in a small number of ways: everything is half a second late, the file was cut for 23.976 and the picture runs at 25, two cues sit on top of each other, or a line is too long to read. This opens SubRip, WebVTT and the dialogue of SubStation Alpha, gives you the cues in a table you can type into, plays the video beside them so you can check the timing by ear, counts what is wrong, and writes the file back. It all happens in this tab.
1. The subtitle file
SubRip (.srt), WebVTT (.vtt), and the dialogue lines of SubStation Alpha (.ass, .ssa). The file is read in this tab and never sent anywhere.
No file open yet.
2. The video or audio, if you have it
Timing is a thing you hear, not a thing you calculate. Open the media beside the subtitles and check the cues by eye and ear. The file is handed to the player as a local object URL; it is not read, copied or uploaded.
3. The cues
Nothing open.
Open a file and the cues appear here. Every field is editable where it sits.
4. Timing
Every one of these can be taken back with Undo.
A rate change is a multiplication, not a shift: the further into the file a cue is, the further it moves.
5. Find and replace
Plain text, not a regular expression.
6. What might be wrong
The counts are live. Go to walks through the cues one at a time and selects each one.
7. Save it
Files are written in this tab and handed to the browser's own download.
What this is, and what it is not
It gives the bytes back. Where you have not touched a cue, its number line, its timing line and its text are written out exactly as they were read, and the byte order mark, the line endings, the decimal marks and the blank lines between cues go back the way they came. Open a file and save it again without editing and you get the same bytes. That matters when you are fixing one cue in a delivery someone else will diff.
SubStation Alpha is read for its dialogue only. The [Events] Format line is parsed to find out which column is which, because files really do reorder them, and the dialogue lines are read through it. Styles, positions, fonts, karaoke timing and the override tags in braces are not modelled and are thrown away. That is why there is no .ass output: saving one back would silently destroy work. Convert to SubRip or WebVTT knowing what you are losing.
A rate change is a multiplication. Film shot at 23.976 and played at 25 does not drift by a constant; it drifts more the further into the reel you are. The preset fills in the exact ratio, 24000/1001 divided by 25, and shows what one hour becomes. A shift is the other tool, for when the whole file is simply late.
The readability limits are conventions, not law. Forty-two characters a line, two lines, seven seconds, twenty-one characters a second and a two-frame gap are the numbers most broadcast and streaming style guides land near. Yours may differ, so all six are fields you can change, and the counts follow. Nothing is enforced; the page only counts and points.
The media file is never read by this page. When you open a video or audio file it is handed to the browser's own player as an object URL. The script never touches its bytes, and nothing is uploaded. Chromium-based browsers will refuse to decode most H.264 and AAC, which is a licensing decision by the browser and not something a web page can work around; Firefox usually manages, and a WebM copy always will.
Encodings it cannot guess. UTF-8 is assumed, and UTF-8, UTF-16LE and UTF-16BE byte order marks are honoured. An old file saved in a Windows code page will come out with the accented characters wrong. Open it in a text editor, save it as UTF-8, and start again. A UTF-16 file is read but written back as UTF-8.
The work is kept on this device, not on a server. The open cue list is written into this browser's local storage so a reload does not lose it, and only if it fits. Start over clears it. There is no account and nothing to sync, because there is no server holding anything.
Questions people ask
Is the subtitle file uploaded?
No. It is read by this tab with the browser's file reader, parsed here, and written back here. The page works with the network off, which is the simplest way to check that claim.
My subtitles are exactly two seconds late. What do I do?
Put -2 in the shift box, leave the scope on all of them, and press Shift. If they are late from a certain point only, select the cue where the drift starts and change the scope to that cue and everything after it.
The subtitles drift further out as the film goes on.
That is a frame rate mismatch rather than an offset. Pick the pair in the frame rate change list, which fills in the exact ratio, and press Stretch or compress. 23.976 to 25 is the common one.
Can it open a .sub or .idx file?
No. Those are bitmap subtitles: pictures of text, with no text in them. Turning them back into text needs optical character recognition, which is a different job from this one and not one this page does.
Why can the video not play in Chrome?
Chromium-based browsers ship without the H.264 and AAC decoders in many builds, so an ordinary MP4 gives an error. The file is fine. Try Firefox, or make a WebM copy to check the timing against.
Does it keep my cue numbering?
Yes, as long as you have not inserted, split, merged or deleted a cue. After a structural change the numbering has to be rebuilt, so it is renumbered from one.
How far back does undo go?
Eighty steps. Typing inside one cue counts as one step, not one step per character, so eighty is a long way back.