TimecodaLabsubtitle timeline studio
Open the full studio

Merge two subtitle files into one bilingual track

Drop the primary-language file (A) and the file carrying the second language (B). A keeps the timeline; B only contributes text. You get a two-line file and a match report that says how many cues were paired, how many cues in B were left unused, and how far apart the two timelines are. Both files stay in your browser.

File A — primary language, supplies the timing

Drop the .srt / .vtt / .ass file here
or click to choose one · the first file you load becomes A

File B — second language, text only

Drop the second subtitle file here
its own timings are used for matching only — never copied into the output

The three matching modes, and where each one goes wrong

ModeWhat it pairsUse it whenWhere it goes wrong
nearest-cue Each cue in A with the B cue whose start time is closest, within the tolerance you set Both files came off the same edit and only differ by a small offset, or B's timings are rounded coarsely Two cues in A can want the same B cue — the closer one takes it and the other stays single-language. Too wide a tolerance pairs lines that are not translations of each other, so widen it only after looking at the offset report
overlap Any A/B pair whose time ranges intersect, biggest intersection first B was re-timed by a different tool, or B's cues are noticeably longer or shorter than A's A short B cue sitting between two A cues is taken by whichever overlaps more; a cue with no intersection at all stays unmatched even when it is obviously the same line
exact Only pairs whose start and end match to the millisecond You know both files were exported from one project without re-timing — this is the audit mode Any frame-rate difference or one-frame rounding makes it match nothing at all. That result is the report telling you the two timelines are not identical, not a bug in the tool

All three modes match on time only, never on text: a machine-translated B line shares no words with A, and today's tools rewrite translations word by word.

Why bilingual subtitles break the rules the single-language file passed

Rule setMax linesCPLCPSWhat a merged cue does to it

Reading speed is measured over the whole cue: characters ÷ time on screen. A merged cue keeps A's start and end while carrying A's text and B's, so its reading speed starts at the sum of the two — the only character the merge itself adds is the space that joins the lines. Merging is a text operation; it cannot create time. The numbers above are the presets this site checks against, marked published where a platform publishes the values and indicative where they are industry rules of thumb; the counts for your own file are in the report at the top of this page.

Why the two files stop matching — read the report, not the guesswork

What the report saysWhat it usually meansWhat to do first
B is shifted by a near-constant offset, and the spread of that offset is small A fixed edit: a trimmed intro, an added logo or bumper, a delayed audio track Shift B by exactly that offset, then merge. A fixed offset is one number for the whole file
Average start offset is large and the spread is large too A frame-rate mismatch, or two different cuts of the same material Convert B against the real frame rate first; if it is still uneven, the two files are not the same cut
Many cues in B unused, and the cue counts differ a lot One file carries SDH descriptions or speaker labels ([door slams], NARRATOR:) and the other does not Merge against the SDH-matched version of the pair, or accept single-language cues for those lines
exact matches nothing, while overlap pairs most cues Both files are timed correctly, but a few milliseconds apart — different tools, frame rounding Use overlap or nearest for the merge and keep exact for auditing exports from one project
Cue count in A is far larger than in B B is a partial translation — one speaker, or only the lines that needed it Nothing to fix: cues in A without a partner are exported in their own language, which is usually what was wanted

Root cause for all five, in one line: if the error is constant it is an offset; if it grows with time it is a speed or frame-rate difference; if the cue lists themselves differ in length, the two files are not the same edit.

Merging a whole season?

The studio keeps several files open at once, applies the mechanical fixes (shift, stretch, split) to all of them and exports a batch ZIP. Pro is a $9 one-time licence — lifetime, up to 3 devices — with a 7-day refund while the key is unactivated. Merging one pair of files, with the full match report, stays free on this page.

Open the studio

Questions people ask before using it

Which language goes on the top line?

Either order works technically, so the delivery spec decides. As a default: viewers read the first line first, so the original-language line on top with the translation below is the common arrangement. The switch here only sets the order of the lines inside each cue — it does not touch timings.

Why did some cues not match?

Four reasons cover almost everything: different frame rates, one file carrying SDH descriptions the other does not, a fixed offset between the two timelines, or two different cuts. The report separates them for you — average start-time difference and the spread of that difference tell the fixed-offset case apart from the growing-drift case, and the unused-cue list tells the SDH case apart from a partial translation.

Can this tool put the subtitles into the video, or burn them in?

No, and it is worth being blunt: the output is a subtitle file, not a video. No video is uploaded, decoded, rendered or encoded here. Burning subtitles into the picture or muxing them into a container is a rendering step that belongs to a video tool or an encoder — what this page produces is the two-line file that step consumes.

Does merging change the timings?

No. Every merged cue takes its start and end from file A. B's timings are used to find the partner cue and then dropped. Cues in A with no partner are exported unchanged, in one language, so an incomplete translation never silently deletes lines.