Fonctionnement

Comment votre vidéo devient des sous-titres, sans quitter votre appareil

Subtitle Generator fait tourner un modèle de reconnaissance vocale dans l'onglet de votre navigateur. Voici chaque étape, du fichier aux sous-titres, ce que le navigateur télécharge et garde, et ce que nous avons mesuré ou non.

Cinq étapes, toutes dans votre onglet

1. Votre navigateur ouvre le fichier

Vous choisissez un fichier vidéo ou audio, et le navigateur donne à la page ce seul fichier. La page le confie au moteur dans l'onglet. Rien n'est envoyé.

2. Le son est lu par tranches

Là où votre navigateur le permet, un lecteur multimédia dans un Web Worker lit le son 30 secondes à la fois avec les décodeurs de votre navigateur, et le convertit en 16 kHz mono, la forme qu'attend le modèle.

3. Des fenêtres coupées aux moments calmes

Le son est regroupé en fenêtres d'environ 3 minutes. Chaque coupure tombe au milieu de la demi-seconde la plus calme des 15 secondes qui précèdent le repère des 3 minutes, pour couper dans une pause plutôt qu'au milieu d'un mot.

4. Le modèle écrit chaque fenêtre

Un détecteur de voix repère les passages parlés, et le modèle de reconnaissance vocale les écrit, avec sa propre estimation du début et de la fin des mots.

5. Les mots deviennent des sous-titres

Les mots sont répartis en sous-titres assez courts pour être lus, ils s'affichent sur la page et vous les modifiez. Le fichier SRT ou WebVTT est écrit quand vous cliquez sur télécharger.

Schéma du trajet de votre fichier : votre vidéo ou votre audio est ouvert avec l'API File du navigateur ; là où le navigateur le peut, un lecteur multimédia dans un Web Worker lit le son du fichier 30 secondes à la fois (sinon, la page décode le fichier entier) ; et le modèle de reconnaissance vocale écrit chaque fenêtre d'environ 3 minutes avec WebGPU ou WebAssembly. Votre onglet affiche les sous-titres, vous les modifiez et enregistrez un fichier SRT ou WebVTT. Rien du fichier n'est envoyé. Le seul trafic, ce sont des téléchargements depuis le serveur du site : la page, puis, avec votre premier fichier, le moteur, le lecteur multimédia, le modèle (environ 60 ou 264 Mo, en parties) et un petit détecteur de voix. Le navigateur garde le modèle et le détecteur s'il a la place, et à chaque visite ne redemande que les petits fichiers qui listent leurs parties.
Votre fichier reste dans l'onglet du navigateur : la page, son moteur, le lecteur multimédia, le modèle et le détecteur de voix arrivent, et rien de votre fichier ne repart.

Le modèle : Whisper, en deux tailles

Les mots viennent de Whisper, un modèle de reconnaissance vocale publié par OpenAI en 2022 avec ses poids sous licence MIT. Il tourne grâce à whisper.cpp, une version open source en C++, que nous compilons en WebAssembly pour qu'elle s'exécute dans une page web. Vous choisissez entre deux tailles :

  • Le modèle plus petit (par défaut) est Whisper base, avec des poids arrondis à 5 bits : un téléchargement de 59,7 Mo.
  • Le modèle plus grand est Whisper small, avec des poids sur 8 bits : un téléchargement de 264,5 Mo qui demande plus de mémoire.

Dans l'article d'OpenAI, les modèles Whisper plus grands faisaient mieux dans la plupart de ses tests, avec les gains les plus faibles pour l'anglais, mais nous n'avons pas encore mesuré la différence entre ces deux-là sur ce moteur : la page les appelle donc « plus petit » et « plus grand » sans promettre que l'un est plus précis. Avant le modèle, un petit détecteur de voix, Silero VAD, repère où l'on parle, pour que le modèle consacre son temps à la parole. Si vous laissez la langue en automatique, le modèle l'identifie dans la première fenêtre qui contient de la parole, et la page garde cette langue pour le reste du fichier.

Chaque fenêtre est écrite avec les derniers mots qui la précèdent, environ 200 caractères, comme contexte : le modèle les lit comme le texte qui venait juste avant la coupure. Dès qu'une fenêtre est terminée, ses sous-titres s'affichent sur la page, et vous pouvez les modifier pendant que la suivante s'écrit. Créez les sous-titres de votre vidéo pour le voir.

