Bloga dön

Whisper Halüsinasyonları: Neden Satır Tekrarlar ve Metin Uydurur

Whisper halüsinasyonları: sessizliğin üstüne neden “Thank you for watching” yazar, bir satırda neden döngüye girer, her çözümün bedeli ve SRT'de nasıl bulunur.

3 Ekim 2026
Sablate Team

Whisper halüsinasyonları (hallucination), modelin kimse söylemediği halde yazdığı metindir: sessizliğin üstünde “Thank you for watching”, bir altyazı künyesi ya da bir dakika boyunca tekrarlanan tek bir satır. İki ayar çoğunu önler — konuşma olmayan sesi filtrelemek ve modelin kendi çıktısını bağlam olarak kullanmasını durdurmak — ve standart Whisper araçlarında ikisi de varsayılan olarak kapalıdır.

Aşağıda: iki türün yan yana karşılaştırması, her birinin neden ortaya çıktığı, birinin kendi uygulamamıza bulaştığında ölçtüklerimiz, her çözümün bedeli, openai-whisper, faster-whisper ve whisper.cpp için ayarlar ve bitmiş bir altyazı dosyasında geride kalanları nasıl bulacağın.

Whisper halüsinasyonları yan yana

Hayalet ifadeTekrar döngüsüAtlanan konuşma
Ne görürsün“Thank you for watching”, “Thanks for watching”, bir altyazı künyesiTekrar tekrar yazılan tek bir satır, çoğu zaman noktalamasızTranskriptte eksik bir cümle
Nerede ortaya çıkarSessizlik, müzik, alkış, oda gürültüsüHer yerde; bir kez başlayınca sürerSessiz girişler, kısa ünlemler
NedeniKonuşma olmayan ses kod çözücüye ulaşırHer pencere, önceki çıktısı istem olarak verilerek çözülürBelirli bir modelin o sesi nasıl işlediği
İlk çözümSes etkinliği filtresi (VAD)Önceki metni bağlam olarak kullanmayı kapatAynı klipte ikinci bir model dene
Altyazıda nasıl görünürBir duraklamanın üstünde fazladan bir cueTek satıra takılıp kalan bir cue ya da cümle sonu olmayan cue'larBir satırın olması gereken yerde bir boşluk

Üçüncü sütun ters bir hatadır: uydurulan metin değil, atlanan konuşma. Nedenleri ve çözümleri farklıdır; Whisper model karşılaştırmasında ele alınıyor. Aşağıdaki her şey ilk ikisiyle ilgili.

Whisper neden kimsenin söylemediği metni yazar?

Whisper sesi 30 saniyelik pencereler halinde işler ve kod çözücüsü her pencere için metin yazar. Bir konuşma-yok denetimi var, ama bu bir olasılık üzerindeki eşiktir; müzik, alkış ya da oda sesi içeren pencereler düzenli olarak bu denetimi aşar ve kelimelere dönüşür. Seçtiği kelimeler nedeni ele verir. Whisper, transkriptlerle eşleştirilmiş 680.000 saatlik web sesiyle eğitildi; o metinlerde yaygın olan kapanış cümleleri ve altyazı künyeleri, yazıya dökülecek bir şey olmadığında modelin yazdıklarının olağan açıklamasıdır.

Rakamlar küçük değil. 2025'te yapılan bir çalışmada AGH University of Kraków'dan araştırmacılar, large-v3'ü konuşma olmayan ses üzerinde — gürültü, müzik, çevre sesi — 301.317 kez çalıştırdı. Çalıştırmaların %40,3'ünde metin üretti ve bu halüsinasyonların %9,1'i döngüydü. En sık çıkan çıktılar, halüsinasyonların %24,76'sıyla “thank you” ve %10,32'siyle “thanks for watching” oldu.

