Skip to main content
Jonathan Andrei
Retour aux billets
Juil. 202611 min de lecture

Overtone : description audio WCAG pour toute une archive vidéo à environ 0,03 $ la minute, générée sur place dans Backblaze B2

La WCAG exige une piste de description audio parlée sur les vidéos préenregistrées : un narrateur décrivant ce qui est à l'écran dans les pauses du dialogue. Les universités publiques doivent cela en vertu de la loi fédérale d'ici le 26 avril 2027, mais les descripteurs humains facturent 15 à 75 $ par minute finie, donc les archives restent sans description ou sont supprimées. Overtone lit chaque vidéo depuis un bucket Backblaze B2, génère la description sur place, et écrit le master décrit à côté de l'original. Mesuré sur un vrai cours MIT OpenCourseWare de 3 minutes : environ neuf cents pour décrire, soit environ trois cents la minute de bout en bout. Chaque étape générative passe par Genblaze, avec bascule automatique de fournisseur pour qu'un run à l'échelle d'une archive ne meure pas sur une seule erreur transitoire.

BackblazeGenblazeHackathonBackblaze B2GenblazeAccessibilityWCAGAssemblyAIOpenAI GPT-4oElevenLabsPython
J'ai créé ce billet et le projet Overtone pour le hackathon Backblaze x Genblaze. #BackblazeGenblazeHackathon

WCAG 2.1 SC 1.2.5 exige une piste de description audio parlée sur les vidéos préenregistrées : un narrateur décrivant ce qui est à l'écran, parlé dans les pauses du dialogue. C'est l'exigence d'accessibilité que presque tout le monde saute, parce que les sous-titres sont bon marché et que la description ne l'est pas. Les descripteurs humains facturent 15 à 75 $ par minute finie, donc une université avec vingt mille enregistrements de cours fait face à une facture de plusieurs millions. L'archive reste non conforme, ou est retirée du public. En 2017, UC Berkeley a supprimé plus de 20 000 cours de l'accès public plutôt que payer pour les remédier. Les entités publiques américaines doivent la WCAG 2.1 AA en vertu de la règle Title II de l'ADA du DOJ d'ici le 26 avril 2027.

Page d'accueil d'Overtone : thème sombre, gros titre « Votre archive est déjà accessible. Elle n'a simplement pas encore été décrite. », une carte affichant le coût de 0,03 $ par minute avec une petite forme d'onde, et quatre encarts de fonctionnalités en bas (Lire depuis B2, Trouver les pauses, Décrire et ajuster, Réécrire dans B2)
Toute la thèse sur une page. La facture d'un descripteur professionnel contre la facture pour le compute, sur le même cours.

Le résultat sur de vraies images

Un segment de 3 minutes d'un vrai cours MIT OpenCourseWare (18.03 Équations différentielles, un cours au tableau) a coûté environ neuf cents pour décrire, soit environ trois cents par minute finie de bout en bout. Il lit le tableau avec GPT-4o et donne la voix à la piste avec OpenAI TTS ; les courts clips coûtent plus par minute parce que le surcoût fixe de transcription ne s'amortit pas. Dans les deux cas, c'est des centaines à des milliers de fois moins cher qu'une personne.

Une vidéo décrite finie ouverte dans le lecteur : vidéo originale à gauche, la forme d'onde de la piste de description IA en dessous, et la liste de cues WebVTT à droite montrant les cues chronométrés individuels qui lisent le contenu du tableau à haute voix
La piste décrite tombe directement dans Panopto ou Kaltura via le même format WebVTT que les deux plateformes ingèrent déjà.
Comparaison A/B dans le lecteur : à gauche l'original avec la pause silencieuse, à droite la version décrite avec la voix de description remplissant la même pause et l'audio du programme atténué en dessous
On désactive la description et la pause devient silencieuse. On l'active et la description prend exactement le même intervalle, avec l'audio du programme atténué en dessous.
Image du cours MIT 18.03 décrit : le professeur écrit au tableau, le panneau de transcription de la piste décrite en dessous lit l'équation à voix haute en mots au lieu de simplement nommer qu'une équation est présente
Le tableau est lu comme des maths parlées (« y égale m x plus b »), les diagrammes tracés nœud par nœud, le texte à l'écran lu textuellement. Les outils génériques diraient « une diapo avec une équation apparaît ». C'est inutile pour un étudiant en ingénierie non-voyant.

