DEV Community

Cover image for Subtitle Reading Speed (CPS): The Limits, and Why AI Subtitles Break Them
Ray Mac
Ray Mac

Posted on Originally published at scribetoany.com

Subtitle Reading Speed (CPS): The Limits, and Why AI Subtitles Break Them

A subtitle can be perfectly accurate and still fail. If a line leaves the
screen before the viewer has finished reading it, the viewer has missed it.
Reading speed, measured in characters per second (CPS), is how
subtitlers catch that before anyone watches the video.

This post covers the limits the big style guides use and how to convert
between CPS and words per minute. It then runs a small experiment on
machine-made subtitles. The finding surprised us: most "too fast" subtitles
from AI transcription aren't too wordy. They're timed too tightly
, and you
can fix most of them without deleting a single word.

What CPS measures

CPS is the number of characters in a subtitle divided by how long it stays on
screen:

CPS = characters in the cue ÷ seconds on screen
Enter fullscreen mode Exit fullscreen mode

A 42-character line shown for 2 seconds runs at 21 CPS. The same line shown for
2.5 seconds runs at 16.8 CPS.

Two details change the result, so check them before you compare numbers
between tools:

  • What counts as a character. We count every character the eye reads, including spaces and punctuation, and leave out only the line break between two rows. Some tools skip spaces or punctuation. Their numbers come out lower for the same subtitle.
  • Which duration counts. The time on screen is the cue's end time minus its start time. It is not how long the person took to say the words. That difference is the whole story of the experiment below.

The limits in the major style guides