Gerçek konuşmada oran çok daha düşüktür ama zarar daha büyüktür. 2024 tarihli Careless Whisper çalışması, transkripsiyonların kabaca %1'inin seste hiç olmayan bütün ifadeler ya da cümleler içerdiğini, bunların %38'inin şiddeti sürdürmek, ilişkilendirmeler uydurmak ya da sahte otorite ima etmek gibi açık zararlar taşıdığını ve bunların orantısız biçimde uzun duraklamaları olan konuşmacılarda görüldüğünü buldu.

Altyazıda bedel somuttur. Halüsinasyonla üretilmiş bir ifade, bir duraklamanın üstünde kusursuz biçimlendirilmiş bir cue olarak gelir ve izleyici onu diyalog sanıp okur.

Neden tek bir kötü satır kırka dönüşür

Döngünün nedeni farklıdır. Whisper varsayılan olarak her pencereyi kendi önceki çıktısını istem (prompt) olarak vererek çözer; böylece bağlam pencereler arasında taşınır: isimler aynı yazılır, cümleler sürer. Aynı özellik, bir kötü pencerenin sonrakini zehirlemesine de yol açar. Kod çözücü bir satırı iki kez yazdığında sonraki pencere o satırla beslenir ve onu yeniden yazar. faster-whisper'ın condition_on_previous_text belgesi bunu açıkça söyler: kapatıldığında model “tekrar döngüsü ya da zaman damgalarının senkrondan çıkması gibi bir hata döngüsüne takılmaya daha az eğilimli hale gelir”.

Bunu yayından önce kendi uygulamamızda yaşadık, o yüzden ölçtük: model karşılaştırmamızda kullandığımız aynı 101 saniyelik Türkçe klip, float16 ile bir RTX 3060 Ti üzerinde, yalnızca o tek seçeneği değiştirerek.

large-v3, bağlam açıklarge-v3, bağlam kapalımedium, bağlam açıkmedium, bağlam kapalı
Transkriptteki cümle sonu işaretleri0304730
Tekrarlanan ifadeler (6-gram)9000

Varsayılan, large-v3'ü mahvetti ve medium'a hiçbir şey yapmadı. Bağlam açıkken büyük model hiç cümle noktalaması yazmadı ve dokuz tekrarlanan ifade üretti; küçük model, aynı sesle ve aynı ayarlarla gayet iyiydi. Bir çalıştırmada tek bir cue, 0,12 saniyelik sesin üzerinde şunu taşıyordu:

