Repository navigation
Releases: lonthq/overtone-captions
Releases · lonthq/overtone-captions
Release list
Overtone 0.1.0
The first public release.
Format (overtone-format)
- The
.overtone.jsoncaption format: words stored once (time, speaker, semantic classesemphasis,key,
brand,number,soft, match kind and confidence), any number of line-cut profiles, each with anaspect
and itsrules, and a record of accepted LLMedits. - The format specification, version 1 (working draft): conformance, player processing and
conversion rules for WebVTT, SRT and plain text. - JSON Schema (
overtone-format/schema.json) and a validator (validate,assertValid) for timing, word
numbering, line text, speakers and cues. closestProfile,parseAspectandASPECT_PATTERNto pick the profile closest to a picture's shape.toPlayerDocumentstrips authoring data (meta,edits, per-wordmatchandconfidence) for publishing.- Exporters: WebVTT with class spans and voice tags, optionally a timestamp per word (
toWebVTT), SRT (toSRT)
and a plain transcript with speaker names (toTranscript). - ESM with TypeScript types. No runtime dependencies. Runs in Node 18+ and the browser.
Player (videojs-overtone)
- A video.js 8.5+ plugin (
player.overtone()) as ESM and as a script-tag bundle (window.OvertoneVideojs). - Automatic profile choice (
profile: 'auto'): the profile closest to the visible picture, re-checked on
resize, fullscreen and video size changes. - Captions sit on the visible picture; text size follows the profile's line length. Each cue carries the
document's language and each linedir="auto", so right-to-left and CJK text render correctly. - One captions button that cycles off, styled and plain (also the C key), remembered across visits
and kept in sync across players. - Speaker names option
speakers:never(default),changeoralways. - Style packs
clean,social,minimal,high-contrastandlumora, on a sharedbase.css. Each pack is a
CSS file and apack.json, checked for WCAG contrast, plain mode, reduced motion and scoping. A template and a
schema help you write your own. socialgrows the word being spoken.prefers-reduced-motion: reduceturns the motion off.- WebVTT fallback tracks for iOS native fullscreen.
- Load and validation errors are reported on the controller, not thrown. Once a document loads, the page's own
caption tracks are turned off so captions never show twice;dispose()restores them. videojs-overtone/core: the caption rendering without video.js.
CLI (overtone-captions, command overtone)
overtone transcribe: extracts the audio with ffmpeg, hears it with several speech engines, reconciles them in
code and corrects the words with an LLM editor. Up to 2 hours of media per file.- Text hearing from a transcription model (default
openai:gpt-transcribe), timing hearing with word times and
speakers from Azure AI Speech, and ElevenLabs Scribe as a second hearing whenELEVENLABS_API_KEYis set. - Text vote: where hearings disagree, the text model re-listens to the snippet and an LLM chooser picks the
words. - Editor (default
openai:gpt-6.1-sol): corrects misheard words, names and terms with your context and
glossary, labels speakers and marks key words. Code checks only the structure of its edits. Unsure edits are
applied and listed for review (meta.review). - The LLM never sets timestamps. A word no engine heard keeps an estimated time (
match: "interpolated",
confidence 0). - Without
--context, one short LLM call infers the topic and the names (--no-infer-contextskips it). - A request a provider refused does not stop the run. It is reported in a
REFUSEDblock and in
meta.refusals. --dry-runshows what a run would do, missing keys and an estimated cost, without sending a request.--localruns whisper.cpp and Ollama, with no keys.--text-filetimes an existing transcript instead of transcribing.
- Text hearing from a transcription model (default
- Providers per role (
--text,--timing,--llm):openai(and OpenAI-compatible servers),azure-openai,
anthropic,azure-speech,azure-mai,elevenlabs,whisper-cpp,ollama, andrecorded(replays
saved responses). - Line cutting by rules in code, per profile, showing hesitations as breaks. Profiles by name or aspect
(--profiles horizontal,1:1,4:5); rules for any aspect are interpolated between 16:9 and 9:16. A video in
another shape gets a profile for its own shape.--llm-linebreaksalso asks the LLM, within the same rules. - Rule set
1: the versioned, frozen line-cutting rules, so the same words always give the same captions
(--rules, recorded inmeta.rules). - Language packs for English and Dutch, detection for German, French, Spanish, Italian and Portuguese, and
neutral rules for every other language. Mixed-language media with--language en,es. - Exports:
.overtone.json, a player document, WebVTT (also with word timestamps), SRT, a transcript and, with
--export mp4, a video with burned-in captions. overtone burn: an MP4 with the captions burned in, drawn by the player's own code and style packs. Needs
ffmpeg 5.0+ and Google Chrome or Chromium.overtone recut: re-cuts existing SRT, WebVTT or.overtone.jsoninto the profiles' layouts, offline.overtone export,validate,init,languagesandproviders, all offline.- A request cache in
.overtone/, keyed only by what is sent: changing rules, profiles or language data sends no
paid request again. - Errors say what to fix. Keys are redacted from logs and errors.
- An Agent Skill (
skills/overtone/SKILL.md) that teaches coding agents to run the CLI safely.
Project
- Demo page, style gallery and a single-page CDN example (
examples/). - Live pipeline output on a generated sample, a NASA interview and three Blender open movies
(examples/output). - A benchmark of accuracy, timing, speakers, cost and speed in
bench/, and an offline regression gate on
frozen hearings (npm run bench:gate). - A provider kit: a template, a conformance suite on recorded HTTP exchanges, and
OVERTONE_RECORD_HTTPto
record them with secrets redacted. - Contributor guides for language packs, style packs and providers, each with a version for AI coding agents.
- A project site at overtone.lont.ai.