Comment les mots deviennent des sous-titres

Le modèle renvoie des segments de texte, chacun avec un début et une fin, et son estimation du début et de la fin des mots qu'il contient. Un segment peut être une longue phrase : la page le découpe en sous-titres qu'on a le temps de lire.

  • Au plus deux lignes de 42 colonnes par sous-titre ; un caractère large, comme en chinois ou en japonais, compte pour deux colonnes. Les écritures sans espaces sont découpées en mots par le segmenteur de mots du navigateur.
  • Au plus 7 secondes à l'écran, et au moins 1 seconde quand l'écart avec le suivant le permet.
  • Les coupures tombent entre deux mots : d'abord en fin de phrase, puis à une virgule ou à une pause d'une demi-seconde ou plus, sinon là où les deux parties s'équilibrent. Un signe fermant reste avec le mot qui le précède.
  • La coupure est minutée d'après les temps des mots. Si le modèle n'en a donné aucun qui corresponde au texte, la durée est partagée selon le texte.
  • Les sous-titres ne se chevauchent jamais, et aucun ne finit après la fin du fichier.
Quatre étapes de la parole aux sous-titres : le son est découpé en fenêtres d'environ 3 minutes, chaque coupure sur la demi-seconde la plus calme des 15 secondes qui précèdent le repère ; un détecteur de voix repère la parole et le modèle l'écrit, avec son estimation du début et de la fin des mots ; les derniers mots de chaque fenêtre, environ 200 caractères, passent à la suivante comme contexte ; les mots sont répartis en sous-titres de deux lignes de 42 colonnes et 7 secondes au plus, coupés en fin de phrase, à une virgule ou à une pause, et minutés d'après les temps des mots ou, si le modèle n'en a donné aucun qui corresponde, selon le texte.
Comment la page transforme le son de votre fichier en sous-titres. Les limites sont celles du code des sous-titres.

Les temps viennent de l'estimation du modèle lui-même du début et de la fin de ses mots, ou de ce partage selon le texte : un sous-titre peut donc arriver un peu tôt ou un peu tard. Nous n'avons pas encore mesuré de combien sur ce moteur. Si un sous-titre est décalé, vous pouvez le corriger à la main : avancer ou reculer son début ou sa fin de 0,1 seconde, le couper ou le fusionner avec le suivant.

Quelle version du moteur tourne

Le moteur existe en trois versions, et la page en choisit une quand vous ajoutez votre premier fichier :

  • WebGPU, essayée en premier quand votre navigateur propose un adaptateur graphique qui passe la vérification de la page. Si elle échoue au chargement ou en écrivant une fenêtre, la page passe à une version pour le processeur et récrit cette fenêtre.
  • WebAssembly multithread, un thread par processeur logique annoncé par le navigateur. Les threads exigent une page isolée des autres origines, d'où les en-têtes COOP et COEP envoyés par le site.
  • WebAssembly monothread, le dernier recours pour un navigateur qui ne gère pas les threads, et la version utilisée si votre navigateur annonce un seul processeur logique.

La ligne sous l'aperçu indique la version utilisée, par exemple « WebAssembly sur plusieurs threads ». Nous n'avons pas encore mesuré la version WebGPU sur une vraie carte graphique : le site n'affirme donc rien sur sa vitesse. Quelle que soit la version, votre appareil fait le travail : la ligne d'état affiche une estimation du temps restant, mesurée sur votre appareil au fil du traitement, plutôt qu'une vitesse promise.

Ce que votre navigateur télécharge, et ce qu'il garde

Tout vient de ce site. Les modèles sont découpés en parties de 20 Mio au plus, car l'hébergeur sert des fichiers statiques de 25 Mio au maximum, et chaque partie est vérifiée avec son empreinte SHA-256 avant usage : un téléchargement abîmé est refusé au lieu de produire de mauvais sous-titres. Les tailles sont celles des fichiers publiés, en mégaoctets d'un million d'octets :

