Skip to main content
Jonathan Andrei
Back to all posts
Jul. 202611 min read

Overtone: WCAG Audio Description for a Whole Video Archive at ~$0.03 a Minute, Generated in Place on Backblaze B2

WCAG requires a spoken audio-description track on prerecorded video: a narrator describing what is on screen in the pauses in the dialogue. Public universities owe this under federal law by April 26, 2027, but human describers charge $15-$75 per finished minute, so archives go undescribed or get deleted. Overtone reads each video out of a Backblaze B2 bucket, generates the description in place, and writes the described master back beside the original. Measured on a real 3-minute MIT OpenCourseWare lecture: about nine cents to describe, roughly three cents a minute end to end. Every generative step runs through Genblaze, with automatic provider failover so an archive-scale run does not die on a single transient error.

BackblazeGenblazeHackathonBackblaze B2GenblazeAccessibilityWCAGAssemblyAIOpenAI GPT-4oElevenLabsPython
I created this post and the Overtone project for the Backblaze x Genblaze hackathon. #BackblazeGenblazeHackathon

WCAG 2.1 SC 1.2.5 requires a spoken audio-description track on prerecorded video: a narrator describing what is on screen, spoken into the pauses in the dialogue. It is the accessibility requirement almost everyone skips, because captions are cheap and description is not. Human describers charge $15 to $75 per finished minute, so a university with twenty thousand lecture recordings faces a bill in the millions. The archive stays non-compliant, or gets taken offline. In 2017, UC Berkeley removed 20,000+ lectures from public access rather than pay to remediate them. US public entities owe WCAG 2.1 AA under the DOJ's ADA Title II rule by April 26, 2027.

Overtone landing page: dark theme, big headline reading 'Your archive is already accessible. It just hasn't been described yet.', a card showing $0.03 per minute cost with a small waveform, and four feature callouts along the bottom (Read from B2, Find the pauses, Describe and fit, Write back to B2)
The whole thesis on one page. The bill for a professional describer versus the bill for compute, on the same lecture.

The result on real footage

A 3-minute segment of an actual MIT OpenCourseWare lecture (18.03 Differential Equations, a chalkboard class) cost about nine cents to describe, roughly three cents per finished minute end to end. It reads the board with GPT-4o and voices the track with OpenAI TTS; short clips cost more per minute because fixed transcription overhead does not amortize. Either way it is hundreds to thousands of times cheaper than a person.

A finished described video open in the player: original video on the left, the AI description track waveform underneath, and the WebVTT descriptions cue list on the right showing individual timed cues that read chalkboard content aloud
The described track drops straight into Panopto or Kaltura via the same plain WebVTT format both platforms already ingest.
A/B comparison in the player: on the left the original with the pause silent, on the right the described version with the description voice filling the same pause and the program audio ducked underneath
Toggle the description off and the pause goes silent. Toggle it on and the description sits in exactly the same gap, with the program audio ducked underneath.
Frame from the described MIT 18.03 lecture: the professor writing on a chalkboard, the described-track transcript panel underneath reading the equation aloud in words instead of just naming that an equation is present
The board is read as spoken math ("y equals m x plus b"), diagrams traced node by node, on-screen text read verbatim. Generic tools would say "a slide with an equation appears." That is useless to a blind engineering student.

How the pipeline works

  • Read the video out of B2 (source, not just sink).
  • Transcribe with AssemblyAI universal-2 to get word-level timings.
  • Find the pauses a describer would speak into (silences long enough to hold a useful phrase), merging overlapping speakers so a gap is never invented where two people talk at once.
  • Sample keyframes for each pause, using a difference hash to skip slides that have not changed. A slide held for five minutes is described once, not eight times.
  • Describe each new pause with GPT-4o vision in a prompt that reads technical content aloud, sized to the length of the pause.
  • Fit the narration in a Genblaze AgentLoop (generate → evaluate → retry): speak it, measure the real audio, and if it overran the pause, rewrite it shorter using the rate the voice actually delivered.
  • Compose: mix the descriptions into the pauses with the program audio ducked underneath. If a pause is too short to fit even a trimmed description, freeze the frame and play the full description (WCAG 1.2.7 extended description).
  • Write back to B2, beside the original: the described .mp4, a WebVTT descriptions track, a reviewer transcript, and a hash-verified Genblaze provenance manifest.
