Torna al blog

Allucinazioni di Whisper: perché ripete le righe e inventa testo

Allucinazioni di Whisper spiegate: perché scrive «Thank you for watching» nei silenzi o ripete una riga, quanto costa ogni rimedio e come trovarle in un SRT.

3 ottobre 2026
Sablate Team

Le allucinazioni di Whisper (in inglese hallucinations) sono testo che il modello scrive anche se nessuno l'ha detto: «Thank you for watching» nei momenti di silenzio, un credito dei sottotitoli, o una riga ripetuta per un minuto. Due impostazioni ne evitano la maggior parte — filtrare l'audio senza parlato e impedire al modello di usare il proprio output precedente come contesto — e gli strumenti Whisper standard non ne applicano nessuna di serie.

Qui sotto trovi i due tipi a confronto, perché si verifica ciascuno, cosa abbiamo misurato quando uno dei due ha colpito la nostra app, quanto costa ogni rimedio, le impostazioni per openai-whisper, faster-whisper e whisper.cpp, e come scovare le allucinazioni sopravvissute in un file di sottotitoli finito.

Le allucinazioni di Whisper a confronto

Frase fantasmaLoop di ripetizioneParlato omesso
Cosa vedi«Thank you for watching», «Thanks for watching», un credito dei sottotitoliUna riga scritta ancora e ancora, spesso senza punteggiaturaUna frase che manca dalla trascrizione
Dove compareSilenzio, musica, applausi, rumore d'ambienteOvunque; una volta partito, continuaInizi a bassa voce, brevi interiezioni
CausaL'audio senza parlato arriva al decoderOgni finestra viene decodificata con l'output precedente come promptCome un particolare modello gestisce quell'audio
Primo rimedioUn filtro di rilevamento dell'attività vocale (VAD)Disattivare l'uso del testo precedente come contestoProvare un secondo modello sulla stessa clip
Come appare nei sottotitoliUna battuta in più su una pausaUna battuta bloccata su una sola riga, oppure battute senza interruzioni di fraseUn vuoto dove dovrebbe esserci una riga

La terza colonna è il difetto opposto: parlato che è stato saltato, non testo che è stato inventato. Ha cause e rimedi diversi, trattati nel confronto tra i modelli Whisper. Tutto quello che segue riguarda i primi due.

Perché Whisper scrive testo che nessuno ha detto?

Whisper elabora l'audio in finestre di 30 secondi, e il suo decoder scrive del testo per ciascuna. C'è un controllo no-speech, ma è una soglia su una probabilità, e le finestre di musica, applausi o fruscio d'ambiente la superano con regolarità e finiscono per diventare parole. Le parole che sceglie tradiscono la causa. Whisper è stato addestrato su 680.000 ore di audio dal web abbinato a trascrizioni, e i saluti finali e i crediti dei sottotitoli, frequenti in quei testi, sono la spiegazione abituale di ciò che scrive quando non c'è niente da trascrivere.

I numeri non sono piccoli. In uno studio del 2025, i ricercatori dell'AGH University of Kraków hanno eseguito large-v3 su audio senza parlato — rumore, musica, suoni ambientali — 301.317 volte. Ha prodotto testo nel 40,3% dei casi, e il 9,1% di quelle allucinazioni erano loop. Gli output più frequenti sono stati «thank you», con il 24,76% delle allucinazioni, e «thanks for watching», con il 10,32%.

Sul parlato reale la frequenza è molto più bassa e il danno è peggiore. Lo studio del 2024 Careless Whisper ha rilevato che circa l'1% delle trascrizioni conteneva espressioni o frasi intere che non esistevano nell'audio, che il 38% di queste includeva danni espliciti come perpetuare la violenza, inventare associazioni o suggerire una falsa autorità, e che capitavano in modo sproporzionato ai parlanti con pause lunghe.

Per i sottotitoli il costo è molto concreto. Una frase allucinata arriva come una battuta formattata alla perfezione sopra una pausa, e lo spettatore la legge come un dialogo.

Perché una riga sbagliata diventa quaranta

Il loop ha una causa diversa. Per impostazione predefinita, Whisper decodifica ogni finestra usando il proprio output precedente come prompt, così il contesto passa da una finestra all'altra: i nomi restano scritti allo stesso modo e le frasi proseguono. La stessa funzione permette a una finestra sbagliata di avvelenare la successiva. Quando il decoder scrive una riga due volte, la finestra seguente parte con quella riga come prompt e la scrive di nuovo. La documentazione di faster-whisper per condition_on_previous_text lo dice chiaramente: con l'opzione disattivata, il modello «diventa meno incline a restare bloccato in un loop di errore, come la ripetizione in loop o i timestamp che vanno fuori sincrono».

