PolySub

Subtitles in any language, timed to the word.

PolySub recognises the speech in a video with the model that measured best for that language, builds subtitles that follow professional reading rules, and translates them with Claude. Below is real output it produced for a Japanese clip.

Subtitles:

This page plays files PolySub produced on an RTX 4060: the speech models need a GPU, so they can't run in the browser. Audio: 8 sentences from Google's FLEURS benchmark, read by different speakers.

Both tracks, side by side

Japanese (PolySub)
English (PolySub)

Tap a line to jump to it. English cues have their own timing (Whisper's offline translation); with Claude, translations keep the Japanese timing exactly and any language is possible.

How this was made

Japanesedetected from the first 30 seconds
Whisper large-v3chosen for Japanese because it measured better than Qwen3-ASR
6.7% CERthis clip, against the FLEURS transcripts (304 characters)
~2× real time82 s of audio recognised in about 41 s on an RTX 4060
$ python -m polysub demo_ja.mp4 --to ja --format vtt
$ python -m polysub demo_ja.mp4 --to en --format vtt
The real transcripts (FLEURS reference)

    Making this demo found a bug: Whisper skipped sentence 2 in the middle of its 30-second window. PolySub now recognises any detected speech that produced no words a second time, on its own. On 90 FLEURS clips the error rate stayed the same (3.85%), and no text appeared in long silences.

    Measured accuracy

    LanguageClipsQwen3-ASR-1.7B + alignerWhisper large-v3PolySub uses
    English (WER)903.8%4.2%Qwen
    Japanese (CER)905.4%4.1%Whisper
    Hindi (WER)30cannot time Hindi25.6%Whisper

    FLEURS dev set. Published benchmarks predicted Qwen for both English and Japanese; the measurement disagreed for Japanese, so PolySub routes Japanese to Whisper.