Hallucinations de Whisper : pourquoi il répète des lignes et invente du texte
Hallucinations de Whisper : pourquoi il écrit « Thank you for watching » sur un silence ou tourne en boucle, le coût de chaque correctif et comment les repérer.
Les hallucinations de Whisper sont du texte que le modèle écrit alors que personne ne l’a dit : « Thank you for watching » sur un silence, un crédit de sous-titres, ou une même ligne répétée pendant une minute. Deux réglages en préviennent la plupart — filtrer l’audio sans parole, et empêcher le modèle de réutiliser sa propre sortie comme contexte — et les outils Whisper standard n’activent ni l’un ni l’autre par défaut.
La suite présente les deux types côte à côte, pourquoi chacun se produit, ce que nous avons mesuré quand l’un d’eux a touché notre propre application, ce que coûte chaque correctif, les réglages pour openai-whisper, faster-whisper et whisper.cpp, et comment retrouver, dans un fichier de sous-titres terminé, les hallucinations qui ont survécu.
Les hallucinations de Whisper, côte à côte
| Phrase fantôme | Boucle de répétition | Parole omise | |
|---|---|---|---|
| Ce que vous voyez | « Thank you for watching », « Thanks for watching », un crédit de sous-titres | Une même ligne écrite encore et encore, souvent sans ponctuation | Une phrase absente de la transcription |
| Où cela apparaît | Silence, musique, applaudissements, bruit ambiant | N’importe où ; une fois lancée, elle continue | Débuts à voix basse, courtes interjections |
| Ce qui la cause | L’audio sans parole atteint le décodeur | Chaque fenêtre est décodée avec la sortie précédente comme prompt | La façon dont un modèle particulier traite cet audio |
| Premier correctif | Un filtre de détection d’activité vocale (VAD) | Désactiver le contexte précédent | Essayer un second modèle sur le même extrait |
| Aspect dans les sous-titres | Une réplique en trop sur une pause | Une réplique bloquée sur une ligne, ou des répliques sans fin de phrase | Un trou là où une ligne devrait se trouver |
La troisième colonne est l’échec inverse : de la parole sautée plutôt que du texte inventé. Elle a d’autres causes et d’autres correctifs, traités dans le comparatif des modèles Whisper. Tout ce qui suit concerne les deux premières colonnes.
Pourquoi Whisper écrit-il un texte que personne n’a dit ?
Whisper traite l’audio par fenêtres de 30 secondes, et son décodeur écrit du texte pour chacune. Il existe un contrôle d’absence de parole, mais c’est un seuil appliqué à une probabilité, et les fenêtres de musique, d’applaudissements ou d’ambiance sonore le franchissent régulièrement et ressortent sous forme de mots. Les mots qu’il choisit trahissent la cause. Whisper a été entraîné sur 680 000 heures d’audio du web associées à des transcriptions, et les formules de clôture et les crédits de sous-titres fréquents dans ces textes sont l’explication habituelle de ce qu’il écrit quand il n’y a rien à transcrire.
Les chiffres ne sont pas négligeables. Dans une étude de 2025, des chercheurs de l’AGH University of Kraków ont fait tourner large-v3 sur de l’audio sans parole — bruit, musique, sons environnementaux — à 301 317 reprises. Il a produit du texte dans 40,3 % des cas, et 9,1 % de ces hallucinations étaient des boucles. Les sorties les plus fréquentes étaient « thank you », avec 24,76 % des hallucinations, et « thanks for watching », avec 10,32 %.
Sur de la vraie parole, le taux est bien plus bas et les dégâts sont pires. L’étude Careless Whisper de 2024 a constaté qu’environ 1 % des transcriptions contenaient des expressions ou des phrases entières absentes de l’audio, que 38 % de ces passages comportaient des préjudices explicites, comme perpétuer la violence, inventer des associations ou suggérer une fausse autorité, et qu’ils survenaient de façon disproportionnée chez les locuteurs qui font de longues pauses.
Pour les sous-titres, le coût est précis. Une phrase hallucinée arrive sous la forme d’une réplique parfaitement formatée sur une pause, et le spectateur la lit comme du dialogue.
Pourquoi une mauvaise ligne en devient quarante
La boucle a une autre cause. Par défaut, Whisper décode chaque fenêtre en prenant sa propre sortie précédente comme prompt : le contexte passe d’une fenêtre à l’autre, les noms gardent la même orthographe et les phrases se poursuivent. Cette même fonction permet à une mauvaise fenêtre d’empoisonner la suivante. Dès que le décodeur écrit une ligne deux fois, la fenêtre suivante est amorcée avec cette ligne et l’écrit à nouveau. La documentation de faster-whisper sur condition_on_previous_text le dit sans détour : une fois l’option désactivée, le modèle « devient moins enclin à rester coincé dans une boucle d’échec, comme une boucle de répétition ou des horodatages qui se désynchronisent ».
Nous y avons été confrontés dans notre propre application avant sa sortie, alors nous l’avons mesuré : le même extrait turc de 101 secondes que dans notre comparatif de modèles, sur une RTX 3060 Ti en float16, en ne changeant rien d’autre que cette option.
large-v3, contexte précédent activé | large-v3, contexte précédent désactivé | medium, contexte précédent activé | medium, contexte précédent désactivé | |
|---|---|---|---|---|
| Signes de fin de phrase dans la transcription | 0 | 30 | 47 | 30 |
| Phrases répétées (6-grammes) | 9 | 0 | 0 | 0 |
Le réglage par défaut a saccagé large-v3 et n’a eu aucun effet sur medium. Avec le contexte précédent activé, le plus gros modèle n’a écrit aucune ponctuation de fin de phrase et a produit neuf phrases répétées ; le plus petit, sur le même audio avec les mêmes réglages, s’en sortait très bien. Lors d’une exécution, une seule réplique contenait ceci, sur 0,12 seconde d’audio :
[58.26 -> 58.38] bir level oldu bir level oldu bir level oldu bir level oldu
bir level oldu bir level oldu bir level oldu bir level oldu
La ponctuation manquante compte autant que les répétitions. Les outils de sous-titrage découpent une transcription en répliques aux frontières des phrases, et une transcription sans points ne leur offre aucun repère pour couper : vous obtenez des répliques géantes ou, avec une logique de découpage négligente, des répliques d’un seul mot. Désactiver le contexte précédent a rétabli la ponctuation sans changer de modèle.
Un seul extrait n’est pas un banc d’essai. Il montre pourtant deux choses : la taille du modèle ne protège de rien, et le correctif le moins cher est un réglage.
Désactiver le contexte précédent a-t-il un coût ?
Oui. Chaque correctif contre les hallucinations a un coût, et mieux vaut le connaître avant de l’appliquer :
- La cohérence d’une fenêtre à l’autre. Sans le texte précédent comme contexte, l’orthographe et le style de ponctuation peuvent varier ; la documentation prévient que le désactiver « peut rendre le texte incohérent d’une fenêtre à l’autre ». En pratique : un nom écrit de deux façons dans un long fichier.
- Votre initial prompt (invite initiale) s’arrête à la première fenêtre. Les outils transmettent à Whisper une liste de vocabulaire — noms, marques, jargon — comme initial prompt, et sans le contexte précédent il n’influence que la première fenêtre.
--carry_initial_prompt Trued’openai-whisper et--carry-initial-promptde whisper.cpp le renvoient à chaque fenêtre ; dans faster-whisper, c’est l’optionhotwordsqui remplit ce rôle. - Les pénalités de répétition suppriment aussi les vraies répétitions.
repetition_penaltyetno_repeat_ngram_sizeempêcheraient une boucle, mais elles ne savent pas distinguer une boucle d’un locuteur qui se répète. Notre extrait de test en contient justement un cas : une phrase dite deux fois de suite, exprès. Une pénalité qui l’enlève supprime du dialogue. - Un filtre de détection d’activité vocale peut couper la parole à faible volume. Le VAD décide de ce qui compte comme parole avant que Whisper ne l’entende, et c’est avec les débuts de phrase à voix basse et l’audio à bande limitée, comme les appels téléphoniques, qu’il laisse échapper des mots. AutoSubs a ajouté en septembre 2026 un interrupteur pour désactiver l’option qui ignore les silences, précisément pour ce cas.
hallucination_silence_thresholddemande des horodatages par mot, et ce n’est pas un remède. Il ignore les longs silences autour d’une hallucination suspectée. Sur notre extrait, il n’a rien changé de mesurable : la ligne que nous soupçonnions d’être inventée s’est révélée être de la vraie parole.
Aucun de ces coûts n’approche celui d’une boucle. Un nom mal orthographié se règle d’un seul « rechercher et remplacer » ; une boucle de répétition, c’est un passage à transcrire de nouveau.
Comment empêcher Whisper d’halluciner, outil par outil
| openai-whisper | faster-whisper | whisper.cpp | Sablate | |
|---|---|---|---|---|
| Filtre de détection d’activité vocale | Aucun filtre intégré | vad_filter=True, activé par défaut seulement dans le pipeline par lots | --vad avec un modèle Silero | Toujours activé |
| Ne plus réutiliser le texte précédent comme contexte | --condition_on_previous_text False | condition_on_previous_text=False | -mc 0 | Toujours désactivé |
| Ignorer le silence après une hallucination suspectée | --hallucination_silence_threshold | hallucination_silence_threshold | Pas d’équivalent | Non |
| Renvoyer le prompt à chaque fenêtre | --carry_initial_prompt True | hotwords | --carry-initial-prompt | Non |
| Vous pouvez modifier ces réglages | Oui | Oui | Oui | Non |
Les trois dernières lignes sont le point faible assumé de Sablate : les deux correctifs sont toujours actifs, et aucun de ces réglages n’est exposé. Si vous voulez ajuster le filtre ou reporter un prompt d’une fenêtre à l’autre, les outils ouverts vous le permettent.
Pour openai-whisper sur un fichier d’interview :
whisper talk.mp4 --model turbo --output_format srt --condition_on_previous_text False
openai-whisper n’a pas de filtre de détection d’activité vocale propre : cette commande corrige donc la boucle, pas les phrases fantômes ; --hallucination_silence_threshold avec --word_timestamps True est sa réponse partielle à celles-ci. whisper.cpp propose les deux correctifs, et son outil en ligne de commande attend du WAV 16 bits :
ffmpeg -i talk.mp4 -ar 16000 -ac 1 -c:a pcm_s16le talk.wav
./build/bin/whisper-cli -m models/ggml-large-v3-turbo.bin -f talk.wav -osrt -mc 0 --vad -vm models/ggml-silero-v6.2.0.bin
-mc 0 ne conserve aucun contexte de texte entre les fenêtres, et le modèle Silero vient du script download-vad-model.sh du dépôt. En Python, faster-whisper prend les deux en arguments :
from faster_whisper import WhisperModel
model = WhisperModel("large-v3-turbo")
segments, info = model.transcribe("talk.mp4", vad_filter=True, condition_on_previous_text=False)
Comment repérer les hallucinations dans un SRT terminé ?
Aucun réglage ne supprime toutes les hallucinations : il faut donc vérifier le fichier. Trois commandes repèrent la plupart de celles qui subsistent, sous macOS et Linux, ou dans Git Bash et WSL sous Windows :
grep -n -i -E "thank(s| you) for watching|amara\.org|subtitles by" talk.srt
awk '{ sub(/\r$/, "") } NF && !/-->/ && !/^[0-9]+$/ { if ($0 == prev) print NR": "$0; prev = $0 }' talk.srt
perl -ne 'print "$.: $_" if /(\S+(?: \S+){1,4}) \1 \1/' talk.srt
La première trouve les formules de clôture et les crédits de sous-titres. La deuxième affiche toute ligne de sous-titre identique à la précédente, ce qui est l’aspect habituel d’une boucle une fois découpée en répliques. La troisième repère un groupe de deux à cinq mots répété trois fois dans une même ligne.
Considérez chaque résultat comme une question, pas comme un verdict. Les gens disent bel et bien « thank you », et il leur arrive de se répéter. Écoutez l’audio qui correspond à la réplique, puis gardez-la ou supprimez-la. Les lignes fantômes sur de longues pauses et sur de la musique ne correspondent à aucun motif ; le seul contrôle possible consiste à lire les répliques qui tombent sur des passages sans parole.
Quel correctif utiliser, et quand
« Je sous-titre des conférences, des interviews ou des cours. » Activez le filtre de détection d’activité vocale et désactivez le contexte précédent. Ce duo est le bon réglage par défaut pour toute parole que vous comptez sous-titrer.
« L’enregistrement contient de longs silences ou un fond musical. » Le filtre compte le plus ici. Lisez quand même les répliques situées sur la musique.
« C’est un appel téléphonique ou un enregistrement faible, à bande limitée. » Lancez-le une fois avec le filtre et une fois sans, et comparez ce qui manque. Un filtre qui laisse tomber les mots faibles est pire qu’un « thank you » parasite.
« Je m’appuie sur un initial prompt pour les noms. » Désactivez le contexte précédent et renvoyez le prompt à chaque fenêtre avec les options ci-dessus, ou corrigez les noms après coup avec la recherche et le remplacement.
« Des lignes se répètent encore après les deux correctifs. » Essayez un autre modèle sur le même fichier avant de recourir à une pénalité de répétition ; notre extrait bouclait sur large-v3 et pas sur medium. Si vous avez malgré tout besoin de no_repeat_ngram_size, écoutez l’ensemble pour repérer les lignes qu’il a pu supprimer.
Comment Sablate s’en charge
Les deux correctifs sont toujours actifs dans Sablate : un filtre de détection d’activité vocale devant le modèle, et aucune réutilisation du texte précédent comme contexte. Sablate fait tourner Whisper sur votre propre machine, et nous avons désactivé le contexte précédent après la mesure ci-dessus. Nous avons aussi corrigé le découpage qui transformait une transcription sans ponctuation en répliques d’un seul mot.
Deux conséquences méritent d’être connues. Le vocabulaire personnalisé, sous Defaults → Custom vocabulary, parvient à Whisper comme initial prompt ; avec le contexte précédent désactivé, il n’influence donc que la première fenêtre, soit environ les 30 premières secondes de parole. Les noms qui apparaissent plus loin dans un long enregistrement relèvent de Find & replace dans l’éditeur, qui travaille sur une seule langue à la fois. Et comme les réglages sont figés, il n’y a rien à ajuster. Si un enregistrement exige de désactiver le filtre, utilisez l’un des outils ouverts ci-dessus.
Dans l’éditeur, vous pouvez parcourir les répliques pendant que la vidéo tourne, ce qui est le moyen le plus rapide de juger les résultats des commandes ci-dessus, et l’export écrit les sous-titres corrigés en .srt, en .vtt ou dans une vidéo incrustée. Fast et Balanced fonctionnent avec la formule gratuite ; Accurate et Best font partie de Pro. Téléchargez Sablate pour Windows ou Mac et essayez-le sur vos propres images.
La version courte
Whisper hallucine de deux façons : il écrit des phrases toutes faites sur de l’audio sans parole, et il boucle quand une mauvaise fenêtre alimente la suivante. Un filtre de détection d’activité vocale règle la première, désactiver condition_on_previous_text règle la seconde, et les outils standard n’activent ni l’un ni l’autre par défaut. Les deux correctifs coûtent peu à côté d’une boucle. Un modèle plus gros n’est pas un modèle plus sûr. Et quoi que vous changiez, relisez le fichier de sous-titres terminé avant que quelqu’un d’autre ne le fasse — le guide de création des fichiers SRT contient les vérifications du format lui-même.