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 dans les silences

Le son est regroupé en fenêtres d'environ 3 minutes. Chaque coupure tombe sur la demi-seconde la plus calme près des 3 minutes, et coupe donc rarement 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 un début et une fin pour chaque mot.

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, un lecteur multimédia dans un Web Worker lit son son 30 secondes à la fois, 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. Le fichier n'est jamais envoyé. Le seul trafic est la page, le moteur, le modèle (environ 60 ou 264 Mo) et un petit détecteur de voix, qui viennent du serveur du site au premier passage puis sont conservés.
Votre fichier reste dans l'onglet du navigateur : la page, son moteur et le modèle arrivent, rien 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 petit modèle (par défaut) est Whisper base, avec des poids arrondis à 5 bits : un téléchargement de 59,7 Mo.
  • Le grand modèle 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 moins d'erreurs en moyenne, mais nous n'avons pas encore mesuré la différence entre ces deux-là sur ce moteur : la page les appelle donc « petit » et « 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 de la précédente comme contexte (environ 200 caractères) : une phrase à cheval sur une coupure garde ses mots et sa ponctuation. 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 avec un début et une fin pour chaque mot. 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 pas donné, 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 à la demi-seconde la plus calme ; un détecteur de voix repère la parole et le modèle l'écrit avec un temps pour chaque mot ; les derniers mots de chaque fenêtre 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.
Comment la page transforme le son de votre fichier en sous-titres. Les limites sont celles du code des sous-titres.

Les temps sont l'estimation du modèle lui-même du début et de la fin de chaque mot : 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 deux processeurs logiques ou moins.

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 plus de deux processeurs logiques)1,6 MoLe cache habituel du navigateur
Le moteur, version monothread (sans threads disponibles, ou si votre navigateur annonce deux processeurs logiques ou moins)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 petit modèle, Whisper base (par défaut)59,7 Mo, en 3 partiesCache Storage, après vérification SHA-256 de chaque partie
Le grand modèle, Whisper small (seulement si vous le choisissez)264,5 Mo, en 13 partiesCache Storage, après vérification SHA-256 de chaque partie
Le détecteur de voix, Silero VAD0,9 Mo, en 1 partieCache Storage, après vérification SHA-256
Le lecteur multimédia (inclus dans les scripts de la page)0,3 MoLe cache habituel du navigateur

Le moteur, le modèle et le détecteur ne se téléchargent qu'une fois un fichier ajouté, pas à l'ouverture de la page. Votre fichier, son son et vos sous-titres ne sont jamais enregistrés : 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 petit modèle, 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 de la parole toutes les 10 secondes, les sous-titres arrivent fenêtre par fenêtre et chaque phrase commence à son repère ;
  • 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. La musique, le bruit et les personnes qui parlent en même temps causent plus d'erreurs.
  • 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 ne garde jamais tout le son du fichier à 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 grand modèle 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