Voltar ao blog

Alucinações do Whisper: Porque Repete Linhas e Inventa Texto

Alucinações do Whisper explicadas: porque escreve «Thank you for watching» no silêncio ou repete linhas, o que custa cada correção e como as encontrar num SRT.

3 de outubro de 2026
Sablate Team

As alucinações do Whisper (Whisper hallucinations, em inglês) são texto que o modelo escreve sem que ninguém o tenha dito: «Thank you for watching» sobre o silêncio, um crédito de legendas ou uma linha repetida durante um minuto. Duas definições evitam a maioria delas — filtrar o áudio sem fala e impedir que o modelo use como contexto o seu próprio resultado anterior — e as ferramentas Whisper habituais não trazem nenhuma ativada.

A seguir: os dois tipos lado a lado, porque acontece cada um deles, o que medimos quando um deles atingiu a nossa própria aplicação, quanto custa cada correção, as definições do openai-whisper, do faster-whisper e do whisper.cpp, e como encontrar as que sobrevivem num ficheiro de legendas já terminado.

As alucinações do Whisper, lado a lado

Frase fantasmaCiclo de repetiçãoFala omitida
O que se vê«Thank you for watching», «Thanks for watching», um crédito de legendasUma linha escrita vezes sem conta, muitas vezes sem pontuaçãoUma frase em falta na transcrição
Onde apareceSilêncio, música, aplausos, ruído de salaEm qualquer sítio; depois de começar, continuaInícios em voz baixa, interjeições curtas
O que a provocaÁudio sem fala chega ao descodificadorCada janela é descodificada com o resultado anterior como promptComo um modelo concreto trata esse áudio
Primeira correçãoUm filtro de deteção de atividade de voz (VAD)Desativar o uso do texto anterior como contextoExperimentar um segundo modelo no mesmo clipe
Como aparece nas legendasUma legenda a mais sobre uma pausaUma legenda presa a uma só linha, ou legendas sem quebras de fraseUm buraco onde devia estar uma fala

A terceira coluna é a falha oposta: fala que foi saltada em vez de texto que foi inventado. Tem causas e correções diferentes, tratadas na comparação de modelos Whisper. Tudo o que se segue diz respeito às duas primeiras.

Porque é que o Whisper escreve texto que ninguém disse?

O Whisper percorre o áudio em janelas de 30 segundos, e o seu descodificador escreve texto para cada uma. Existe uma verificação de ausência de fala, mas é um limiar sobre uma probabilidade, e as janelas de música, aplausos ou som ambiente da sala passam-no com regularidade e saem como palavras. As palavras que escolhe denunciam a causa. O Whisper foi treinado com 680.000 horas de áudio da web emparelhado com transcrições, e as despedidas e os créditos de legendas comuns nesse texto são a explicação habitual para o que escreve quando não há nada para transcrever.

Os números não são pequenos. Num estudo de 2025, investigadores da AGH University of Kraków executaram o large-v3 sobre áudio sem fala (ruído, música, sons ambientais) 301.317 vezes. Produziu texto em 40,3 por cento dos casos, e 9,1 por cento dessas alucinações eram ciclos. As saídas mais frequentes foram «thank you», com 24,76 por cento das alucinações, e «thanks for watching», com 10,32 por cento.

Em fala real, a taxa é muito mais baixa e o dano é pior. O estudo de 2024 Careless Whisper concluiu que cerca de 1 por cento das transcrições continha expressões ou frases inteiras que não existiam no áudio, que 38 por cento dessas incluíam danos explícitos, como perpetuar a violência, inventar associações ou insinuar uma falsa autoridade, e que aconteciam desproporcionadamente a oradores com pausas longas.

Nas legendas, o custo é concreto. Uma frase alucinada chega como uma legenda perfeitamente formatada sobre uma pausa, e o espectador lê-a como diálogo.

Porque é que uma linha errada se transforma em quarenta

O ciclo tem uma causa diferente. Por predefinição, o Whisper descodifica cada janela com o seu próprio resultado anterior como prompt, por isso o contexto passa de uma janela para a outra: os nomes mantêm a mesma grafia e as frases continuam. A mesma funcionalidade permite que uma janela má envenene a seguinte. Quando o descodificador escreve uma linha duas vezes, a janela seguinte parte dessa linha e escreve-a outra vez. A documentação do faster-whisper para condition_on_previous_text é clara: com a opção desligada, o modelo «fica menos propenso a ficar preso num ciclo de falha, como a repetição em ciclo ou os tempos que perdem o sincronismo».

