Repository navigation
Subtitles you can deliver. Every run writes <name>_final.srt: every word and tag of the transcript, laid out by subtitling rules and timed the way a reviewer finishes a job -- in sync with the speech first, the other rules as far as the speech allows.
Upgrade notes (behaviour changes)
- Cues now start with their first word and run on to the next cue across short pauses; a fast short sentence keeps its own cue even under
--min-cue-ms.--no-sync-starts,--chain-gap-ms 0and--lead-out-ms 0bring back the 2.2.0 timing. _sentence_level.srt(and VTT/ASS) carry the speech only; the editor's tags are in_final.srt(and_combined.srtwith--tags).
Added
-
<name>_final.srton every run — the deliverable, written after the combined file: every word and every[tag]of the transcript in order, within the layout and timing rules, checked when it is written (summary in the log, details underfinal_checkin the job manifest, warnings for anything left). See The final SRT in the user guide. -
Subtitle line-break rules for English (
wordalign/linebreak.py): subject + verb, auxiliaries, phrasal verbs, verb + object pronoun, names and titles, numbers and units stay together; breaks prefer sentence ends, then clause punctuation, then conjunctions and prepositions. -
Timing in a reviewer's style (measured on a finished, human-reviewed job): cues start with their first word (
--no-sync-startslets a short cue start earlier to reach--min-cue-ms), run on to the next cue across pauses up to 1 s (--chain-gap-ms), and linger 250 ms after a longer pause (--lead-out-ms). A short sentence keeps its own short cue instead of being joined to its neighbour; the final check lists those as "kept in sync" rather than as failures. Sync with the audio comes before the duration and reading-speed rules everywhere: overlap fixes and boundary moves never push a cue's start past its first word. -
The review queue flags cues next to a sound tag (words under applause or laughter are often mistimed).
wordalign-bench fit-triagealso finds a finished file named<name>*reviewed*.srt, and counts only real fixes (changed words, moved starts, ends cut before the words were over) -- not cues cut differently or left on screen longer.
Changed
- Sound tags never overlap speech. The transcript's
[tag]lines are placed in the pause where the editor put them (timed by a matching sound event, cut back to the pause), or share the neighbouring cue when the pause is too short._combined.srtand_audio_tags.srtuse the same placement, and an input SRT's tags are kept too. _sentence_level.srt(and VTT/ASS) carry the speech only; tags are in the final and combined files. The review queue and_corrected.srtfollow the final cues.- Transcript lines too long for
--max-lines×--cpl, or on screen longer than--max-duration-ms, are split at their best break instead of being left as one long line; cues never merge past the duration limit. - Short and fast cues use the free time after them and can move a boundary to a better word; with
--no-sync-startsthey may also start early, borrow a few ms from a neighbour or join it. Every cue keeps at least 1 ms from the next. - Cue boundaries that split a phrase are moved to a cleaner word nearby, or to punctuation within the same two cues; a boundary at a sentence end is never moved.
- A
[tag]line inside a sentence ("but in" /[chuckles]/ "a tornado.") stays inline where the editor put it; a tag between sentences gets a cue of its own filling its pause (down to 0.5 s), timed by a matching sound event when there is one.
Fixed
- The WhisperX worker finds the alignment model in the models folder or its
hub/subfolder (it only looked in the first). - A transcript line that is only punctuation (a closing quote on its own line) no longer gives a cue a guessed start; it joins the word before it.
- A broken-off quote (
"I don't--") ends a sentence, so the next sentence starts a new cue.