Ci siamo imbattuti in questo problema nella nostra app prima del rilascio, quindi l'abbiamo misurato: la stessa clip turca di 101 secondi usata nel nostro confronto tra i modelli, su una RTX 3060 Ti con float16, cambiando solo quell'unica opzione.

large-v3, con contestolarge-v3, senza contestomedium, con contestomedium, senza contesto
Segni di fine frase nella trascrizione0304730
Frasi ripetute (6-grammi)9000

L'impostazione predefinita ha rovinato large-v3 e non ha fatto nulla a medium. Con il contesto attivo, il modello più grande non ha scritto alcuna punteggiatura di fine frase e ha prodotto nove frasi ripetute; quello più piccolo, sullo stesso audio e con le stesse impostazioni, andava bene. In una prova, una singola battuta conteneva questo, su 0,12 secondi di 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 punteggiatura mancante conta quanto le ripetizioni. Gli strumenti per sottotitoli dividono una trascrizione in battute ai confini di frase, e una trascrizione senza punti fermi non offre nulla su cui tagliare: si ottengono battute enormi o, con un divisore di righe approssimativo, battute di una sola parola. Disattivare il contesto ha ripristinato la punteggiatura senza cambiare il modello.

Una sola clip non è un benchmark. Mostra però due cose: le dimensioni del modello non proteggono, e il rimedio più economico è un'impostazione.

Disattivare il contesto del testo precedente ha un costo?

Sì. Ogni rimedio contro le allucinazioni ha un costo, ed è bene conoscerli prima di applicarli:

  1. Coerenza tra le finestre. Senza il testo precedente come contesto, ortografia e stile di punteggiatura possono variare; la documentazione avverte che disattivarlo «può rendere il testo incoerente tra una finestra e l'altra». In pratica: un nome scritto in due modi in un file lungo.
  2. Il tuo initial prompt si ferma alla prima finestra. Gli strumenti passano a Whisper un elenco di vocaboli — nomi, marchi, gergo — come initial prompt, cioè il testo iniziale che guida la trascrizione, e con il contesto disattivato influenza solo la prima finestra. --carry_initial_prompt True di openai-whisper e --carry-initial-prompt di whisper.cpp lo reinviano a ogni finestra; in faster-whisper è l'opzione hotwords a fare questo lavoro.
  3. Le penalità di ripetizione cancellano le ripetizioni vere. repetition_penalty e no_repeat_ngram_size sopprimerebbero un loop, ma non sanno distinguere un loop da un parlante che si ripete. La nostra clip di prova contiene proprio questo: una frase detta due volte di seguito, di proposito. Una penalità che la elimina sta cancellando dialogo.
  4. Un filtro di rilevamento dell'attività vocale può tagliare il parlato a bassa voce. Il VAD decide cosa conta come parlato prima che Whisper lo senta, e gli inizi sommessi e l'audio a banda limitata, come le telefonate, sono i punti in cui perde delle parole. A settembre 2026 AutoSubs ha aggiunto un interruttore per disattivare il salto dei silenzi proprio per questo caso.
  5. hallucination_silence_threshold richiede i timestamp delle parole, e non è una cura. Salta i silenzi lunghi attorno a una sospetta allucinazione. Sulla nostra clip non ha fatto alcuna differenza misurabile: la riga che sospettavamo inventata si è rivelata parlato reale.

Nessuno di questi costi si avvicina a quello di un loop. Un nome scritto male è un solo trova e sostituisci; un loop di ripetizione è un passaggio da trascrivere di nuovo.

Come evitare le allucinazioni di Whisper, strumento per strumento

openai-whisperfaster-whisperwhisper.cppSablate
Filtro di rilevamento dell'attività vocaleNon integratovad_filter=True, attivo di default solo nella pipeline batch--vad con un modello SileroSempre attivo
Non usare più il testo precedente come contesto--condition_on_previous_text Falsecondition_on_previous_text=False-mc 0Sempre disattivato
Saltare il silenzio dopo una sospetta allucinazione--hallucination_silence_thresholdhallucination_silence_thresholdNessun equivalenteNo
Reinviare il prompt a ogni finestra--carry_initial_prompt Truehotwords--carry-initial-promptNo
Puoi modificare queste impostazioniSìSìSìNo

Le ultime tre righe sono il punto debole di Sablate, detto con franchezza: entrambi i rimedi sono sempre attivi e nessuna di queste impostazioni è accessibile. Se vuoi regolare il filtro o portare un prompt da una finestra all'altra, gli strumenti open source te lo permettono.

Per openai-whisper su un file di intervista:

whisper talk.mp4 --model turbo --output_format srt --condition_on_previous_text False