Fichiers que la page télécharge depuis ce site
FichierTailleGardé dans
Le moteur, version WebAssembly multithread (si WebGPU n'est pas utilisé et que votre navigateur annonce au moins deux processeurs logiques)1,6 MoLe cache habituel du navigateur
Le moteur, version monothread (sans threads disponibles, ou si votre navigateur annonce un seul processeur logique)1,5 MoLe cache habituel du navigateur
Le moteur, version WebGPU (seulement si la page trouve un GPU utilisable)3,4 MoLe cache habituel du navigateur
Le modèle plus petit, Whisper base (par défaut)59,7 Mo, en 3 partiesCache Storage, après vérification SHA-256 de chaque partie, si le navigateur a la place
Le modèle plus grand, Whisper small (seulement si vous le choisissez)264,5 Mo, en 13 partiesCache Storage, après vérification SHA-256 de chaque partie, si le navigateur a la place
Le détecteur de voix, Silero VAD0,9 Mo, en 1 partieCache Storage, après vérification SHA-256, si le navigateur a la place
Le lecteur multimédia (un script de la page, téléchargé quand vous ajoutez votre premier fichier)0,3 MoLe cache habituel du navigateur

Le moteur, le lecteur multimédia, le modèle et le détecteur ne se téléchargent qu'une fois un fichier ajouté, pas à l'ouverture de la page. La page ne met jamais votre fichier, le son qu'elle en tire ni vos sous-titres dans le stockage de votre navigateur : ils vivent dans l'onglet ouvert et disparaissent à sa fermeture. Pour supprimer le modèle gardé, effacez les données de ce site dans votre navigateur. Le test réseau pas à pas montre comment observer tout cela dans les outils de développement de votre navigateur.

Comment nous le testons

Un test automatique de navigateur s'exécute à chaque modification du site. Il charge une copie compilée du site dans Chromium, le moteur de Chrome et d'Edge, avec les en-têtes de sécurité du site, et vérifie notamment que :

  • une phrase anglaise de 3,5 secondes du corpus LibriSpeech, "Concorde returned to its place amidst the tents.", ressort en sous-titres avec deux mots faux au plus, avec le modèle plus petit, depuis un fichier WAV, une vidéo MP4 et un fichier WebM ;
  • après une modification, un décalage de 0,1 seconde et une coupure, les fichiers SRT et WebVTT se relisent exactement comme les sous-titres de la page, et le lecteur de sous-titres de Chromium charge le fichier WebVTT ;
  • sur un fichier de 60 secondes avec la même phrase toutes les 10 secondes, traité avec des fenêtres de test de 20 secondes au lieu des 3 minutes de l'outil, les sous-titres arrivent en au moins trois étapes, et à chacun des six repères un sous-titre contenant la phrase entière commence entre une demi-seconde avant le repère et 2 secondes après ;
  • Annuler arrête le traitement, et le fichier suivant réutilise le modèle gardé, sans nouveau téléchargement ;
  • un extrait silencieux ne donne aucun sous-titre, une partie abîmée d'un fichier garde les sous-titres d'avant, et un fichier qui n'est pas un média est refusé ;
  • chaque requête va vers ce site, en GET ou HEAD sans corps.

Ce test utilise une courte phrase d'une seule personne, dans une seule langue. Il montre que les pièces fonctionnent ensemble ; ce n'est pas une mesure de la précision des sous-titres.

Les limites à connaître

  • La précision et les temps ne sont pas encore mesurés sur ce moteur, donc aucune page ne donne de chiffre. Dans l'article d'OpenAI, le taux d'erreur de Whisper variait d'une langue à l'autre, en suivant de près la quantité de parole d'entraînement de chaque langue, et il montait à mesure que le bruit de fond ajouté augmentait.
  • Pas de noms de personnes, pas de description des sons, pas de traduction. Les sous-titres sont les mots prononcés, dans la langue parlée.
  • Un long fichier prend du temps. Là où votre navigateur le permet, la page lit par tranches et n'a jamais tout le son du fichier en mémoire à la fois, mais chaque minute d'audio est du travail pour votre processeur. Le fichier le plus long traité jusqu'ici dure 12 minutes.
  • Certains fichiers sont lus en entier. Quand votre navigateur ne sait pas décoder le son par tranches, la page le décode d'un coup et s'arrête à 500 Mo ou à 1 heure.
  • Pas encore testé sur téléphone. Le modèle plus grand peut demander plus de mémoire qu'un téléphone n'en a de libre ; la page prévient quand le navigateur signale qu'il en manque.

Les composants open source et leurs licences figurent sur la page des crédits open source.

Essayez avec votre propre vidéo

Tout se passe dans votre navigateur. Votre fichier ne quitte jamais votre appareil.

Ouvrir le générateur de sous-titres