[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

Eksik noktalama, tekrarlar kadar önemlidir. Altyazı araçları bir transkripti cümle sınırlarından cue'lara böler ve noktasız bir transkript onlara bölecek bir şey bırakmaz: ya dev cue'lar elde edersin ya da özensiz bir satır bölücüyle tek kelimelik cue'lar. Bağlamı kapatmak, modeli değiştirmeden noktalamayı geri getirdi.

Tek bir klip bir benchmark değildir. Yine de iki şeyi gösterir: model boyutu bir koruma değildir ve en ucuz çözüm bir ayardır.

Önceki metni bağlam olarak kullanmayı kapatmanın bir bedeli var mı?

Evet. Halüsinasyonlar için her çözümün bir bedeli var ve uygulamadan önce bunları bilmeye değer:

  1. Pencereler arası tutarlılık. Önceki metin bağlam olarak kullanılmadığında yazım ve noktalama stili kayabilir; belgeler bunu kapatmanın “metni pencereler arasında tutarsız hale getirebileceği” konusunda uyarır. Pratikte: uzun bir dosyada iki farklı biçimde yazılan bir isim.
  2. Initial prompt (başlangıç istemi) ilk pencerede durur. Araçlar Whisper'a bir kelime listesini — isimler, markalar, jargon — initial prompt olarak iletir ve bağlam kapalıyken bu yalnızca ilk pencereyi şekillendirir. openai-whisper'ın --carry_initial_prompt True ve whisper.cpp'nin --carry-initial-prompt seçenekleri onu her pencere için yeniden gönderir; faster-whisper'da bu işi hotwords seçeneği yapar.
  3. Tekrar cezaları gerçek tekrarı da siler. repetition_penalty ve no_repeat_ngram_size bir döngüyü bastırır, ama bir döngüyü kendini tekrar eden bir konuşmacıdan ayıramaz. Test klibimizde tam olarak bu var: bilerek art arda iki kez söylenmiş bir cümle. Onu silen bir ceza, diyalog siliyor demektir.
  4. Ses etkinliği filtresi sessiz konuşmayı kırpabilir. VAD, Whisper duymadan önce neyin konuşma sayılacağına karar verir; kısık sesle başlayan cümleler ve telefon görüşmeleri gibi bant sınırlı sesler, kelimelerin kaçırıldığı yerlerdir. AutoSubs, tam bu durum için sessizlik atlamasını kapatan bir anahtarı Eylül 2026'da ekledi.
  5. hallucination_silence_threshold kelime zaman damgaları ister ve bir çare değildir. Şüpheli bir halüsinasyonun çevresindeki uzun sessizlikleri atlar. Klibimizde ölçülebilir bir fark yaratmadı: uydurma olduğundan şüphelendiğimiz satır gerçek konuşma çıktı.

Bunların hiçbiri bir döngünün bedeline yaklaşmaz. Yanlış yazılmış bir isim tek bir bul-değiştir işidir; bir tekrar döngüsü ise yeniden transkript çıkaracağın bir bölümdür.

Whisper'ın halüsinasyon görmesi nasıl engellenir: araç araç

openai-whisperfaster-whisperwhisper.cppSablate
Ses etkinliği filtresiYerleşik yokvad_filter=True; varsayılan olarak yalnızca batched pipeline'da açıkSilero modeliyle --vadHer zaman açık
Önceki metni bağlam olarak kullanmayı durdur--condition_on_previous_text Falsecondition_on_previous_text=False-mc 0Her zaman kapalı
Şüpheli halüsinasyondan sonra sessizliği atla--hallucination_silence_thresholdhallucination_silence_thresholdKarşılığı yokHayır
İstemi her pencerede yeniden gönder--carry_initial_prompt Truehotwords--carry-initial-promptHayır
Bu ayarları değiştirebilirsinEvetEvetEvetHayır

Son üç satır Sablate'in dürüst zayıf noktasıdır: iki çözüm de her zaman açıktır ve bu ayarların hiçbiri kullanıcıya sunulmaz. Filtreyi ayarlamak ya da bir istemi pencereler arasında taşımak istersen açık kaynaklı araçlar buna izin verir.

Bir röportaj dosyasında openai-whisper için:

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

openai-whisper'ın kendi ses etkinliği filtresi yok; bu yüzden bu komut döngüyü düzeltir, hayalet ifadeleri değil. --hallucination_silence_threshold ile --word_timestamps True ise onlara kısmi bir cevaptır. whisper.cpp'de iki çözüm de var ve komut satırı aracı 16 bit WAV bekler:

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 pencereler arasında metin bağlamı tutmaz ve Silero modeli deponun download-vad-model.sh script'inden gelir. Python'da faster-whisper ikisini de argüman olarak alır:

from faster_whisper import WhisperModel

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

Bitmiş bir SRT'de halüsinasyonları nasıl bulursun?

Hiçbir ayar her halüsinasyonu ortadan kaldırmaz; o yüzden dosyayı kontrol et. macOS ve Linux'ta ya da Windows'ta Git Bash ve WSL'de çalıştırılan üç komut, geride kalanların çoğunu yakalar:

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

Birincisi hazır kapanış cümlelerini ve altyazı künyelerini bulur. İkincisi, bir öncekiyle aynı olan her altyazı satırını yazdırır; bir döngü cue'lara bölündüğünde genellikle böyle görünür. Üçüncüsü, tek bir satırın içinde üç kez tekrarlanan iki ila beş kelimelik bir ifadeyi yakalar.

Her eşleşmeyi bir hüküm değil, bir soru olarak ele al. İnsanlar gerçekten “thank you” der ve gerçekten kendilerini tekrar eder. Cue'yu sesiyle birlikte oynat, sonra tut ya da sil. Uzun duraklamaların ve müziğin üstündeki hayalet satırlar hiçbir kalıba uymaz; bunlar için tek kontrol, konuşma olmayan bölümlerin üstünde duran cue'ları okumaktır.

Hangi çözüm ne zaman kullanılır

“Konuşmalara, röportajlara ya da derslere altyazı yapıyorum.” Ses etkinliği filtresini aç, bağlamı kapat. Bu ikili, altyazı hazırlamayı planladığın her konuşma için mantıklı varsayılandır.

“Kayıtta uzun sessizlikler ya da fon müziği var.” Filtre en çok burada önemlidir. Müziğin üstündeki cue'ları yine de oku.

“Bir telefon görüşmesi ya da sessiz, bant sınırlı bir kayıt.” Bir kez filtreyle, bir kez filtresiz çalıştır ve eksik olanları karşılaştır. Sessiz kelimeleri düşüren bir filtre, başıboş bir “thank you” satırından daha kötüdür.

“İsimler için bir initial prompt'a güveniyorum.” Bağlamı kapat ve istemi yukarıdaki seçeneklerle her pencere için yeniden gönder ya da isimleri sonradan bul-değiştir ile düzelt.

“İki çözümden sonra da satırlar tekrar ediyor.” Tekrar cezasına başvurmadan önce aynı dosyada başka bir model dene; klibimiz large-v3'te döngüye girdi, medium'da girmedi. Yine de no_repeat_ngram_size gerekiyorsa, onun silmiş olabileceği satırlar için baştan sona dinle.

Sablate bunu nasıl ele alıyor

Sablate'te iki çözüm de her zaman açıktır: modelin önünde bir ses etkinliği filtresi ve önceki metni bağlam olarak kullanmama. Sablate Whisper'ı kendi makinende çalıştırır; bağlamı ise yukarıdaki ölçümden sonra biz kapattık. Ayrıca noktalamasız bir transkripti tek kelimelik cue'lara çeviren satır bölücüyü de düzelttik.

Bilmeye değer iki sonuç var. Varsayılanlar → Özel adlar sözlüğü altındaki özel sözlük Whisper'a initial prompt olarak ulaşır; bu yüzden bağlam kapalıyken yalnızca ilk pencereyi, yani konuşmanın kabaca ilk 30 saniyesini şekillendirir. Uzun bir kayıtta daha sonra geçen isimler, editördeki Bul ve değiştir'in işidir; o da aynı anda tek bir dilde çalışır. Ayarlar sabit olduğu için ayarlanacak bir şey de yok. Bir kayıt filtrenin kapatılmasını gerektiriyorsa yukarıdaki açık kaynaklı araçlardan birini kullan.

Editörde video oynarken cue'ları tek tek gezebilirsin; yukarıdaki komutların bulduklarını değerlendirmenin en hızlı yolu budur. Dışa aktarma da düzeltilmiş altyazıları .srt, .vtt ya da videoya gömülü bir kopya olarak yazar. Fast ve Balanced ücretsiz planda çalışır; Accurate ve Best Pro'nun parçasıdır. Sablate'i Windows veya Mac için indir ve kendi görüntülerinde dene.

Kısacası

Whisper iki şekilde halüsinasyon görür: konuşma olmayan sesin üstüne hazır kalıplar yazar ve bir kötü pencere sonrakini beslediğinde döngüye girer. Ses etkinliği filtresi birincisini düzeltir, condition_on_previous_text'i kapatmak ikincisini; standart araçlarda ise ikisi de varsayılan olarak kapalıdır. İki çözümün de bedeli bir döngünün yanında küçüktür. Daha büyük bir model daha güvenli bir model değildir. Ve ne değiştirirsen değiştir, bitmiş altyazı dosyasını başkası okumadan önce sen oku — SRT dosyası oluşturma rehberinde formatın kendisi için kontroller var.