Comment le pipeline fonctionne

  • Lire la vidéo depuis B2 (source, pas seulement destination).
  • Transcrire avec AssemblyAI universal-2 pour obtenir les horodatages au niveau du mot.
  • Trouver les pauses dans lesquelles un descripteur parlerait (silences assez longs pour contenir une phrase utile), en fusionnant les locuteurs qui se chevauchent pour qu'un intervalle ne soit jamais inventé là où deux personnes parlent en même temps.
  • Échantillonner les keyframes pour chaque pause, en utilisant un hash de différence pour sauter les diapos qui n'ont pas changé. Une diapo tenue cinq minutes est décrite une fois, pas huit.
  • Décrire chaque nouvelle pause avec la vision GPT-4o dans un prompt qui lit le contenu technique à voix haute, calibré à la longueur de la pause.
  • Ajuster la narration dans un AgentLoop Genblaze (générer → évaluer → réessayer) : la prononcer, mesurer le vrai audio, et si elle a dépassé la pause, la réécrire plus court en utilisant le débit que la voix a réellement livré.
  • Composer : mixer les descriptions dans les pauses avec l'audio du programme atténué en dessous. Si une pause est trop courte pour même une description raccourcie, geler l'image et jouer la description complète (description étendue WCAG 1.2.7).
  • Réécrire dans B2, à côté de l'original : le .mp4 décrit, une piste descriptions WebVTT, une transcription réviseur et un manifeste de provenance Genblaze vérifié par hash.
Vue de description en direct via server-sent events : un clip curé en cours de traitement en temps réel, chaque étape du pipeline (transcrire, trouver les pauses, décrire, ajuster, mixer, réécrire) se remplissant à mesure qu'elle se termine et le coût courant en cents qui monte
La démo hébergée diffuse chaque étape du pipeline via SSE pour qu'un visiteur qui découvre voie toute la forme du travail, et le coût.
Diagramme du pipeline : la vidéo source dans B2 passe par AssemblyAI, puis le détecteur de pauses, puis l'échantillonneur de keyframes par hash de différence, puis la description vision GPT-4o, puis la boucle d'ajustement AgentLoop Genblaze, puis la voix ElevenLabs avec bascule OpenAI TTS, puis le mixage ffmpeg, puis retour dans B2 en .described.mp4 + .ad.vtt + transcription + ovtmanifest.json
Toutes les étapes génératives passent par Genblaze ; les points de stockage des deux côtés sont Backblaze B2. Rien ne quitte jamais le stockage auquel le client fait déjà confiance, ce qui compte pour les enregistrements couverts par FERPA.

Bascule, provenance, reprise

La vision et la voix passent chacune par une chaîne de bascule : si le fournisseur primaire limite ou échoue, le suivant prend le relais. La vision passe par OpenAI → Google → GMI Cloud, la voix par ElevenLabs → OpenAI TTS. Un run à l'échelle d'une archive ne meurt pas sur une seule défaillance transitoire. Chaque sortie est enregistrée dans un Manifeste Genblaze vérifié par hash stocké à côté de la vidéo dans B2, donc un re-run contre un préfixe de 10 000 vidéos coûte presque rien : les vidéos inchangées sont sautées (le SHA-256 de la source correspond au manifeste), les vidéos remplacées sont redécrites (le SHA-256 de la source a changé).

CLI exécutant `overtone archive lectures/` contre un préfixe de bucket : un tableau de progression listant 12 vidéos avec des colonnes pour statut (sauté / en cours / fait), coût et hash de manifeste ; trois sont sautées, une est en cours de description, le reste est fait
On le pointe sur un préfixe de bucket. Il décrit tout ce qui n'est pas déjà fait, enregistre ce qu'il a fait, et reste idempotent.

