Çalma listesi önerilerinde geçişleri klibin son 8 saniyesinden ölçmek

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

Geçen hafta 320 parçalık bir indie/elektronik arşivden 45 dakikalık bir set kurdum. Parçaların çoğu 2015 sonrası, bir kısmı Bandcamp’ten indirilmiş FLAC, bir kısmı stream’den kaydedilmiş 256 kbps AAC. Sorun şuydu: kütüphanedeki süreler ile sette duyduğum geçişler tutmuyordu. Özellikle fade-out’lu parçalarda öneri motoru bir sonraki parçayı 3-4 saniye erken ya da geç başlatıyordu. Bunu parça süresine bakarak çözmeye çalışmak boşa gitti; süreler doğruydu, sorun geçişin nerede bittiğiydi.

Kendi çözümüm, her parçanın son 8 saniyesindeki RMS zarfını çıkarıp “pratik bitiş” noktasını hesaplamak oldu. ffmpeg ile klibi kırpıp Python’da okuyorum:

ffmpeg -sseof -8 -i "$track" -ac 1 -ar 8000 -f f32le - 2>/dev/null \
  | python3 -c "import sys,struct,math; d=sys.stdin.buffer.read(); n=len(d)//4; \
  v=struct.unpack(f'{n}f',d); w=800; \
  print([round(20*math.log10(math.sqrt(sum(x*x for x in v[i:i+w])/w)+1e-9),1) for i in range(0,n-w,w)])"

Çıkan dB dizisinde son anlamlı seviyenin altına düşülen ilk pencereyi bitiş kabul ediyorum; eşik olarak parçanın kendi ortalama seviyesinin 18 dB altını alıyorum, sabit bir dB değeri değil. Sonra bu bitişi setin zaman çizelgesine yazıp geçişleri oraya oturtuyorum.

Neden böyle: süre metadata’sı dosyanın ne kadar sürdüğünü söyler, ne zaman duyulmaya değer kaldığını söylemez. Son 8 saniyeye bakmak ucuz; tüm parçayı çözmek 320 parçada dakikalar alıyordu, 8 saniye ise saniyeler. Karşılığında bazı parçalarda yanılıyorum: ambient parçalarda seviye zaten çok yavaş düşüyor, eşik hiç tetiklenmiyor ve bitişi parçanın sonuna yapıştırıyorum. Canlı kayıtlarda alkış yüzünden son 8 saniye hiç susmuyor; orada bu yöntem işe yaramıyor, elle işaretlemek gerekiyor. Bir de 128 kbps MP3’lerde codec gürültüsü eşiğin altında kalıyor gibi görünüp yanlış erken bitiş veriyor; o yüzden 192 kbps altındaki dosyaları bu hesaptan çıkarıp süreyle yetiniyorum. Kendi hatam: ilk denemede pencere boyunu 2000 örnek yapmıştım, geçiş noktaları 0.5 saniye kaydı; 800 örnek (8 kHz’de 100 ms) benim setlerim için yeterli geldi.

Sizin arşivinizde fade-out yerine sert kesmeyle biten parçalar ne kadar? Onlarda eşiği nasıl seçiyorsunuz?

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

0 条评论

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

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