Guideline Reading speed Line length Lines Duration
Netflix, English (adult) up to 20 CPS 42 characters 2 max 5/6 s to 7 s
Netflix, English (children's) up to 17 CPS 42 characters 2 max 5/6 s to 7 s
Netflix, Simplified Chinese (adult) up to 9 CPS 16 characters 2 max 5/6 s to 7 s
Netflix, Japanese up to 4 CPS 13 full-width characters 2 max 5/6 s to 7 s
BBC 160–180 words per minute about 68% of a 16:9 frame width 2 (3 if nothing important is covered) about 0.3 s per word minimum

A few things stand out:

  • Chinese and Japanese limits are far lower, because each character carries much more meaning than a Latin letter. A Latin-script limit would never flag anything in Chinese text. You need a separate threshold for each script.
  • The maximum is not a target. Netflix drops to 17 CPS for children's programs, and the BBC's 160–180 words per minute works out to about 14–16 CPS (see below). Aiming below the ceiling leaves room for viewers who read slowly or are reading in a second language.
  • Minimum duration matters as much as the speed limit. Netflix's 5/6 of a second (20 frames at 24 fps) exists because a flash of text is hard to catch even when it is short.

Converting words per minute to CPS

Speech and subtitle guidelines often use words per minute (WPM). To convert
between the two, you need the average characters per word, including the space
after each word.

In the English sample we measured below (447 words, 2,413 characters), that
came to 5.4 characters per word. So, for English:

Words per minute ≈ CPS
140 12.6
160 14.4
180 16.2
200 18.0
220 19.8

So the BBC's 160–180 WPM works out to about 14–16 CPS in our counting,
noticeably below Netflix's 20 CPS adult ceiling. Audiobooks are commonly
recommended at 150–160 WPM; the explainer voice in our test below ran at 189. A
word-for-word subtitle of a fast talker can therefore break a 17 CPS limit on
text alone. But as the experiment shows, text is usually not the main cause.

An experiment: where AI subtitles break the limit

The audio. We used the English voiceover from our own product video: 2
minutes 48 seconds, 447 words, one clear synthetic voice with natural pauses
between sentences. The words take up 142 seconds of that time, and within those
seconds the voice runs at 189 WPM (17.0 CPS). That's a brisk but normal
explainer-video pace.

The subtitles. We transcribed it with Whisper (the open-source base
model, run locally). We then cut the result into subtitle cues with the same
splitting rules ScribeToAny's engine uses for exported SRT files:

  • at most 84 characters per cue (two lines of 42);
  • at most 7 seconds per cue;
  • break at the end of a sentence first, then at a clause.

Each cue starts at its first word and ends at its last word.

The check. We counted every cue against 17 and 20 CPS, the two Netflix
English limits, and flagged cues shorter than 5/6 of a second. We then applied
two standard fixes, one at a time.

Step Cues Median CPS Over 17 CPS Over 20 CPS Shorter than 5/6 s
A. Cues timed to the words 69 19.3 47 (68%) 29 (42%) 17
B. + end extended into the following pause 69 15.5 20 (29%) 9 (13%) 9
C. + short neighbours merged 41 15.5 10 (24%) 3 (7%) 1

What the numbers say

Timed to the words, two thirds of the cues were "too fast." Yet the audio
averages exactly 17.0 CPS while someone is talking. The average cue was not
too wordy. Cues that start and end exactly with the speech leave no reading
time, and the short ones suffer most. For example:

  • "Need more?" was on screen for 0.36 s, which works out to 27.8 CPS.
  • "Fix it right there." lasted 0.6 s, which works out to 31.7 CPS.

Using the pauses fixed more than half of the failures. For step B, each
cue's end time moves forward into the silence before the next line starts. We
left an 80 ms gap (about 2 frames at 25 fps) and capped each cue at 7 seconds.
That alone took the cues over 17 CPS from 47 to 20, without changing a word.

Merging short neighbours fixed most of the rest. For step C, a cue that
was still too fast merged with the next one when the result stayed within 84
characters and 7 seconds. We only merged where the combined text ended at
punctuation, so no subtitle ends mid-phrase.

  • A 0.44-second "Turn on" fragment rejoined the rest of its sentence, "detect speakers, and every line gets a speaker label." The merged cue runs at 15.7 CPS.
  • Cues over 20 CPS fell to 3 of 41.

What's left is a small editing job. To bring every remaining cue to 17 CPS,
you would need to cut 40 characters out of 2,399, about 1.7% of the text.
To reach 20 CPS, you would cut 5 characters. That is where a human makes
choices: dropping a filler word, or shortening "Then take it out in the format
you need" to "Then export it."

The caveats. This is one recording, with one voice, and with clean pauses
between sentences. A real conversation has fewer pauses, overlapping speakers
and faster bursts, so steps B and C buy less there and condensing matters
more. But the ordering holds in general: fix the timing before you cut
words.

Fixing a fast subtitle, in order

  1. Extend the end time into silence. If the next line doesn't start immediately, let the current cue stay on screen longer. Keep a small gap of about 2 frames before the next cue, so the viewer can see that the subtitle changed.
  2. Respect the minimum duration. Nothing should flash on screen for less than about 5/6 of a second, even a one-word "Yes."
  3. Merge short neighbours. Two quick lines from the same speaker often read better as one two-line subtitle. Stay within your line and duration limits, and don't merge across a change of speaker.
  4. Only then, condense. Remove fillers ("you know," "basically"), false starts and repeated words. Keep the meaning, names and numbers. For a verbatim or legal transcript you wouldn't do this, but subtitles are a reading aid, not a record.
  5. Break lines in sensible places. When a subtitle needs two lines, break after punctuation, or before a conjunction or preposition. Netflix's style guide asks you not to split an article from its noun or a first name from a last name. It also prefers a bottom-heavy shape, with the longer line underneath.

Chinese, Japanese and Korean

For these scripts, character counts behave differently:

  • Netflix's Simplified Chinese guide allows 9 CPS and 16 characters a line.
  • Its Japanese guide allows 4 CPS and 13 full-width characters.

A Latin 17 CPS threshold would pass almost any Chinese subtitle, however
cramped. Choose the threshold by the script on screen, not by the source
language. An English translation of a Chinese video is checked as English.

Checking reading speed in ScribeToAny

ScribeToAny's transcript editor has a QC mode on every plan, free
included. Turn on Reading-speed & line checks and each cue shows the
following:

  • its CPS, amber when it gets close to your limit and red when it goes over;
  • the character count of each line, with lines over the limit flagged;
  • whether a cue is under 5/6 of a second or over 7 seconds, or too close to the previous cue.

The defaults are the conservative ones:

  • 17 CPS and 42 characters a line for Latin scripts;
  • 9 CPS and 16 characters for Chinese, Japanese and Korean, picked automatically from the text on screen.

You can change both numbers, for example to 20 CPS for Netflix-style adult
English. You can edit start and end times directly, split a cue or merge it
with the next one, and roll back to an earlier version. Then export SRT or VTT
with the same timings.

To be clear about what it doesn't do: QC mode flags problems. It doesn't
retime cues for you.
Steps 1 to 4 above are still your call. That's
deliberate. A tool that silently stretches or rewrites subtitles makes
decisions only a person watching the video can make.

If you only need to adjust an existing SRT file, the free
SRT editor runs in your browser without an account. It
doesn't show reading-speed checks.

Related:

Sources


Originally published on the ScribeToAny blog.

Top comments (0)