Çalma listesi önerilerinde BPM'i dosyadan değil, ilk 20 saniyeden okumak

这篇内容暂时只有 Türkçe 版本,以下是原文。

Geçen hafta kendi arşivimde bir şey fark ettim: 1200 parçalık yerel kütüphanede, etiketlerinde BPM yazan dosyaların yaklaşık üçte biri, çalarken duyduğum tempoyla uyuşmuyordu. Sebep basit — ID3’e sonradan elle ya da farklı araçlarla yazılmış değerler. Bir de remiksler var: etiket orijinalden kalmış, ses yarı hızda. Öneri üretirken bu etikete güvenmek, sette iki parçayı yanlış eşleştirmek demek. Ben de öneri sırasında BPM’i dosya etiketinden okumayı bıraktım, ilk 20 saniyeden yerel olarak çıkarıyorum.

import librosa

def bpm_from_head(path, seconds=20):
    y, sr = librosa.load(path, sr=22050, duration=seconds, mono=True)
    tempo, _ = librosa.beat.beat_track(y=y, sr=sr)
    return float(tempo)

Bunu öneri betiğine şöyle bağladım: parça başına bir kez hesaplayıp SQLite’a (yol, mtime, bpm) olarak yazıyorum, mtime değişmedikçe yeniden hesaplamıyorum. 1200 parça ilk turda tek çekirdekte ~14 dakika sürdü; sonrası anlık. 20 saniye seçmemin nedeni, girişli parçalarda (davul öncesi atmosfer) tam dosyayı taramanın tempoyu yarıya düşürmesiydi; 20 saniye bu arşivde en az hatalı sonucu verdi.

Mekanizma tarafı: beat_track bir olasılık dağılımı üzerinden tempo kestirir, dosya etiketi ise statik bir sayı. Etiket hızlı ama yanlış olabiliyor; ses tabanlı çıkarım yavaş ama dosyanın gerçekten çaldığı şeyi ölçüyor. Takas açık: CPU ve ilk tarama süresi karşılığında güvenilirlik. Öneri üretiminde BPM’i yalnızca sıralama anahtarı olarak kullandığım için küçük sapmalar tolere edilebiliyor; harmanlama (beatmatching) yapacak olsam bu tolerans daralırdı.

Nerede bozuluyor: ambient, klasik ve serbest tempolu kayıtlarda beat_track tamamen saçmalıyor — bir piyano parçasına 172 BPM verdi. Bu yüzden çıktıyı bir aralıkla sınırlıyorum (60–200) ve güven skoru düşükse etikete geri düşüyorum. Bir de canlı kayıtlar: tempo parça içinde kayıyor, ilk 20 saniye tüm parçayı temsil etmiyor. Kendi hatam: sr=22050 ile yüklerken bazı 96 kHz dosyalarda kitaplık sessizce yeniden örnekledi, sonuç değişmedi ama ilk denemede yanlışlıkla mono=False bırakıp iki kanalı ayrı ayrı işledim, süre iki katına çıktı.

Sizin arşivinizde etiket BPM’i ile ses tabanlı ölçüm arasındaki fark hangi türlerde en çok açılıyor? Özellikle remiks ve canlı kayıtlarda ne görüyorsunuz?

0
赞同度 100% · 0 条评论 · 2 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

还没有评论,写下第一条。