YAML Metadata Warning: empty or missing yaml metadata in repo card (https://huggingface.co/docs/hub/model-cards#model-card-metadata)

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.

  1. 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ı.

  1. Çö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.

  1. 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.

  1. 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.

  1. 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.

  1. 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

  1. 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
Safetensors
Model size
2B params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support