Subtitle to Transcript: Why Stripping Timecodes Is the Easy Half
Every subtitle format encodes the same thing: short spans of speech pinned to timecodes. Turning that back into readable prose looks like a five-line script — delete the numbers, delete the arrows, join what is left. Run that script on a real caption file and you get something almost right, which is worse than obviously wrong because you have to read it to notice.
Two things break it. Captions are broken to fit a screen rather than to end a sentence, so naive joining gives you prose chopped every six words. And auto-generated captions scroll, repeating text across cues, so concatenating them yields every sentence two or three times. This tool handles both. Upload or paste a file above and the result appears immediately, in this browser tab.
The Rolling Duplicate Problem
This is the one that catches people. Automatic captioning on YouTube and most live systems does not emit discrete blocks of text. It emits a moving window, so the viewer sees words accumulate. In the file that looks like this:
- Cue 1: the quick brown
- Cue 2: the quick brown fox jumps
- Cue 3: fox jumps over the lazy dog
Joined without thought you get "the quick brown the quick brown fox jumps fox jumps over the lazy dog" — nineteen words where nine were said. Across an hour-long talk that roughly triples the length and makes the transcript useless for reading, searching, or summarising.
The fix is to keep only what each cue adds. For every new cue the tool finds the longest run of words that is both a suffix of the text so far and a prefix of the new cue, and drops it. Applied to the example above you recover "the quick brown fox jumps over the lazy dog" exactly once. The comparison runs against a bounded window of recent words rather than the whole transcript, which keeps it fast on a three-hour file and avoids deleting a phrase that legitimately repeats twenty minutes later.
Rejoining Sentences
A caption line is sized for a screen: roughly forty characters, two lines at a time, broken wherever the text happened to reach the edge. Sentences routinely span three or four cues. Keeping one line per cue produces a document that is technically the transcript and practically unreadable.
Paragraph mode accumulates cues and breaks when two conditions line up: enough text has gathered to make a paragraph, and the current cue ends on sentence-ending punctuation. That way a break never lands mid-thought. A hard ceiling forces a break eventually, because some speakers go a very long time without a full stop and an unbroken wall of text is its own kind of unreadable. A change of speaker always starts a new paragraph, which matters for interviews and panels.
Four Formats, One Idea
The format is detected from the file's own contents rather than its extension, because caption files are
renamed constantly and a .txt holding SubRip data is common.
- SubRip (.srt) — a numeric index, a timecode range with comma decimals, then the text. The most widely produced format and the simplest.
- WebVTT (.vtt) — the browser standard. Period decimals instead of commas, plus
optional
NOTE,STYLEandREGIONblocks that are not speech and are removed before parsing. VTT also allows inline markup:<v Speaker>names who is talking,<c.classname>applies styling, and bare timestamps inside a cue drive karaoke-style word highlighting. All are unwrapped, and the voice tag becomes a speaker label. - YouTube (.sbv) — a comma-separated timecode pair on its own line, then the text. No index, no markup.
- Advanced SubStation (.ass and .ssa) — an event list with a declared column order.
The parser reads that
Format:line rather than assuming positions, because the Text field is last precisely so it can contain commas. Override blocks in curly braces are styling instructions and are removed;\Nline breaks become spaces. The Name column, when populated, is the speaker.
Speakers, Sound Effects, and What to Keep
Speaker attribution arrives three different ways depending on the format: a dedicated field in ASS, a
voice tag in VTT, or the bare convention of NAME: at the start of a line in SRT, which has no
speaker field at all. All three are recognised and normalised to the same output. The heuristic for the
third is deliberately narrow — an uppercase run followed by a colon — because a lowercase prefix would
match ordinary sentences containing colons and shred the transcript.
Bracketed sound cues like [MUSIC], (laughter) and [APPLAUSE] are
kept by default and removable with a switch. Which is right depends entirely on the job: for a searchable
archive or an accessibility record they are part of the content, and for feeding a talk to a model to
summarise they are noise.
Three Output Shapes
The presets cover what people actually want. Clean transcript is flowing paragraphs with no timecodes, for reading, quoting, or handing to a model. Timestamped keeps paragraphs but marks each with its start time, which is what you want when the transcript is a means of navigating back to a moment in the video. Caption lines keeps one line per cue with its timecode and no deduplication — the closest thing to the original file, useful when you are checking the captions themselves rather than reading through them.
Alongside the output the tool reports the detected format, the cue count, the word count, the covered duration, and how many repeats were removed. That last number is the honest one: if it is large, the source was auto-generated and rolling, and you can see exactly how much of the raw file was repetition.
Nothing Leaves the Browser
Caption files are not always public. Interview recordings, internal all-hands, legal proceedings, medical consultations and unreleased footage all generate them. Parsing runs in JavaScript in this tab, so the file is read locally and never uploaded. That is also why the conversion is instant and why changing an option re-renders immediately rather than making another round trip.