Comment ça marche
La transcription Whisper, dans votre navigateur
La page fait tourner un modèle ouvert de reconnaissance vocale, Whisper, dans l'onglet de votre navigateur : c'est votre appareil qui fait le travail, et votre fichier n'est jamais envoyé. Avec votre premier fichier, elle télécharge depuis ce site un moteur et le modèle, et votre navigateur garde le modèle pour les fichiers suivants quand il a de la place.
Trois étapes, toutes dans votre navigateur
1. Votre navigateur lit le fichier
Là où le fichier peut être lu par tranches, un worker de votre onglet prend la piste son 30 secondes à la fois ; sinon, la page décode le fichier entier d'un coup. Dans les deux cas, le son devient le mono à 16 kHz qu'attend le modèle.
2. Whisper la transcrit par fenêtres
Le moteur, whisper.cpp compilé en WebAssembly, transcrit environ trois minutes de son à la fois et remet à la page le texte de chaque fenêtre.
3. La page met le texte en forme
Les mots sont regroupés en paragraphes aux pauses, avec un horodatage pour chacun si vous le voulez, prêts à chercher, copier ou enregistrer en TXT.
Le modèle : Whisper, base ou small
Whisper est un modèle de reconnaissance vocale publié par OpenAI en 2022, avec son code et ses poids sous licence MIT. Il écoute le son par tranches de 30 secondes et écrit les mots, avec un repère de temps pour chaque segment. Ce site en propose deux tailles :
- Le petit modèle (par défaut) est Whisper base au format de quantification 5 bits de whisper.cpp (q5_1). C'est le téléchargement le plus léger.
- Le grand modèle est Whisper small au format 8 bits (q8_0) : un téléchargement plus lourd, qui demande plus de mémoire.
La quantification arrondit les poids du modèle à moins de bits, ce qui rend les fichiers plus petits. Nous ne publions pas encore la comparaison des deux tailles sur ce moteur, langue par langue : nous mesurons avant de décrire. Le menu des langues reprend celles que l'on peut indiquer à Whisper ; en détection automatique, le moteur choisit la langue dans la première fenêtre qui contient de la parole et la garde pour le reste du fichier.
Le moteur : whisper.cpp compilé en WebAssembly
Le modèle tourne dans whisper.cpp, une version open source de Whisper écrite en C/C++, que nous compilons en WebAssembly (un format de programme que tout navigateur actuel sait exécuter) avec une petite interface que nous avons écrite. Il existe trois versions, et la page les essaie dans cet ordre :
- WebGPU, si votre navigateur propose un adaptateur graphique doté des fonctions dont le moteur a besoin. Nous n'avons pas encore mesuré cette version sur une vraie carte graphique, nous n'affirmons donc rien à son sujet.
- WebAssembly sur plusieurs threads, un par cœur logique annoncé par votre navigateur. Les threads exigent un onglet isolé des autres origines, ce que fournissent les en-têtes du site.
- WebAssembly sur un seul thread, quand les threads ne sont pas disponibles ou que votre navigateur annonce un seul cœur logique. Le résultat est du même type.
Si une version ne démarre pas, ou si la version WebGPU échoue en cours de route, la page relance le moteur sur la version suivante et continue. La ligne au-dessus de la transcription indique la version qui a fait le travail.
Ce que la page télécharge, et quand
À l'ouverture, seuls la page et ses propres fichiers sont téléchargés. Le moteur, le lecteur multimédia, un modèle et le détecteur de voix arrivent de ce site quand vous ajoutez votre premier fichier. Une seule version du moteur est gardée : la version WebGPU prend la place d'une version pour le processeur quand elle démarre avec un périphérique GPU. Les tailles sont en Mo, où 1 Mo vaut 1 000 000 octets :
| Fichier | Taille | Quand |
|---|---|---|
| Moteur, version WebGPU | environ 3,4 Mo | Votre premier fichier, essayée d'abord quand votre navigateur propose un adaptateur WebGPU utilisable |
| Moteur, version pour le processeur : multithread ou monothread (l'une des deux) | environ 1,5 Mo | Votre premier fichier, sauf si la version WebGPU démarre avec un périphérique GPU ; et chaque fois que la version WebGPU échoue en cours de route |
| Petit modèle (Whisper base, format 5 bits), par défaut | 59,7 Mo en 3 parties | Votre premier fichier avec lui |
| Grand modèle (Whisper small, format 8 bits) | 264,5 Mo en 13 parties | Seulement si vous le choisissez |
| Détecteur de voix (Silero VAD) | 0,9 Mo | Votre premier fichier |
| Lecteur multimédia (Mediabunny), inclus dans les scripts de la page | environ 0,3 Mo | Votre premier fichier |
Les modèles arrivent en parties de 20 Mio au plus (un Mio vaut 1 048 576 octets, donc 20 Mio font environ 21 Mo), car l'hébergeur ne sert aucun fichier de plus de 25 Mio. Avant que le moteur n'utilise une partie, votre navigateur la compare à son empreinte SHA-256 : un téléchargement abîmé est refusé au lieu de produire une transcription fausse. Les parties vérifiées restent dans le Cache Storage de votre navigateur quand il a la place de les garder, donc votre fichier suivant, et votre prochaine visite, évitent le téléchargement.
Pourquoi votre enregistrement n'est jamais envoyé
Chaque étape a lieu dans votre onglet, le site n'a aucun point d'entrée capable de recevoir un fichier et la page ne peut se connecter qu'à ce site. La vérification que votre enregistrement n'est pas envoyé se trouve sur la page confidentialité et sécurité, avec les étapes pour observer vous-même les requêtes.
Comment un long fichier est lu et transcrit
Un enregistrement d'une heure pèse environ 115 Mo de son une fois décodé en mono à 16 kHz (3 600 secondes x 16 000 échantillons x 2 octets, ou le double sous forme des nombres 32 bits avec lesquels travaille le moteur). C'est pourquoi, là où le fichier peut être lu par tranches, la page ne décode pas le fichier entier d'un coup. Un second worker ouvre le fichier avec Mediabunny et lit sa piste son 30 secondes à la fois : Mediabunny décode le son compressé avec le décodeur de votre navigateur, et le son non compressé, comme dans un fichier WAV, lui-même. Il ne passe la tranche suivante que lorsque le moteur est prêt à la recevoir.
Les tranches sont assemblées en fenêtres d'environ trois minutes. Chaque fenêtre s'arrête au milieu de la demi-seconde la plus silencieuse des 15 secondes qui précèdent la marque des trois minutes, pour placer la coupe dans une pause plutôt qu'au milieu d'un mot, et les fenêtres se suivent sans trou ni chevauchement. Un petit détecteur de voix repère les passages parlés de chaque fenêtre : le modèle saute ainsi le silence au lieu d'y écrire des mots. Chaque fenêtre est transcrite avec les derniers mots qui la précèdent, 200 caractères au plus, comme contexte, afin de donner au modèle la phrase que la coupe a pu interrompre, et ses temps sont replacés sur l'horloge du fichier.
Dès qu'une fenêtre est terminée, ses paragraphes s'affichent : vous pouvez commencer à lire et à chercher pendant que la suite avance. Si le fichier ne peut pas être lu par tranches, parce que Mediabunny n'ouvre pas son conteneur ou que votre navigateur n'a pas de décodeur capable d'en lire le son par tranches, la page décode le fichier entier d'un coup avec le décodeur de votre navigateur, sans Mediabunny, et refuse alors un fichier de plus de 500 Mo ou de plus d'une heure.
Comment naissent les paragraphes et l'horodatage
Whisper renvoie des segments de texte avec un temps de début et un temps de fin, et un temps pour chaque mot. La page les réunit en paragraphes : un nouveau commence à une pause de 2 secondes ou plus, mesurée avec les temps des mots de part et d'autre, et un paragraphe qui dépasse environ 600 caractères s'arrête à la fin de phrase suivante. Il n'y a pas d'étiquettes de locuteur : un saut de paragraphe signale une pause ou un long passage parlé, jamais un changement de voix.
L'horodatage d'un paragraphe est le temps de début de son premier mot, écrit [hh:mm:ss] et arrondi à la seconde inférieure. Il est approximatif : utile pour retrouver un passage de l'enregistrement, pas pour des sous-titres. Copier le texte et Télécharger le TXT écrivent les mêmes paragraphes, séparés par une ligne vide, avec l'horodatage s'il est affiché.
Pourquoi la durée varie
C'est votre appareil qui fait le travail, avec la version que la page a pu démarrer : le même fichier ne prend pas le même temps sur un portable récent et sur un ancien, et le modèle comme la longueur de l'enregistrement comptent aussi. C'est pourquoi la page ne promet aucune vitesse. Dès que le moteur signale sa première progression, la page mesure combien de secondes de travail demande chaque seconde de son sur votre appareil, lisse ce rythme d'une fenêtre à l'autre pour qu'un moment lent ne le fausse pas, et affiche le temps restant.
Ce dont votre appareil a besoin
- Un navigateur récent avec WebAssembly. Chrome, Edge, Firefox et Safari l'ont ; notre test automatique tourne dans Chromium.
- De la mémoire libre : le moteur garde le modèle en mémoire pendant qu'il tourne, et le grand modèle en demande davantage. Nous ne donnons aucun chiffre tant que nous ne l'avons pas mesuré.
- Une connexion à chaque visite : la page en a besoin pour s'ouvrir, et votre premier fichier télécharge aussi le moteur et le modèle. Il n'y a pas de mode hors ligne. Quand votre navigateur a de la place, il garde le modèle, et les fichiers et les visites suivants sautent ce téléchargement.
Les composants open source du moteur, les modèles et le lecteur multimédia figurent avec leurs licences sur la page des crédits.
Questions sur le moteur
Est-ce le même Whisper que celui publié par OpenAI ?
C'est le même modèle : OpenAI a publié le code et les poids de Whisper sous licence MIT. Cette page utilise ces poids au format de fichier du projet open source whisper.cpp, quantifiés (stockés avec moins de bits par poids) pour alléger le téléchargement. Le moteur est whisper.cpp compilé en WebAssembly, pas le code Python d'OpenAI, et aucune requête ne part vers OpenAI.
Utilise-t-il ma carte graphique ?
Il essaie. Si votre navigateur propose WebGPU avec les fonctions dont le moteur a besoin, la page télécharge et lance d'abord la version WebGPU. Si cette version n'enregistre aucun périphérique GPU, ne démarre pas ou échoue en cours de route, la page télécharge une version pour le processeur et continue avec elle. Nos machines de test n'ont pas de GPU utilisable, donc la vraie version WebGPU n'a jamais tourné sur un GPU dans nos tests : le passage à une version pour le processeur est testé avec des échecs WebGPU simulés, et sur ces machines la page passe directement à une version pour le processeur. La ligne au-dessus de la transcription indique la version qui a travaillé.
Pourquoi le modèle a-t-il été retéléchargé ?
Votre navigateur garde le modèle dans son Cache Storage pour ce site jusqu'à ce que vous effaciez les données du site, ou que le navigateur le supprime pour libérer de la place. Le fichier suivant le télécharge alors de nouveau. Ce que votre navigateur conserve et comment l'effacer donne le détail.
Que se passe-t-il quand j'appuie sur Annuler ?
La page arrête le moteur aussitôt en fermant le worker où il tourne, et abandonne les paragraphes déjà produits. Votre fichier suivant démarre un nouveau moteur et reprend le modèle dans le stockage du navigateur, où celui-ci l'a gardé s'il avait de la place : le modèle n'est pas retéléchargé.
Sources
- OpenAI, dépôt de Whisper : Le code du modèle, sa licence MIT et le tableau des tailles (base et small).
- Radford et al., Robust Speech Recognition via Large-Scale Weak Supervision (2022) : L'article qui présente Whisper.
- whisper.cpp : La version C/C++ de Whisper que le moteur compile en WebAssembly (version 1.9.4, avec une ligne ajoutée dans la version multithread, indiquée sur la page des crédits), et ses fichiers de modèle quantifiés.
- Silero VAD : Le détecteur d'activité vocale qui repère les passages parlés.
- Mediabunny : La bibliothèque multimédia qui lit votre fichier par tranches quand elle le peut, en décodant le son compressé avec le décodeur du navigateur et le son non compressé elle-même.
- MDN, AudioDecoder (WebCodecs) : Le décodeur du navigateur lui-même, qui transforme le son compressé en échantillons.
- MDN, CacheStorage : Là où les parties vérifiées du modèle sont gardées d'une visite à l'autre.
- web.dev, Making your website cross-origin isolated using COOP and COEP : Pourquoi le site envoie ces en-têtes : les threads WebAssembly ont besoin de SharedArrayBuffer.
- Cloudflare Workers, Limits : La limite de 25 Mio par fichier statique, raison pour laquelle les modèles arrivent en parties.
Essayez avec un enregistrement
La transcription se fait dans votre navigateur. Votre fichier ne quitte jamais votre appareil.