Çalma listesi önerilerinde tekrarı parça kimliğiyle değil, klibin kendisiyle engellemek

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

Aynı parçanın farklı sürümleri bir sette iki kez gelince fark ettim: biri albüm master’ı, biri radyo edit’i, biri de bir derlemeden gelen versiyon. Kütüphanede üç ayrı kayıt, üç ayrı dosya adı, aynı şarkı. Elimdeki liste 900 parçaya yaklaşmıştı ve öneri akışında aynı şarkı 12 dakika arayla iki kez çıktı. Dosya adına bakan kontrol bunu göremedi çünkü adlar farklıydı.

Yaptığım şey basit: parçayı dosya adıyla veya yol ile değil, kısa bir ses parmak iziyle temsil etmek. Her dosyadan ilk 30 saniyeyi okuyup 8 kHz’e indiriyorum, sonra 32 karelik bir enerji vektörü çıkarıyorum. Amaç tanıma değil, “bu iki kayıt aynı şeyin kopyası mı” sorusuna hızlı cevap.

import subprocess, numpy as np

def izcik(yol, sn=30, hz=8000):
    ham = subprocess.run(
        ["ffmpeg","-v","quiet","-t",str(sn),"-i",yol,
         "-ac","1","-ar",str(hz),"-f","s16le","-"],
        capture_output=True).stdout
    x = np.frombuffer(ham, dtype=np.int16).astype(np.float32)
    if x.size < hz:
        return None
    kare = x.size // 32
    v = np.array([np.sqrt(np.mean(x[i*kare:(i+1)*kare]**2))
                  for i in range(32)])
    v = v / (np.linalg.norm(v) + 1e-9)
    return v

Karşılaştırma kosinüs benzerliği; 0.97 üstünü aynı kayıt sayıyorum. 900 parçada bu eşik 6 çift yakaladı, hepsi gerçekten aynı şarkının farklı sürümüydü. Farklı sürümler (canlı, remix) genelde 0.85-0.95 arasında kalıyor, yani eşiği yükseltmek ayrımı koruyor. Maliyet: 900 dosya için yaklaşık 40 saniye CPU, sonuç bir sqlite tablosunda duruyor, öneri üretirken tek sorgu.

Neden dosya adı veya etiket yetmiyor: aynı şarkının albüm ve derleme kopyaları çoğu zaman farklı albüm etiketi taşıyor, bazen süre bile 1-2 saniye oynuyor. Süre eşleştirmesi bu yüzden kaçırıyor. Ses parmak izi ise mastering farkına duyarlı ama şarkı kimliğine sadık.

Nerede bozuluyor: sessiz girişli parçalarda ilk 30 saniye neredeyse boş oluyor, vektör gürültüye dönüyor ve iki farklı parça 0.99’a çıkabiliyor. Bunu görünce pencereyi sessizliği atlayacak şekilde kaydırdım; ilk 5 saniyeyi atlayıp sonraki 30 saniyeyi almak daha kararlı oldu. İkinci tuzak: canlı kayıtlarda alkış ilk saniyelerde baskın, bu da benzerliği şişiriyor. Alkışlı kayıtları ayrı işaretleyip eşiği onlar için 0.99’a çektim. Üçüncüsü, 8 kHz’e indirmek bas ağırlıklı parçalarda ayrımı azaltıyor; davul ağırlıklı iki farklı parça 0.96’da takıldı, eşiği 0.97’de tutunca düzeldi.

Bir de şunu ekleyeyim: bu kontrolü öneri üretiminin sonunda değil, aday listesi oluşurken çalıştırıyorum. Sonradan elemek, sıralamayı bozuyor ve kullanıcıya “az önce çalan” hissini veriyor.

Sizin kütüphanenizde aynı şarkının farklı sürümleri ne sıklıkla çıkıyor, ve bunları ayırt ederken süreye mi yoksa sese mi güveniyorsunuz?

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

0 条评论

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

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