Overtone by Lont

Open-source captions · MIT

Captions cut for every screen shape.

One file holds the words and a line cut for each shape: 16:9, 9:16 or any you add. The player shows the cut closest to the picture. Re-cut subtitles you already have, or make new ones from audio.

A scene from Tears of Steel, a Blender open movie, in a 16:9 and a 9:16 Overtone player side by side. Captions appear word by word. Key words turn yellow and pop as they are spoken. The captions button then cycles from off to styled to plain and back to off.
Real pipeline output on Tears of Steel, a Blender open movie. The same moment is cut for 16:9 and 9:16. Key words pop, and the CC button cycles off → styled → plain. · MP4 version

Why Overtone

Most captions are cut once, for one screen, by filling each line to a length limit. Turn the video vertical and that cut falls apart. Overtone stores every word once, with its time and speaker, and cuts the lines for each screen shape by reading rules. A line avoids ending on “the” or “of”. Names and numbers stay together. Each speaker gets their own caption, and pauses show as breaks. Bring your own SRT or WebVTT, or let the CLI transcribe your media: a transcription model writes the text, speech engines time each word, and an LLM editor fixes names and terms. The LLM never sets timestamps.

Same words, cut two ways

A NASA interview with two speakers, cut for a 9:16 phone video (22 characters × 2 lines), from the same words and times. Filling lines to the limit ignores who is speaking and ends lines on “Jim,”, “A”, “I”, “the” and “about”.

Lines filled to the limit

the 2004 class. Jim,
thank you for joining

us. It's great to be
here, Allard. Thanks.

Well, if you wouldn't
mind, we've got a

…

don't you walk us
through you? Okay. A

little about me: I
grew up in Eugene,

Oregon. I joined the
Astronaut Corps about

four years ago, as you
said, May of 2004,

Overtone

Jim, thank you
for joining us.

It's great to be here,
Allard. Thanks.

Well,
if you wouldn't mind,

…

Okay.
A little about me:

I grew up
in Eugene, Oregon.

I joined
the Astronaut Corps

about four years ago,

as you said,
May of 2004,

On three English clips (21 minutes, 16:9 cuts), 0.3% of Overtone’s breaks end on a word like “the”, “of” or “and” with no pause after it. Filling lines to the limit gives 29%, ElevenLabs’ SRT export 16%. Overtone shows all 47 pauses of 0.5–1.5 s as a break; the other two show 28% and 72%. These are rule checks, not reader judgments. Details in the caption benchmark.

Three packages. Use any one.

The format sits in the middle. The player shows it, and the CLI writes it.

Format overtone-format

One .overtone.json file holds each word once, with its time, speaker and semantic classes, plus a line cut per screen shape. Comes with a JSON Schema, a validator and exporters to WebVTT, SRT and plain text. No runtime dependencies. Runs in Node and the browser.

{ "text": "Peacocks.",
  "start": 30.39, "end": 31.07,
  "classes": ["key"] }
Format docs →

Player videojs-overtone

A video.js 8.5+ plugin. It shows the line cut closest to the shape of the picture and switches live on resize. The CC button or the C key cycles off → styled → plain. Pick one of 5 style packs or write your own CSS.

player.overtone({
  src: 'talk.overtone.json',
  theme: 'social',
});
Player docs →

CLI overtone-captions

Re-cuts the SRT or WebVTT you already have, offline and with no keys. Or turns audio and video into captions: text from a transcription model (OpenAI, Azure OpenAI or ElevenLabs), word times and speakers from Azure AI Speech (or ElevenLabs or OpenAI), and an LLM editor (OpenAI, Azure OpenAI or Anthropic). Code checks the structure of every edit. --local runs it all on your machine. Writes JSON, WebVTT, SRT and a transcript, or an MP4 with the styled captions burned in.

npx overtone-captions recut talk.srt

overtone transcribe talk.mp4 \
  --context "Panel about cycling"
CLI docs →

Try it

Everything here runs in your browser from static files. The videos stream from NASA and Blender; they are not part of this project.

Demo

Three Blender open movies and a NASA interview in a 16:9 and a 9:16 player. Switch style packs, show or hide speaker names and cycle the CC button.

Open the demo →

Style gallery

Every semantic class in all 5 style packs, styled and plain, at 16:9 and 9:16, with a check that each line fits.

All packs side by side →

Live output

Unedited files from a real pipeline run on the NASA interview: 473 words, two speakers.

The same for three Blender open movies, each playable in the demo:

How we made them →

Contribute

Each task is small, has its own guide and needs no knowledge of the pipeline.