Problem: Müzik platformunda şarkılar arasında ses seviyesi farkı kullanıcı deneyimini olumsuz etkiliyor. Bir şarkı çok yüksek sesle gelirken, diğeri çok düşük sesle gelebiliyor.
Çözüm: ReplayGain (Şarkıların algılanan ses seviyesini ölçüp dengelemek için endüstri standardı) kullanarak tüm şarkıları aynı ses seviyesine normalize edeceğiz.
Hedef: Spotify standardı olan -14 LUFS (Loudness Units relative to Full Scale - insan kulağının algıladığı ses seviyesi ölçüsü) seviyesine tüm şarkıları getirmek.
Volume normalization için 3 farklı teknik yaklaşım var. Her birinin artıları ve eksileri mevcut:
| Yaklaşım | Avantajları | Dezavantajları | Durum |
|---|---|---|---|
| FFmpeg + ebur128 (Açık kaynak ses işleme aracı + Avrupa yayın standardı ses ölçüm filtresi) |
✅ Ücretsiz ve açık kaynak ✅ Spotify standardına tam uyumlu ✅ Hassas LUFS ölçümü ✅ Server'da zaten kurulu |
❌ Her şarkı 30-60 saniye işlem süresi ❌ Server CPU yükü yüksek ❌ 26K şarkı için ~12-24 saat batch işlem gerekli |
ÖNERİLEN |
| Essentia (Müzik analizi için özel geliştirilmiş kütüphane) |
✅ Müzik analizi için optimize ✅ Hızlı işlem ✅ Ek özellikler (BPM, key detection) |
❌ Server'a ayrıca kurulum gerekli ❌ Python bağımlılığı ❌ Öğrenme eğrisi var |
ALTERNATIF |
| Cyanite.ai API (Bulut tabanlı müzik analiz servisi) |
✅ Anlık sonuç ✅ Server yükü yok ✅ Profesyonel analiz ✅ Ek özellikler (mood, genre) |
❌ Ücretli ($0.01/şarkı = 26K şarkı için ~$260) ❌ API bağımlılığı ❌ İnternet bağlantısı gerekli |
ÜCRETLI |
Maliyet yoktur, Spotify standardına tam uyumludur ve server'da zaten kuruludur. Batch işlem ile 26K şarkıyı arka planda analiz edebiliriz (kullanıcı deneyimini etkilemez).
Strateji: Yeni yüklenen şarkılar anında, mevcut 26K şarkı background job ile gece saatlerinde işlenebilir.
Ne Yapılacak: Songs tablosuna loudness bilgilerini saklamak için yeni alanlar eklenecek.
Yaklaşım:
Her şarkı kaydında loudness bilgileri saklanabilecek, gerektiğinde yeniden hesaplanmadan direkt kullanılabilecek.
Ne Yapılacak: Song model'inde loudness hesaplama metodları eklenecek.
Yaklaşım:
Model üzerinden $song->loudness_gain ile direkt gain değerine erişilebilecek, player entegrasyonu kolay olacak.
Ne Yapılacak: FFmpeg ile LUFS ölçümü yapan background job oluşturulacak.
Yaklaşım:
FFmpeg işlemi CPU yoğun! Queue sistemi kullanılmalı ki şarkı yükleme işlemi yavaşlamasın. Job arka planda işlenirken kullanıcı diğer işlemlerine devam edebilmeli.
Şarkı yüklendiğinde kullanıcı beklemeden işlem tamamlanır, arka planda loudness analizi yapılır ve 30-60 saniye içinde tamamlanır.
Ne Yapılacak: Şarkı yükleme endpoint'inde job tetikleme mantığı eklenecek.
Yaklaşım:
Şarkı yükleme API'sı performansı korunacak, loudness analizi asenkron olarak yapılacak.
Ne Yapılacak: Player'da ses seviyesi kontrol mantığı güncellenecek.
Yaklaşım:
dB'den linear dönüşüm önemli! Yanlış formül kullanılırsa ses ya çok sessiz ya da çok gürültülü olur. 10^(gain/20) formülü matematiksel standart.
Şarkılar arası geçişlerde ses seviyesi sabit kalacak, kullanıcı volume slider'ını sürekli ayarlamak zorunda kalmayacak.
Ne Yapılacak: Mevcut 26K şarkıyı toplu olarak analiz edecek Artisan komutu.
Yaklaşım:
26K şarkı için tahmini 12-24 saat. Gece 02:00-06:00 arası cron ile çalıştırılabilir (düşük trafik saatleri). Kullanıcı deneyimi etkilenmez.
Tüm mevcut şarkılar zamanla normalize edilecek, yeni yüklenenler otomatik olarak. Sistem tamamen otomatik hale gelecek.
Mümkün olduğunca yeni migration oluşturmaktan kaçınacağız. Fakat loudness bilgileri için migration zorunlu. Songs tablosuna iki kolon eklememiz gerekiyor.
Çözüm: Hem central hem tenant migration'ları oluşturup test ortamında önce deneyeceğiz.
Background job çalışması için Horizon/Queue worker'ın aktif olması gerekli. Eğer queue çalışmıyorsa loudness analizi hiç yapılmaz!
Çözüm: php artisan horizon:status komutu ile kontrol edilecek, eğer çalışmıyorsa uyarı verilecek.
Maksimum +6 dB gain limiti çok önemli! Daha fazla artırırsak clipping (ses bozulması/çatırtı) oluşur.
Çözüm: Model'de calculateNormalizationGain() içinde min($gain, 6) kontrolü ile sınırlandırılacak.
Loudness_db NULL olan şarkılarda player bozulmamalı! Yeni şarkılar analiz edilene kadar eski mantıkla çalışmalı.
Çözüm: Player'da fallback: loudness_gain ?? 1.0 kullanacağız.
Server'da FFmpeg'in ebur128 desteği olmalı. Bazı minimal FFmpeg kurulumlarında bu filter olmayabilir.
Çözüm: İlk adımda ffmpeg -filters | grep ebur128 komutu ile kontrol edeceğiz.