bilingual-subtitles

Installation
SKILL.md

Bilingual subtitles

Characters speak English on screen, and the ad's announcer speaks English; the Chinese audience reads Chinese first. Every spoken line carries a Chinese subtitle, set large, with the English line small beneath it - the layout Chinese fansub groups and Bilibili audiences know. In narrative films the Chinese is DialogueLine.zh; in an ad it is the script's zh under the announcer's vo, written by the copywriter and checked with the script. Netflix has no bilingual same-screen standard, so each language follows its own column of the Netflix timed-text guides (research, 1.4): a subtitle that breaks either language's rules fails, even if the other is fine.

Limits

Chinese (top, large) English (bottom, small)
Characters per line, 16:9 and 1:1 16 (checked on the screenplay and the ad script) 42
Characters per line, 9:16 12 (checked; research, 5.4: the vertical line is narrower) 32
Reading speed ≤ 9 characters / s ≤ 20 characters / s
Lines per event 1 (the renderer joins newlines, see below) 1
On screen at least 5/6 s (20 frames at 24 fps), at most 7 s same event as the Chinese
Punctuation no commas or full stops: a space instead; no trailing full stop (checked); question marks kept; full-width quotes “ ”; ellipsis … (U+2026) normal sentence punctuation; ellipsis … (U+2026)
Breaks never inside a word or a name never between article and noun, or inside a name

Reading speed is measured over the event's display time, spaces excluded for Chinese. A 16-character Chinese line needs at least 1.8 s; a 60-character English line needs 3 s. The screenplay's 12-word limit (checked) keeps a line near 4.4 s, so a single event normally fits both.

The renderer (buildAss in src/lib/titles.ts) strips line breaks and braces from subtitle text and uses no-wrap style, so one event is exactly one Chinese row and one English row, and inline style overrides are not possible. A line too long for the width is split into two consecutive events at a natural phrase boundary, each timed to the words it carries - never squeezed and never left to run off the frame.

Installs
1
GitHub Stars
10
First Seen
Oct 30, 2026