Geçen hafta kendi arşivimden 1.100 parçalık bir havuzla, 40 dakikalık tek bir set çıkarmayı denedim. Ortam sıradan: dizüstü, yerel dosyalar, harici bir ses kartı yok. Öneri motoru parça seçiminde iyi görünüyordu ama seti baştan sona dinlediğimde 12. dakikada tempo düşüyor, 25. dakikada aynı tını iki kez geliyordu. Sorun parçalar değil, sıralamaydı.
Önce her parça için üç sayı çıkardım: BPM, enerji (0–1) ve tını parmak izi. BPM’yi hazır etiketlerden almadım; dosya adlarında tutarsızdı. Yerel bir analiz betiğiyle yeniden ölçtüm:
for f in *.wav; do
ffmpeg -i "$f" -af "ebur128=peak=true" -f null - 2>&1 | grep -E "I:|LRA:" >> loudness.txt
done
Sonra sıralamayı bir grafik problemi gibi kurdum: her parça bir düğüm, ardışık çalınabilirlik maliyeti |ΔBPM|/10 + |Δenerji|*3 + tını mesafesi. Python tarafında küçük bir greedy çözücü yeterli oldu, tam çözücüye gerek kalmadı:
sira = [baslangic]
while len(sira) < len(parcalar):
son = sira[-1]
aday = min((p for p in parcalar if p not in sira),
key=lambda p: abs(p.bpm-son.bpm)/10 + abs(p.enerji-son.enerji)*3 + tinimesafe(p, son))
sira.append(aday)
Bunu seçmemin nedeni basit: set dinlerken insan kulağı mutlak BPM’ye değil geçişin pürüzsüzlüğüne bakıyor. Maliyet fonksiyonunda enerjiye 3 katsayısı vermek, 8 BPM’lik bir sıçramanın enerji farkıyla telafi edilmesini engelliyor. Takas şu: greedy her zaman global olarak en iyi seti vermiyor, özellikle havuzun sonunda elimde sadece yüksek enerjili parçalar kalırsa set monotonlaşıyor. 1.100 parçada bunu 3 kez yaşadım; çözüm olarak son 5 parçayı baştan ayırıp ayrı bir kapanış havuzu yaptım.
Bir başka sınır: tını parmak izini kısa örneklerden çıkardığım için canlı kayıtlarda ve uzun girişlerde yanılıyor. Caz parçalarında ilk 30 saniye neredeyse sessiz olabiliyor; bu yüzden analizi parçanın ortasından 20 saniyelik bir pencereye kaydırdım. Ayrıca BPM’si sabit olmayan (rubato) parçaları bu boru hattına hiç sokmuyorum, elle yerleştiriyorum.
Sizin havuzunuzda geçiş maliyetine hangi terimi koyuyorsunuz; tını mı, enerji mi, yoksa tamamen başka bir şey mi?


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