Live-describe view over server-sent events: a curated clip processing in real time, with each pipeline step (transcribe, find pauses, describe, fit, mix, write-back) filling in as it completes and the running cost in cents ticking upward
The hosted demo pipes each pipeline step out over SSE so a first-time viewer sees the whole shape of the work, and the cost.
Pipeline diagram: source video in B2 flows through AssemblyAI, then the pause finder, then the difference-hash keyframe sampler, then GPT-4o vision description, then the Genblaze AgentLoop fit loop, then the ElevenLabs voice with OpenAI TTS failover, then ffmpeg mix, then back to B2 as .described.mp4 + .ad.vtt + transcript + ovtmanifest.json
The generative steps all pass through Genblaze; the storage endpoints on both sides are Backblaze B2. Nothing ever leaves storage the customer already trusts, which matters for FERPA-covered recordings.

Failover, provenance, resume

Vision and voice each run through a failover chain: if the primary provider rate-limits or errors, the next one takes over. Vision goes OpenAI → Google → GMI Cloud, voice goes ElevenLabs → OpenAI TTS. An archive-scale run does not die on a single transient failure. Every output is recorded in a hash-verified Genblaze Manifest stored beside the video in B2, so a re-run against a 10,000-video prefix costs almost nothing: unchanged videos are skipped (source SHA-256 matches the manifest), replaced videos are re-described (source SHA-256 changed).

CLI running `overtone archive lectures/` against a bucket prefix: a progress table listing 12 videos with columns for status (skipped / describing / done), cost, and manifest hash; three are skipped, one is currently describing, the rest are done
Point it at a bucket prefix. It describes everything not already done, records what it did, and stays idempotent.

What makes it different from the SaaS in this space

  • Commercial AI description tools (3Play, Verbit, Visonic) price per minute with a human in the loop, so they cannot serve an archive. 10,000 hours at $7/min is $4.2M. Overtone's cost scales with compute, not human minutes, so the unit of work is the archive, not the video.
  • They require upload. You ship them your video and pay egress. Overtone runs against B2 directly and writes results back in place, so the media never leaves storage you control.
  • Batch AI-description SaaS does exist (ViddyScribe, MediaScribe, Maestra). The distinction is where the work runs: those are services you upload your archive to. Overtone runs against B2 in place and writes results back beside each original.
  • And one thing generic description gets wrong that matters for lectures: technical content. Overtone reads the board (equations as spoken math, diagrams traced node by node, on-screen text read verbatim), not just that a slide is present.
Explainer slide from the demo: 'UC Berkeley removed 20,000+ lectures rather than pay to remediate them' with the Inside Higher Ed source, then '$15-$75 per finished minute for a human describer' with the 3Play source, then 'US public entities owe WCAG 2.1 AA by April 26, 2027' with the DOJ source
Every claim in the demo cites a primary source shown on screen. The 2027 deadline is what makes this a shipping problem, not an academic one.

Fits the workflow universities already have

Overtone emits a plain-text WebVTT descriptions track. That is exactly the format the two dominant university video platforms ingest: both Panopto and Kaltura accept an audio-description VTT that begins with WEBVTT and carries plain, time-based cues (they reject in-cue markup, which is why the output is kept tag-free). The described track drops straight into the system a university already runs, and the master and manifest stay in B2.

Honest limitations

  • The cost claim is per finished minute end-to-end on a 3-minute real MIT lecture. Longer runs amortize fixed transcription overhead better, so the per-minute cost tends to fall on archive-scale runs, but a production deployment should measure its own corpus.
  • Vision-model description quality on non-lecture material (film, sports, unscripted panels) has not been characterized. The prompt is tuned for chalkboard and slide content; other genres would need targeted eval.
  • The hosted demo runs against a curated video allowlist with a spend cap and per-client rate limit, so it stays safe on a public URL. Running against your own archive means running the CLI or the container against your own B2 credentials.
  • A production deployment should include a human review step for high-stakes content (medical, legal, safety training). The reviewer transcript is emitted for exactly this reason.
Your archive is already accessible. It just hasn't been described yet. Backblaze B2 is where the archive already lives, Genblaze orchestrates every generative step, and the described master, WebVTT track, transcript, and provenance manifest all write back beside each original. Same storage, same trust boundary, thousands of times the throughput of a human describer, and a deadline in April 2027 that turns this from a nice-to-have into a shipping problem.
Related project

Overtone: WCAG Audio Description for a Video Archive, Generated in Place on Backblaze B2. ~$0.03/min vs $15-$75 per Human Describer.

View the project