Subtitle Studio

The rules run here and the timings never move; the model gets only what a rule cannot settle.

Back to SkillSafe
— or drop it on the box below, or paste it. Nothing leaves the browser until you press the metered run.
How it works

Nothing to hand? Load the — a bilingual transcript the recogniser mangled in six different ways — the , where the honest answer is that there is nothing to fix, or the , where the structure has to be repaired before a single word is worth correcting. Or press to watch the checker name every one of its findings with no model call at all.

1

The timings are an invariant, not an intention

A subtitle file is text bolted to a clock. Change the clock and it is worthless, however good the words are. So nothing in the correction path writes a timestamp, the model is handed cue text alone and never sees a timing line, and every export is re-parsed and compared against the original cue by cue before it can be downloaded — same count, byte-identical timings, numbering preserved, nothing merged or split. A reply that tries to rebuild a cue block with its timing inside is rejected and the engine's version of that cue is kept.

2

A variant is a rule; a mis-hearing is a judgement

Normalise a candidate to its bare letters and Lang Chain, lang-chain, LANGCHAIN and open A I all collapse onto the spelling you declared, so all of them are fixed here for nothing. Luncheon collapses to luncheon and matches nothing at all — no rule reaches LangChain from it, only a reader who knows what the video is about. That line is exactly where the free lane stops and the metered one starts, and it is the whole reason most of this app costs nothing.

3

Reading speed is measured and then kept out of the decision

Chars-per-second and line length are computed for every cue against separate Latin and CJK ceilings, because a file that is correct and unreadable is still not shippable. But they are deliberately not allowed to vote on a correction: chars-per-second is a function of the text length and the cue duration, so it is algebraically derivable from things already measured and carries no independent information about whether a word was heard right. Treating it as evidence anyway would be counting one measurement twice.

4

The metered pass is small, and it is held to the text

It gets the flagged cues and nothing else, and returns one verdict for each. The app then counts them: a cue reviewed twice fails as loudly as one left out, and a cue reviewed that was never sent fails separately again. Every claim is checked in both directions against the raw text supplied — the word it says it replaced must have been there, the word it says it wrote must be in its corrected text — and a declared term that was in the cue and is gone from the reply fails, because you supplied that spelling. Whatever fails is held back and the engine's version stands.

A derived work of @sugarforever/subtitle-correction (MIT): its method — ask for the terminology first, correct the recogniser's errors against it, never touch a timestamp or a sequence number or the one-to-one cue correspondence, then validate the result and show the diff — is what this app implements. The skill asks the agent to hold those invariants; this proves them, and gives the model only the cues no rule can settle.

Questions

Can this change my timings?

No, and it is not a promise you have to take on trust. Timings, cue numbering and the one-to-one cue correspondence are invariants of the whole pipeline: nothing in the correction path writes a timestamp, the model is handed cue text alone and never a timing line, and every export is re-parsed and compared cue by cue against the original file before it can be downloaded. A reply that tries to smuggle a timing line into a cue's text is rejected by the checker and the engine's version of that cue is kept.

What does the free half actually do?

Everything that is a rule rather than a judgement. It parses SRT and WebVTT even when the blank-line separators or the cue numbers went missing, reports duplicate and out-of-order numbering, overlaps, zero-length, reversed and unparseable cues, measures chars-per-second and line length against separate Latin and CJK ceilings, applies your declared terminology across every spacing, casing and hyphenation variant of it, joins spoken punctuation back into identifiers, repairs the homophones whose direction is not in doubt, and writes the corrected file, the word-level diff, the changes CSV and the measurement JSON. No account, no model call, nothing charged.

Why does a mangled name like Luncheon not get fixed for free?

Because it is not a variant, it is a mis-hearing. The free pass normalises a candidate down to its letters and matches it against your term list, which is why Lang Chain, lang-chain, LANGCHAIN and open A I all resolve on their own. Luncheon normalises to luncheon and matches nothing, so there is no rule that reaches LangChain from it — only a reader who knows the video is about LangChain. That is exactly the work the metered pass is given, and nothing else is.

What happens if I do not have a term list?

The file is asked to settle its own spelling. Every Latin phrase appearing under more than one surface form becomes a cluster, and the app names the form the file itself supports and by what margin — Lang Chain seven times against LangChain twice — which you can adopt as a term list in one click. When there is no such cluster the app says so plainly rather than inventing a finding: every Latin phrase in this file is spelled one way throughout, so the term pass has nothing to fix.

What is checked about the AI pass?

Every cue sent for review must come back exactly once — a cue reviewed twice fails as loudly as one left out, and a cue reviewed that was never sent fails separately again. Each claimed replacement is checked in both directions against the raw text supplied: a word it says it replaced must have been there, and a word it says it wrote must be in its corrected text. A cue marked corrected whose text is identical to the text supplied fails. A declared term that was in the cue and is missing from the reply fails, because you supplied that spelling. Reading speed is recomputed and reported afterwards, but is deliberately not allowed to accept or reject a correction.

Which cues does the model see, and why so few?

Only the ones a rule cannot settle: a Latin fragment sitting inside Chinese text that matches no declared term, a word one edit from a declared term when close-match repair is switched off, a homophone whose direction the sentence decides rather than a table, spoken punctuation the join rule refused, and an immediately repeated token. Sending the whole file would cost more and prove less — the cues a rule already resolved have nothing left to ask about, and a term the file never contained is excluded from every later check so nothing is blamed for missing it.

Where does the corrected file go afterwards?

Out of the browser. The corrected subtitles download in the format they arrived in, the changes download as a CSV for a review pass, the whole measurement as JSON, and the report as markdown. Passes are also saved to your account rather than to one browser, because the term list grows as a course goes on and re-running lesson one against the fuller list is a restore plus one button.