Gürültülü Türkçe Konuşma / Şarkı Verisi İçin Whisper İyileştirme Çalışması
Bu repo, gürültülü Türkçe konuşma ve şarkı kayıtlarında Whisper’ın zayıf performansını iyileştirmek için geliştirilmiş deneysel bir çözümü içerir.
Amaç, özellikle:
Restoran, kafe, kalabalık ortam kayıtları
Müzik + vokal içeren karaoke / şarkı kayıtları
Arka plan gürültüsü yüksek, yankılı, mikrofon kalitesi düşük sesler
gibi gerçek hayata yakın, kirli verilerde Whisper’ın daha stabil ve anlamlı çıktılar üretmesine yardımcı olmaktır.
🔴 Önemli Uyarı:
Bu çalışma tam çözüm değildir. Deneyler sonucunda sistemin,
gürültülü senaryolarda Whisper’a göre yaklaşık %30 civarında bir iyileşme sağladığı,
ancak birçok durumda hâlâ hatalı, bozuk veya anlamsız çıktılar üretebildiği görülmüştür.
- Motivasyon
Whisper, temiz ve makul seviyede gürültülü verilerde oldukça güçlü bir model; ancak:
Müzik + vokal karışık sinyallerde (şarkı, karaoke, cover videoları),
Arka plan konuşmalarının yoğun olduğu kalabalık ortamlarda,
Ucuz mikrofon, telefon, ortam yankısı vb. durumlarında,
Türkçe için ciddi performans düşüşleri gözlemlendi:
Kelimelerin içinin boşalması,
Rastgele hece / harf tekrarları,
Tamamen alakasız cümleler,
Uzun sessizlikler veya anlamsız “gevezelik” çıktıları.
Bu nedenle, Whisper’ı tamamen değiştirmek yerine, önüne/arkasına bir “tampon katman” koyan deneysel bir çözüm tasarlandı.
- Çözümün Temel Fikri
Bu repo’daki çözüm, özetle şu fikre dayanır:
Gürültülü ses → Ön işleme
Basit gürültü azaltma (noise reduction)
Band-pass / low-pass gibi filtreler
Ses düzeyi normalizasyonu
Gerekirse kaba ses aktivite tespiti (VAD) ile sessiz/gereksiz kısımların kırpılması
Whisper için daha “temiz” bir input oluşturma
Mümkün olduğunca vokali ön plana çıkarıp gürültüyü bastırmak
Modelin input spektrumunu “aşırı bozulmuş” durumdan bir tık daha anlamlı hâle getirmek
Bazı durumlarda post-processing
Whisper çıktısındaki aşırı hece / harf tekrarlarını tespit edip kırpmaya çalışan basit kurallar
Örnek: di di di di di → di veya diydik biz benzeri normalize edilmiş ifadeye indirgeme girişimleri
Bu yapı, Whisper’ı “yeniden tasarlamak” yerine, başına ve sonuna takılmış deneysel bir iyileştirme katmanı gibi düşünülebilir.
- Ne Kadar İşe Yarıyor?
Bu proje üretim ortamına hazır bir ürün değil, tamamen deneysel bir araştırma sonucu ortaya çıktı.
Gözlemsel ve küçük ölçekli testler sonucunda:
Bazı zor örneklerde Whisper’ın hiç okuyamadığı veya anlamsız hece spam’ine girdiği kayıtlar,
bu sistem sonrası kısmen anlamlı cümlelere dönüşebildi.
Özellikle
Arka plan gürültüsü orta seviyede
Vokal nispeten baskın
durumlarda kayda değer iyileşme görüldü.
Ancak:
Çok ağır gürültülü,
Müzik + vokal oranı çok dengesiz,
Mikrofon kalitesi aşırı kötü kayıtlar için
sistem çoğu zaman hâlâ yetersiz kalıyor.
📊 Özet:
Deneysel çalışmalar sonucunda:
Gürültülü senaryolarda,
Whisper yalnız kullanıldığında elde edilen kaliteye kıyasla,
bu çözümün yaklaşık %30 oranında iyileşme sağladığı görülmüştür.
Bu %30; mükemmel doğruluk anlamına gelmez.
Sadece “hiçbir şey anlamadığımız bazı kayıtlar artık kısmen okunabilir hâle geldi” gibi bir göreli iyileşme olarak anlaşılmalıdır.
- Sınırlamalar
Bu çözümün bilerek açıkça belirtilen sınırlamaları:
Genellenebilirlik zayıf
Sadece test edilen senaryolar (Türkçe, belirli kayıt tipleri) için gözlemler yapılmıştır.
Farklı diller, farklı cihazlar, farklı akustik koşullarda sonuçlar çok değişebilir.
DSP katmanı çok basit
Kullanılan filtreleme, normalizasyon, VAD ve benzeri işlemler
state-of-the-art seviyede değildir.
Daha sofistike yöntemler (spectral subtraction, Wiener, dereverb, source separation vs.) ile geliştirilebilir.
Whisper’ın kendi limitlerini aşmıyor
Modelin dilsel kapasitesini değiştirmiyoruz.
Sadece input’u biraz “düzenleyip” daha iyi anlaşılabilir hâle getirmeye çalışıyoruz.
Yüzde 100 çözüm değil
Birçok kayıtta hâlâ
kelime atlama,
yanlış kelimeler,
dağınık cümleler,
tekrar eden heceler
görülebiliyor.
Bu nedenle proje şu an için:
✅ Araştırma prototipi
❌ Üretim için hazır ürün
olarak görülmelidir.
- Kurulum
git clone
cd <repo_klasörü>
Örnek: Python ortamı oluşturma
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
requirements.txt içinde:
openai-whisper veya kullanılan Whisper wrapper’ı
torch
numpy, scipy
librosa (varsa)
vb. kütüphaneler yer almalıdır.
- Kullanım
Burayı kendi script’ine göre ayarlayabilirsin. Örnek bir akış veriyorum:
6.1. Tek bir ses dosyası için
python run_pipeline.py
--audio_path path/to/noisy_audio.wav
--model medium
--output_json results/output.json
Bu komut:
audio_path içindeki gürültülü sesi okur.
Ön işleme (gürültü azaltma, normalizasyon, kesme vs.) uygular.
İşlenmiş ses üzerinden Whisper ile transcript üretir.
Çıktıyı (isteğe bağlı post-processing sonrası) output_json içine yazar.
6.2. Bir klasör dolusu kayıt için
python batch_process.py
--input_dir data/noisy_audios
--output_dir results/transcripts
--model medium
- Gelecek Çalışmalar
Bu çalışmanın ortaya koyduğu şey şu:
Whisper, gürültülü Türkçe gerçek hayat verisinde tek başına yeterli değil.
Basit bir ön işleme + hafif post-processing ile bile yaklaşık %30 civarı göreli iyileşme elde edilebiliyor.
Fakat ciddi bir ürün / startup için:
Daha güçlü gürültü azaltma ve source separation,
Türkçe’ye özel akustik + dil modeli adaptasyonu,
Hece/kelime bazlı zaman damgalı modeller,
Daha iyi veri toplama ve etiketleme
gerekecek.
Bu repo, problemin zorluğunu ve basit yaklaşımların sınırlarını göstermeyi amaçlayan bir ara adım olarak görülmelidir.
1!pip install -q transformers soundfile librosa
2
3import torch
4import librosa
5from transformers import WhisperProcessor, WhisperForConditionalGeneration
6
7MODEL_ID = "Cosmobillian/turkish_whisper_for_noisy_datas" # senin HF reposu
8
9device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
10
11processor = WhisperProcessor.from_pretrained(MODEL_ID)
12model = WhisperForConditionalGeneration.from_pretrained(MODEL_ID).to(device)
13
14# ✅ Dil / task prompt'unu zorla (Türkçe + transcribe)
15forced_ids = processor.get_decoder_prompt_ids(
16 language="turkish",
17 task="transcribe",
18)
19model.config.forced_decoder_ids = forced_ids
20if hasattr(model, "generation_config"):
21 model.generation_config.forced_decoder_ids = forced_ids
22
23# ❗ suppress_tokens'ı elle BOZMAYALIM, HF default kalsın
24# model.config.suppress_tokens = [] # BUNU KULLANMA
25
26# ✅ EOS / PAD token'larını netleştir (özellikle fine-tune sonrası önemli)
27model.config.eos_token_id = processor.tokenizer.eos_token_id
28model.config.pad_token_id = processor.tokenizer.pad_token_id
29if hasattr(model, "generation_config"):
30 model.generation_config.eos_token_id = processor.tokenizer.eos_token_id
31 model.generation_config.pad_token_id = processor.tokenizer.pad_token_id
32
33
34def load_audio(path, target_sr=16000):
35 audio, sr = librosa.load(path, sr=None, mono=True)
36 if sr != target_sr:
37 audio = librosa.resample(audio, orig_sr=sr, target_sr=target_sr)
38 sr = target_sr
39 return audio, sr
40
41
42def transcribe(path, max_new_tokens=128):
43 # 1) Ses yükle
44 speech, sr = load_audio(path, target_sr=16000)
45
46 # 2) Processor ile input_features hazırla
47 inputs = processor(
48 speech,
49 sampling_rate=sr,
50 return_tensors="pt",
51 )
52 input_features = inputs.input_features.to(device)
53
54 # 3) Generate - tekrarları bastıralım
55 with torch.no_grad():
56 generated_ids = model.generate(
57 input_features,
58 max_new_tokens=max_new_tokens,
59 do_sample=False, # deterministik
60 num_beams=1, # greedy
61 no_repeat_ngram_size=3, # 3-gram tekrarlarını engelle
62 repetition_penalty=1.3, # aynı tokeni tekrar seçmeyi pahalı yap
63 )
64
65 # 4) Decode
66 text = processor.batch_decode(
67 generated_ids,
68 skip_special_tokens=True
69 )[0]
70
71 return text
72
73
74# ÖRNEK KULLANIM
75AUDIO_PATH = "/content/drive/MyDrive/Colab Notebooks/short15s.wav" # kendi ses dosyan
76print("Transkripsiyon:")
77print(transcribe(AUDIO_PATH, max_new_tokens=255))