openai-whisper non ha un proprio filtro di rilevamento dell'attività vocale, quindi questo comando risolve il loop ma non le frasi fantasma; --hallucination_silence_threshold con --word_timestamps True è la sua risposta parziale a queste ultime. whisper.cpp ha entrambi i rimedi, e il suo strumento a riga di comando si aspetta un WAV a 16 bit:

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 non conserva alcun contesto di testo tra una finestra e l'altra, e il modello Silero si scarica con lo script download-vad-model.sh del repository. In Python, faster-whisper accetta entrambi come argomenti:

from faster_whisper import WhisperModel

model = WhisperModel("large-v3-turbo")
segments, info = model.transcribe("talk.mp4", vad_filter=True, condition_on_previous_text=False)

Come si trovano le allucinazioni in un SRT finito?

Nessuna impostazione elimina tutte le allucinazioni, quindi controlla il file. Tre comandi individuano la maggior parte di quelle rimaste, su macOS e Linux oppure in Git Bash e WSL su 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

Il primo trova le formule di chiusura più comuni e i crediti dei sottotitoli. Il secondo stampa ogni riga di sottotitolo identica a quella che la precede, che è l'aspetto che di solito ha un loop una volta tagliato in battute. Il terzo individua una sequenza da due a cinque parole ripetuta tre volte all'interno di una stessa riga.

Considera ogni risultato una domanda, non un verdetto. Le persone dicono davvero «thank you», e si ripetono davvero. Riproduci la battuta insieme all'audio, poi tienila o eliminala. Le frasi fantasma sopra pause lunghe e musica non corrispondono a nessun pattern; l'unico controllo per queste è leggere le battute che stanno sopra le sezioni senza parlato.

Quale rimedio usare, e quando

«Sottotitolo conferenze, interviste o lezioni.» Attiva il filtro di rilevamento dell'attività vocale e disattiva il contesto del testo precedente. Questa coppia è l'impostazione predefinita sensata per qualsiasi parlato che intendi sottotitolare.

«La registrazione ha lunghi silenzi o un tappeto musicale.» Qui il filtro conta più che altrove. Rileggi comunque le battute che stanno sopra la musica.

«È una telefonata o una registrazione sommessa, a banda limitata.» Eseguila una volta con il filtro e una senza, e confronta cosa manca. Un filtro che scarta le parole a bassa voce è peggio di un «thank you» di troppo.

«Mi affido a un initial prompt per i nomi.» Disattiva il contesto del testo precedente e reinvia il prompt a ogni finestra con le opzioni indicate sopra, oppure correggi i nomi dopo con trova e sostituisci.

«Le righe si ripetono ancora dopo entrambi i rimedi.» Prova un altro modello sullo stesso file prima di ricorrere a una penalità di ripetizione; la nostra clip andava in loop con large-v3 e non con medium. Se ti serve ancora no_repeat_ngram_size, riascolta il file per cercare le righe che potrebbe aver eliminato.

Come lo gestisce Sablate

In Sablate entrambi i rimedi sono sempre attivi: un filtro di rilevamento dell'attività vocale davanti al modello, e nessun uso del testo precedente come contesto. Sablate esegue Whisper sul tuo computer, e abbiamo disattivato il contesto dopo la misurazione qui sopra. Abbiamo anche corretto il divisore di righe che trasformava una trascrizione senza punteggiatura in battute di una sola parola.

Due conseguenze da conoscere. Il vocabolario personalizzato in Defaults → Custom vocabulary arriva a Whisper come initial prompt, quindi con il contesto disattivato influenza solo la prima finestra, cioè più o meno i primi 30 secondi di parlato; i nomi che compaiono più avanti in una registrazione lunga sono un lavoro per Find & replace nell'editor, che opera su una lingua alla volta. E poiché le impostazioni sono fisse, non c'è nulla da regolare. Se una registrazione richiede il filtro disattivato, usa uno degli strumenti open source qui sopra.

Nell'editor puoi scorrere le battute con il video in riproduzione, che è il modo più rapido per giudicare i risultati dei comandi qui sopra, e l'esportazione scrive i sottotitoli corretti come .srt, .vtt o come video con sottotitoli impressi. Fast e Balanced girano sul piano gratuito; Accurate e Best fanno parte di Pro. Scarica Sablate per Windows o Mac e provalo sul tuo girato.

In breve

Whisper allucina in due modi: scrive frasi fatte quando l'audio non contiene parlato, ed entra in loop quando una finestra sbagliata alimenta la successiva. Un filtro di rilevamento dell'attività vocale risolve la prima, disattivare condition_on_previous_text risolve la seconda, e gli strumenti standard non attivano nessuno dei due di serie. Entrambi i rimedi costano poco rispetto a un loop. Un modello più grande non è un modello più sicuro. E qualunque cosa tu cambi, leggi il file di sottotitoli finito prima di chiunque altro — la guida per creare file SRT contiene i controlli sul formato in sé.