Deparámo-nos com isto na nossa própria aplicação antes do lançamento, por isso medimo-lo: o mesmo clipe turco de 101 segundos usado na nossa comparação de modelos, numa RTX 3060 Ti com float16, sem mudar nada além dessa opção.

large-v3, com contexto anteriorlarge-v3, sem contexto anteriormedium, com contexto anteriormedium, sem contexto anterior
Marcas de fim de frase na transcrição0304730
Frases repetidas (6-gramas)9000

A predefinição estragou o large-v3 e não fez nada ao medium. Com o contexto anterior ativado, o modelo maior não escreveu qualquer pontuação de fim de frase e produziu nove frases repetidas; o mais pequeno, com o mesmo áudio e as mesmas definições, esteve bem. Numa das execuções, uma única legenda tinha isto, em 0,12 segundos de áudio:

[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

A pontuação em falta importa tanto como as repetições. As ferramentas de legendas cortam uma transcrição em legendas nas fronteiras entre frases, e uma transcrição sem pontos finais não lhes dá por onde cortar: obtêm-se legendas gigantes ou, com um divisor de linhas descuidado, legendas de uma só palavra. Desativar o contexto anterior repôs a pontuação sem mudar o modelo.

Um clipe não é um benchmark. Mostra, ainda assim, duas coisas: o tamanho do modelo não protege, e a correção mais barata é uma definição.

Desativar o contexto anterior tem algum custo?

Sim. Todas as correções para as alucinações têm um custo, e convém conhecer esses custos antes de as aplicar:

  1. Coerência entre janelas. Sem o texto anterior como contexto, a ortografia e o estilo de pontuação podem variar; a documentação avisa que desativá-lo «pode tornar o texto inconsistente entre janelas». Na prática: um nome escrito de duas maneiras num ficheiro longo.
  2. O seu initial prompt (instrução inicial) fica-se pela primeira janela. As ferramentas passam ao Whisper uma lista de vocabulário (nomes, marcas, jargão) como initial prompt e, com o contexto anterior desativado, esse prompt só molda a primeira janela. O --carry_initial_prompt True do openai-whisper e o --carry-initial-prompt do whisper.cpp voltam a enviá-lo em todas as janelas; no faster-whisper, é a opção hotwords que faz esse trabalho.
  3. As penalizações de repetição apagam repetição verdadeira. O repetition_penalty e o no_repeat_ngram_size suprimiriam um ciclo, mas não distinguem um ciclo de um orador que se repete. O nosso clipe de teste tem exatamente isso: uma frase dita duas vezes seguidas, de propósito. Uma penalização que a remove está a apagar diálogo.
  4. Um filtro de deteção de atividade de voz pode cortar fala baixa. O VAD decide o que conta como fala antes de o Whisper a ouvir, e os inícios suaves e o áudio de banda estreita, como as chamadas telefónicas, são onde perde palavras. O AutoSubs acrescentou em setembro de 2026 um interruptor para desligar a opção de saltar silêncios precisamente para esse caso.
  5. O hallucination_silence_threshold precisa de marcas temporais por palavra, e não é uma cura. Salta silêncios longos à volta de uma suspeita de alucinação. No nosso clipe, não fez diferença mensurável: a linha que suspeitávamos ser inventada revelou-se fala real.

Nenhum destes custos se aproxima do custo de um ciclo. Um nome mal escrito resolve-se com um localizar e substituir; um ciclo de repetição é uma passagem que se transcreve outra vez.

Como impedir as alucinações do Whisper, ferramenta a ferramenta

openai-whisperfaster-whisperwhisper.cppSablate
Filtro de deteção de atividade de vozNenhum integradovad_filter=True, ativado por predefinição só no pipeline em lote--vad com um modelo SileroSempre ativado
Deixar de usar o texto anterior como contexto--condition_on_previous_text Falsecondition_on_previous_text=False-mc 0Sempre desativado
Saltar o silêncio depois de uma suspeita de alucinação--hallucination_silence_thresholdhallucination_silence_thresholdSem equivalenteNão
Voltar a enviar o prompt em todas as janelas--carry_initial_prompt Truehotwords--carry-initial-promptNão
Pode alterar estas definiçõesSimSimSimNão

As três últimas linhas são o ponto fraco do Sablate, dito com franqueza: as duas correções estão sempre ativadas e nenhuma destas definições é exposta. Se quiser afinar o filtro ou levar um prompt de janela em janela, as ferramentas de código aberto permitem-no.

Para o openai-whisper num ficheiro de entrevista:

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

O openai-whisper não tem filtro de deteção de atividade de voz próprio, por isso este comando corrige o ciclo, não as frases fantasma; o --hallucination_silence_threshold com --word_timestamps True é a sua resposta parcial a essas. O whisper.cpp tem as duas correções, e a sua ferramenta de linha de comandos espera WAV de 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

O -mc 0 não guarda contexto de texto entre janelas, e o modelo Silero vem do script download-vad-model.sh do repositório. Em Python, o faster-whisper aceita ambos como argumentos:

from faster_whisper import WhisperModel

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

Como encontrar as alucinações num SRT já terminado?

Nenhuma definição elimina todas as alucinações, por isso verifique o ficheiro. Três comandos apanham a maioria das que sobrevivem, no macOS e no Linux ou no Git Bash e no WSL do 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

O primeiro encontra despedidas habituais e créditos de legendas. O segundo imprime qualquer linha de legenda idêntica à anterior, que é o aspeto habitual de um ciclo depois de cortado em legendas. O terceiro apanha uma expressão de duas a cinco palavras repetida três vezes dentro de uma só linha.

Trate cada resultado como uma pergunta, não como um veredicto. As pessoas dizem de facto «thank you» e também se repetem. Confronte a legenda com o áudio e depois mantenha-a ou apague-a. As frases fantasma sobre pausas longas e música não seguem nenhum padrão; a única verificação possível é ler as legendas que ficam sobre os trechos sem fala.

Quando usar cada correção

«Estou a legendar palestras, entrevistas ou aulas.» Ative o filtro de deteção de atividade de voz e desative o contexto anterior. Esse par é a predefinição sensata para qualquer fala que pretenda legendar.

«A gravação tem silêncios longos ou música de fundo.» O filtro é o que mais importa aqui. Leia na mesma as legendas que ficam sobre a música.

«É uma chamada telefónica ou uma gravação baixa e de banda estreita.» Execute-a uma vez com o filtro e outra sem ele, e compare o que falta. Um filtro que perde palavras baixas é pior do que um «thank you» solto.

«Dependo de um initial prompt para os nomes.» Desative o contexto anterior e volte a enviar o prompt em todas as janelas com as opções acima, ou corrija os nomes depois com localizar e substituir.

«As linhas continuam a repetir-se depois das duas correções.» Experimente outro modelo no mesmo ficheiro antes de recorrer a uma penalização de repetição; o nosso clipe entrou em ciclo no large-v3 e não no medium. Se ainda precisar do no_repeat_ngram_size, ouça tudo à procura de linhas que ele possa ter removido.

Como o Sablate trata disto

No Sablate, as duas correções estão sempre ativadas: um filtro de deteção de atividade de voz à frente do modelo e nenhum uso do texto anterior como contexto. O Sablate corre o Whisper na sua própria máquina, e desligámos o contexto anterior depois da medição acima. Corrigimos também o divisor de linhas que transformava uma transcrição sem pontuação em legendas de uma só palavra.

Há duas consequências que convém conhecer. O vocabulário personalizado em Defaults → Custom vocabulary chega ao Whisper como initial prompt, por isso, com o contexto anterior desativado, molda apenas a primeira janela, aproximadamente os primeiros 30 segundos de fala; os nomes mais adiante numa gravação longa ficam para o Find & replace do editor, que funciona num idioma de cada vez. E, como as definições são fixas, não há nada para afinar. Se uma gravação precisar do filtro desligado, use uma das ferramentas de código aberto acima.

No editor, pode percorrer as legendas com o vídeo a reproduzir, que é a forma mais rápida de avaliar as ocorrências encontradas pelos comandos acima, e a exportação grava as legendas corrigidas como .srt, .vtt ou um vídeo com as legendas incrustadas. O Fast e o Balanced correm no plano gratuito; o Accurate e o Best fazem parte do Pro. Transfira o Sablate para Windows ou Mac e experimente-o nas suas próprias imagens.

Resumindo

O Whisper tem alucinações de duas formas: escreve frases feitas sobre áudio sem fala e entra em ciclo quando uma janela má alimenta a seguinte. Um filtro de deteção de atividade de voz resolve a primeira, desativar condition_on_previous_text resolve a segunda, e as ferramentas habituais não trazem nenhuma ativada. As duas correções custam pouco ao lado de um ciclo. Um modelo maior não é um modelo mais seguro. E, mude o que mudar, leia o ficheiro de legendas final antes de qualquer outra pessoa — o guia para criar ficheiros SRT tem as verificações do próprio formato.