Kendi arşivimde, 4.200 kadar dosyalık bir klasörde, çalma listesi önerisi üretirken şu durumla karşılaştım: bazı parçalar listede çok erken başlıyor gibi duruyordu, ama dosya süreleri doğruydu. Sorun, klibin ilk saniyesindeki sessizlik veya çok düşük seviyeli girişlerdi. Öneri sırasında sıralamayı dosya süresine göre yapıyordum, bu yüzden ilk saniyesi neredeyse sessiz olan bir parça, gerçekte olduğundan daha kısa görünüyordu. 4.200 dosyanın yaklaşık 300’ünde bu durum vardı; hepsi aynı albümden değil, farklı kaynaklardan geliyordu.
Önce her dosyanın ilk 1 saniyesini ffmpeg ile ölçtüm. Kullandığım komut şu:
for f in *.flac; do
ffmpeg -hide_banner -loglevel error -t 1 -i "$f" -af volumedetect -f null - 2>&1 | awk -v file="$f" '/mean_volume/ {print file, $NF}'
done
Bu bana her dosya için ortalama ses seviyesini dB cinsinden verdi. Sonra bu değeri bir eşikle karşılaştırdım: -50 dB’nin altındaki dosyaları “sessiz giriş” olarak işaretledim. Ancak bu eşiği doğrudan kullanmak yerine, öneri sıralamasında dosya süresine bu sessiz kısmı ekleyerek düzelttim. Yani efektif süre = dosya süresi - sessiz giriş süresi. Bunu yapmak için önce sessizliğin ne kadar sürdüğünü de ölçmem gerekti:
ffmpeg -hide_banner -loglevel error -i "$f" -af silencedetect=noise=-50dB:d=0.2 -f null - 2>&1 | awk '/silence_end/ {print $5}'
Bu komut, -50 dB eşiğinin altındaki sessizliğin bittiği zamanı veriyor. Eğer çıktı boşsa, dosyanın başında belirgin bir sessizlik yok demektir. Bu iki ölçümü birleştirip 300 dosya için düzeltilmiş süreleri hesapladım ve öneri sıralamasında kullandım.
Bunu neden yaptım? Çünkü çalma listesi önerisinde sıralama, dinleyicinin algıladığı süreye yakın olmalı. Bir parçanın ilk 1,5 saniyesi sessizse, dinleyici onu 1,5 saniye geç başlamış gibi algılıyor; dosya süresi ise bunu gizliyor. Alternatif, tüm dosyaları yeniden kodlamak olurdu ama bu hem yavaş hem de arşivi bozma riski taşıyor. Ölçüm yapmak, kodlamaya göre çok daha hafif; 4.200 dosyada toplam süre yaklaşık 6 dakika sürdü. Ancak her dosya için iki ffmpeg çağrısı yapmak, disk G/Ç’sini artırıyor; ben bunu gece çalıştırdım.
Bu yöntem nerede işe yaramaz? Öncelikle, sessizlik eşiği sabit: -50 dB. Çok sessiz kayıtlarda (örneğin oda kaydı akustik parçalar) bu eşik yanlış pozitif verebilir; parçanın doğal girişini sessizlik sanabilir. Ben bu yüzden yalnızca ilk 1 saniyeye baktım, ama yine de birkaç caz kaydında yanlış işaretleme oldu. İkincisi, silencedetect’in çıktısını awk ile ayrıştırmak kırılgan; ffmpeg sürümüne göre alan sırası değişebilir. Kendi makinemde ffmpeg 6.1 kullandım, başka sürümde test etmedim. Üçüncüsü, bu yöntem yalnızca başlangıç sessizliğini ölçüyor; parçanın sonundaki sessizlik veya fade-out süreyi etkiliyorsa onu ayrıca ölçmek gerekir. Son olarak, bazı dosyalarda ilk saniyede çok düşük seviyeli bir gürültü varsa (örneğin eski kaset kayıtları), mean_volume -50 dB’nin üzerinde çıkabilir ve sessizlik hiç yakalanmaz.
Benim için bu düzeltme, öneri listesinde ilk 10’a giren parçaların sırasını gözle görülür şekilde değiştirdi; özellikle yavaş girişli parçalar artık daha geç sıralanıyor. Peki sizin arşivinizde, bir parçanın ilk saniyesindeki sessizliği ölçmek için hangi eşiği kullanıyorsunuz ve bu eşiği tür bazında değiştiriyor musunuz? Ben tek eşikle çalışıyorum ama caz ve klasik kayıtlarda bunun yetersiz kaldığını fark ettim.


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