Ce qui le distingue des SaaS dans ce domaine

  • Les outils commerciaux de description IA (3Play, Verbit, Visonic) facturent à la minute avec un humain dans la boucle, ils ne peuvent donc pas servir une archive. 10 000 heures à 7 $/min font 4,2 M$. Le coût d'Overtone se met à l'échelle avec le compute, pas avec les minutes humaines, donc l'unité de travail est l'archive, pas la vidéo.
  • Ils exigent l'upload. On leur envoie sa vidéo et on paie l'egress. Overtone tourne contre B2 directement et écrit les résultats sur place, donc les médias ne quittent jamais le stockage qu'on contrôle.
  • Des SaaS de description IA en lot existent (ViddyScribe, MediaScribe, Maestra). La distinction, c'est où le travail tourne : ce sont des services vers lesquels on téléverse son archive. Overtone tourne contre B2 sur place et écrit les résultats à côté de chaque original.
  • Et une chose que la description générique rate qui compte pour les cours : le contenu technique. Overtone lit le tableau (équations en maths parlées, diagrammes tracés nœud par nœud, texte à l'écran lu textuellement), pas seulement le fait qu'une diapo est présente.
Diapo explicative de la démo : « UC Berkeley a retiré plus de 20 000 cours plutôt que payer pour les remédier » avec la source Inside Higher Ed, puis « 15 à 75 $ par minute finie pour un descripteur humain » avec la source 3Play, puis « Les entités publiques américaines doivent la WCAG 2.1 AA d'ici le 26 avril 2027 » avec la source DOJ
Chaque affirmation dans la démo cite une source primaire montrée à l'écran. L'échéance 2027 est ce qui fait de ceci un problème à livrer, pas un problème académique.

S'intègre au flux de travail que les universités ont déjà

Overtone émet une piste descriptions WebVTT en texte brut. C'est exactement le format que les deux plateformes vidéo universitaires dominantes ingèrent : Panopto et Kaltura acceptent tous deux une VTT de description audio qui commence par WEBVTT et porte des cues simples basés sur le temps (elles refusent le balisage dans les cues, c'est pourquoi la sortie reste sans balises). La piste décrite tombe directement dans le système qu'une université fait déjà tourner, et le master et le manifeste restent dans B2.

Limites honnêtes

  • Le chiffre de coût est par minute finie de bout en bout sur un vrai cours MIT de 3 minutes. Les runs plus longs amortissent mieux le surcoût fixe de transcription, donc le coût par minute tend à baisser sur des runs à l'échelle d'une archive, mais un déploiement de production devrait mesurer son propre corpus.
  • La qualité de description du modèle vision sur du matériel hors-cours (film, sports, panels non scriptés) n'a pas été caractérisée. Le prompt est réglé pour le contenu tableau et diapo ; d'autres genres demanderaient une évaluation ciblée.
  • La démo hébergée tourne contre une liste blanche de vidéos curées avec un plafond de dépense et une limite par client, pour rester sûre sur une URL publique. Tourner contre sa propre archive signifie exécuter le CLI ou le conteneur contre ses propres identifiants B2.
  • Un déploiement de production devrait inclure une étape de revue humaine pour les contenus à fort enjeu (médical, juridique, formation sécurité). La transcription réviseur est émise exactement pour cette raison.
Votre archive est déjà accessible. Elle n'a simplement pas encore été décrite. Backblaze B2 est là où l'archive vit déjà, Genblaze orchestre chaque étape générative, et le master décrit, la piste WebVTT, la transcription et le manifeste de provenance sont tous réécrits à côté de chaque original. Même stockage, même frontière de confiance, des milliers de fois le débit d'un descripteur humain, et une échéance en avril 2027 qui transforme ceci d'un plus en un problème à livrer.
Projet associé

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

Voir le projet