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.
!pip install -q transformers soundfile librosa
import torch
import librosa
from transformers import WhisperProcessor, WhisperForConditionalGeneration
MODEL_ID = "Cosmobillian/turkish_whisper_for_noisy_datas" # senin HF reposu
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
processor = WhisperProcessor.from_pretrained(MODEL_ID)
model = WhisperForConditionalGeneration.from_pretrained(MODEL_ID).to(device)
# ✅ Dil / task prompt'unu zorla (Türkçe + transcribe)
forced_ids = processor.get_decoder_prompt_ids(
language="turkish",
task="transcribe",
)
model.config.forced_decoder_ids = forced_ids
if hasattr(model, "generation_config"):
model.generation_config.forced_decoder_ids = forced_ids
# ❗ suppress_tokens'ı elle BOZMAYALIM, HF default kalsın
# model.config.suppress_tokens = [] # BUNU KULLANMA
# ✅ EOS / PAD token'larını netleştir (özellikle fine-tune sonrası önemli)
model.config.eos_token_id = processor.tokenizer.eos_token_id
model.config.pad_token_id = processor.tokenizer.pad_token_id
if hasattr(model, "generation_config"):
model.generation_config.eos_token_id = processor.tokenizer.eos_token_id
model.generation_config.pad_token_id = processor.tokenizer.pad_token_id
def load_audio(path, target_sr=16000):
audio, sr = librosa.load(path, sr=None, mono=True)
if sr != target_sr:
audio = librosa.resample(audio, orig_sr=sr, target_sr=target_sr)
sr = target_sr
return audio, sr
def transcribe(path, max_new_tokens=128):
# 1) Ses yükle
speech, sr = load_audio(path, target_sr=16000)
# 2) Processor ile input_features hazırla
inputs = processor(
speech,
sampling_rate=sr,
return_tensors="pt",
)
input_features = inputs.input_features.to(device)
# 3) Generate - tekrarları bastıralım
with torch.no_grad():
generated_ids = model.generate(
input_features,
max_new_tokens=max_new_tokens,
do_sample=False, # deterministik
num_beams=1, # greedy
no_repeat_ngram_size=3, # 3-gram tekrarlarını engelle
repetition_penalty=1.3, # aynı tokeni tekrar seçmeyi pahalı yap
)
# 4) Decode
text = processor.batch_decode(
generated_ids,
skip_special_tokens=True
)[0]
return text
# ÖRNEK KULLANIM
AUDIO_PATH = "/content/drive/MyDrive/Colab Notebooks/short15s.wav" # kendi ses dosyan
print("Transkripsiyon:")
print(transcribe(AUDIO_PATH, max_new_tokens=255))
- Downloads last month
- 107