Subtitle Editor
Open a video and its WebVTT subtitles side by side, see where each line appears on a waveform of the audio, and fix the wording or timing before you use the file again. Nothing to install; it runs in your browser.
How it works
-
Open the video
Choose a file from your computer, or paste the link to a video. Videos whose site allows it (CORS) also get a waveform, which shows where speech starts and stops.
-
Open the subtitles
Load a .vtt or .srt file into track A. Track B is for a second file to compare against, such as the source language or a previous version. Press New on a track to start from scratch.
-
Fix wording and timing
Drag lines on the timeline to move them, drag their ends to change when they appear and disappear, and type corrections in the list. Choose which track to preview over the video. With Follow on, a track’s list keeps the line being played in view.
Lines that are too fast to read, too long, or too short on screen are flagged (set the limits with Checks). Edited and new lines are marked, and a track’s header counts them: click a count to show only those lines.
-
Download
Download .vtt saves the track to your computer. Each track’s ⋯ menu can also export it to Excel and import it back, checking every row first.
Open a video, or drop one here.
No cues yet. Open a subtitle file, press “Add cue”, or drag across lane {{ key.toUpperCase() }} in the timeline.
Showing only {{ listFilter[key] === 'changed' ? 'changed lines' : 'lines with problems' }}{{ cueRows[key].length ? '' : ' (none left)' }}.
Language of track {{ dialog.key.toUpperCase() }}
Shift times in {{ tracks[dialog.key].label }}
Find and replace in {{ tracks[dialog.key].label }}
Reading checks
Lines that break these limits are flagged in the lists and on the timeline. 0 turns a check off. They’re kept in this browser.
Keyboard shortcuts
| {{ key }} | {{ shortcut.action }} |
Import cues from {{ dialog.fileName }}
Which column is which?
The end can come from an End column or a Duration column. Times can be 00:01:02.500, 1:02.5, seconds or Excel times.
| Row | Start | End | Text | Notes | |
|---|---|---|---|---|---|
| {{ row.rowNumber }} | {{ row.start === null ? row.startText : formatTime(row.start) }} | {{ row.end === null ? row.endText : formatTime(row.end) }} | {{ row.text }} | {{ row.messages.join(' ') }} |
Showing the first 300 of {{ importCheck.rows.length }} rows. All of them are checked.