3 puan yazan GN⁺ 2024-08-02 | 1 yorum | WhatsApp'ta paylaş
  • SeekTune, Shazam'ın şarkı tanıma algoritmasını uygulayan bir proje olup Spotify ve YouTube API'lerini entegre ederek şarkı bulma ve indirme imkanı sunar
  • Çalıştırmak için Golang, FFmpeg, NPM ve YT-DLP gerekir; sunucu ve istemci Docker Compose veya yerel ortamda çalıştırılabilir
  • Spotify entegrasyonu, geliştirici uygulamasının Client ID ve Client Secret bilgilerinin server/.env içine ayarlanmasıyla yapılır; uygulama gereken erişim belirtecini otomatik olarak alır ve önbelleğe alır
  • Varsayılan veritabanı SQLite'tır; ortam değişkeni olarak DB_TYPE=mongo belirtilirse MongoDB kullanılabilir ve kullanıcı adı/şifre yoksa mongodb://localhost:27017 adresine bağlanır
  • CLI; Spotify bağlantısı indirme, yerel ses kaydetme, kayıt dosyası eşleştirme, parmak izi ve şarkı silmeyi destekler; YouTube ID'si olmayan kayıtlı öğeler frontend'de eşleşme sonucu olarak gösterilmez

Proje genel bakışı

  • SeekTune, Shazam'ın şarkı tanıma algoritmasını uygulayan bir uygulamadır
  • Uygulama, README'nin kaynaklar bölümündeki materyallere dayanır
  • Spotify ve YouTube API'lerini entegre ederek şarkı bulup indirebilir
  • Demo ve yapım süreci bağlantıları sunulur

Kurulum ve çalıştırma yöntemleri

  • Gerekli araçlar Golang, FFmpeg, NPM ve YT-DLP'dir

  • Depoyu klonlama komutları şöyledir

    git clone https://github.com/cgzirim/seek-tune.git
    cd seek-tune
    
  • Spotify API kurulumu

    • Bir Spotify uygulaması oluşturup Client ID ve Client Secret bilgilerini almanız gerekir
    • server dizininde bir .env dosyası oluşturup aşağıdaki değerleri ayarlayın
    SPOTIFY_CLIENT_ID=your-client-id
    SPOTIFY_CLIENT_SECRET=your-client-secret
    
    • Uygulama gereken erişim belirtecini otomatik olarak alır ve önbelleğe alır
  • Docker ile çalıştırma

    • Docker ve Docker Compose gerekir
    • Derleme ve çalıştırma şu komutla yapılır
    docker-compose up --build
    
    • Çalıştırdıktan sonra uygulamaya http://localhost:8080 adresinden erişilir
    • Durdurmak için şu komutu kullanın
    docker-compose down
    
  • Yerel çalıştırma

    • Backend bağımlılıklarını yükleme
    cd server
    go get ./...
    
    • İstemci bağımlılıklarını yükleme
    cd client
    npm install
    

CLI kullanımı

  • İstemci uygulaması client dizininde çalıştırılır
    npm start
    
  • Backend ayrı bir terminalde çalıştırılır
    cd server
    go run *.go serve [-proto <http|https> (default: http)] [-port <port number> (default: 5000)]
    
  • Spotify bağlantısıyla şarkı indirebilirsiniz
    go run *.go download <https://open.spotify.com/.../...>;
    
    • Spotify mobil uygulamasından kopyalanan bağlantılar çalışmaz
    • Masaüstü veya web uygulamasından kopyalanan bağlantıları kullanabilirsiniz
  • Yerel şarkı dosyalarını veya dizinleri veritabanına kaydedebilirsiniz; tüm ses formatları desteklenir
    go run *.go save [-f|--force] <path_to_song_file_or_dir_of_songs>
    
    • -f veya --force, YouTube ID'si bulunamasa bile şarkıyı kaydeder
    • YouTube ID'si yoksa frontend eşleşmeyi göstermez
  • Şarkı veya kayıt dosyaları için eşleşme bulabilirsiniz
    go run *.go find <path-to-wav-file>
    
  • Parmak izi ve şarkı silmeyi destekler
    go run *.go erase
    go run *.go erase db
    go run *.go erase all
    
    • Varsayılan olarak yalnızca veritabanı silinir
    • erase all, veritabanı ile birlikte şarkı dosyalarını da siler
  • *.go çalışmazsa ./... kullanabilirsiniz

Örnek çıktı

  • İndirme örneğinde Spotify parça bilgisi alındıktan sonra parça indirilir ve parmak izi kaydedilir
    $ go run *.go download https://open.spotify.com/track/4pqwGuGu34g8KtfN8LDGZm/…
    Getting track info...
    Now, downloading track...
    Fingerprints saved in MongoDB successfully
    'Voilà' by 'André Rieu' was downloaded
    Total tracks downloaded: 1
    
  • Eşleştirme örneğinde Voilà - André Rieu.wav için en iyi 20 eşleşme ve nihai tahmin çıktılanır
    • En üst sonuç Voilà by André Rieu olup puanı 5390686.00'dır
    • Arama süresi 856.386557ms olarak gösterilir
    • Nihai tahmin de Voilà by André Rieu olarak gösterilir

Veritabanı seçimi

  • Varsayılan veritabanı SQLite'tır
  • MongoDB kullanmak için MongoDB'yi kurup bağlantı ortam değişkenlerini ayarlayın
    • DB_TYPE: MongoDB kullanmak için "mongo" olarak ayarlayın
    • DB_USER: MongoDB kullanıcı adı
    • DB_PASS: MongoDB şifresi
    • DB_NAME: Kullanılacak MongoDB veritabanı adı
    • DB_HOST: MongoDB sunucu ana bilgisayar adı veya IP adresi
    • DB_PORT: MongoDB sunucu port numarası
  • Veritabanı bağlantı URI'si ortam değişkenlerinden oluşturulur
  • DB_USER veya DB_PASS yoksa varsayılan olarak mongodb://localhost:27017 adresine bağlanır

Kaynaklar ve lisans

1 yorum

 
GN⁺ 2024-08-02
Hacker News yorumları
  • Shazam teknolojisinin bir kısmı Stanford kampüsündeki CCRMA’dan çıktı; burası erken dönem bilgisayar tarihiyle de derin bağları olan özel bir yer
    Erken dönem bilgisayar teknolojisi uygulamalarının şaşırtıcı derecede çoğunun sesle ilgili olması ilginç. John Bardeen’in müzik kutusu, transistörün ilk ticari uygulaması olan işitme cihazı, Palo Alto’daki HP garajında yapılan ses osilatörü, iPod’dan doğan iPhone, analog telefon hatlarını taşıyan bakır tellerin üzerine kurulan internet, Bell Labs derken örnekler uzayıp gidiyor
    Belki de insanların önce kHz aralığıyla çalışmayı öğrenip sonra MHz/GHz aralığına geçtiği hipotezi kulağa epey çekici geliyor

    • Sanırım bunun nedeni sesin elektronik olarak nispeten kolay manipüle edilebilmesi
      Ses sinyali nispeten kolayca elektrik sinyaline dönüştürülebiliyor, ama grafik tarafında daha görüntüyü ekranda görünür kılmak bile çok daha karmaşık. Elektrik sinyalini ses dalgasına çeviren hoparlör de temel yapısına bakınca çok basit bir cihaz
      Üstelik ses insanlar üzerinde güçlü bir izlenim bırakıyor; elektronik ya da bilgisayar gücünü göstermek istesem ben de sesi seçerdim
    • Bana fazla zorlama bir bağlantı gibi geldi
  • Bu, Shazam’ın gerçek bir yeniden üretimiyse, en azından Mart 2025’e kadar Apple patenti kapsamında olabilir: https://patents.google.com/patent/US7627477

    • Shazam’ın algoritmayı anlattığı “An Industrial-Strength Audio Search Algorithm” makalesinde (https://www.ee.columbia.edu/~dpwe/papers/Wang03-shazam.pdf) net bir yayın tarihi yok, ancak https://www.researchgate.net/publication/220723446_An_Industrial_Strength_Audio_Search_Algorithm sayfasına bakılırsa 2003 makalesi gibi görünüyor
      Söz konusu patent ABD’de 2004-10-21 tarihinde başvurulmuş. Hukuk uzmanı değilim ama ABD’de bu patent aleyhine dayanak olabilecek gibi duruyor
    • Yaklaşık 10 yıl önce HN’de Shazam’ın algoritmanın yayımlanmasını hukuki olarak tehdit ettiği için popüler bir yazının ya da kaynak kodun kaldırıldığını hatırlıyorum
      Muhtemelen orijinal yazıdaki Google Drive PDF ekran görüntüsü o materyaldi
    • Özünde yapı, ses sinyalinin hızlı Fourier dönüşümünden basit bir parmak izi üretip basit bir indeks ve basit bir benzerlik araması yapmaktan ibaret
      Ancak bu yöntemin çalışması için dünyadaki tüm müziklerin imzasına ihtiyaç var ;)
    • O zaman ABD dışında uygulanmasının zor olduğu anlamına geliyor
    • Yani depoyu şimdi klonlayın diyorsun
  • Shazam’ın kurucu ortağı Avery Wang’in DAFx17’de yaptığı sunum iyiydi
    Algoritmanın teorik arka planına biraz değiniyor ve arka plan gürültüsü gibi gerçek dünya problemlerini de ele alıyor: https://www.youtube.com/watch?v=YVTnj3OIhwI

    • Bunu izleme listeme ekledim. Bu makaleyi okuduğum zaman, hesaplama algoritmalarında ilk kez vay be dediğim anlardan biriydi
  • Son zamanlarda Shazam’ın doğruluğu düşmüş gibi geliyor; hatta SoundHound daha iyi sonuçlar veriyor
    Shazam’da Asya müzik geleneklerine ait çok sayıda sonuç çıkıyor; bu kendi başına iyi, ama sorun yanlış parça olmaları. Seçilecek müzik kapsamını genişlettilerse algoritmayı da geliştirmeleri gerekir gibi; şu anda hash tablosu çakışmaları daha fazla olmuş hissi veriyor
    Referans: https://github.com/cgzirim/not-shazam/…

    • SoundHound her zaman Shazam’dan daha iyiydi. İnsanların söylediği şarkıları ya da çok sessiz parçaları bile yakalayabiliyor
    • Ağustos 2021’de Shazam, SoundHound ve BeatFind’in müzik tanıma kütüphanelerini karşılaştırmıştım
      Sonuç olarak BeatFind ve Shazam en çok parçayı biliyordu, ama birbirlerini tamamlayan yönleri de vardı ve tüm servislerin yalnızca kendilerinin tanıdığı en az bir parça bulunuyordu
      Testte farklı türlerden ve bilinirlik seviyelerinden parçalar karıştırılmıştı, ancak örneklem daha büyük olsaydı daha iyi olurdu. Ayrıca insan konuşması gibi gürültüleri ya da duvarın arkasından gelen filtrelenmiş müziği test etmedim
      İlginçtir, “Night Driver” için “1 Shazams” yazıyordu; muhtemelen onu Shazam’layan ilk kişi bendim. “THEY'RE TAKING THE HOBBITS TO ISENGARD!” içinse herkes hobbitleri nereye götürdüklerini biliyor, ama servislerin hiçbiri tanıyamadı
  • Proje yazması ve düzeltmesi kolay görünüyor ama kişisel olarak henüz yayımlamak için biraz erken olduğunu düşünüyorum
    Çalıştırma talimatları hatalı görünüyor; MongoDB gerekiyor ama bağlantı ve kullanım açıklaması eksik. Mümkünse veritabanını değiştirilebilir yapmak ve sqlite gibi daha az zahmetli bir seçenek sunmak daha iyi olur
    MongoDB'nin yerine başka bir şey koymak mümkün değilse, kolayca çalıştırıp test edebilmek için Dockerfile ve docker compose sağlanmalı. İstemcide npm install sırasında 8 kritik güvenlik açığı çıkıyor; gerçekten sorun olmayabilir ama testi sürdürme konusunda insanı tereddütte bırakıyor
    Patent ya da telif hakkını önemsemeseniz bile adı değiştirmeniz iyi olur. GitHub'ın kendisi ABD'de olduğu için DMCA gelirse projeyi kaldırabilirler
    Son olarak WAV dosyasından parça ekleme özelliği de olsa iyi olur. Test etmek istediğim seslerin hepsi Spotify ya da YouTube'da değil
    Moral bozmak istemiyorum; ama bu tür küçük son rötuşlar eksik olunca insanlar projeyi görmezden gelmeye ya da düşük değerlendirmeye meyilli oluyor. Zamanım olursa PR gönderebilirim; müzik dışı alanlarda ses eşleştirmeyi denemek istiyorum ve bu proje üzerinde değişiklik yapmak en kolayı gibi görünüyor

    • Projenin daha fazla son rötuşa ihtiyaç duyduğuna katılıyorum
      Kurulum talimatlarını iyileştirmeyi, esneklik için dosya tabanlı bir DB ekleme seçeneğini ve npm güvenlik açıklarını gidermeyi önceliklendireceğim. WAV dosyalarını doğrudan parmak izine dönüştürme özelliği de iyi bir fikir; ona öncelikli olarak bakacağım
      Proje adının hukuki riskini de anladım ve değiştireceğim. İyi isim önerileri varsa duymak isterim
    • HN'ye bunu bu tür değerli geri bildirimleri almak için koyuyorum. Güzel özetlemişsin
  • Depoya henüz ayrıntılı bakmadım; arama yapılacak verinin nereden geldiğini merak ediyorum
    Bir kütüphane mi yüklüyor, yoksa bir yerden elde edilmiş büyük bir kütüphane içinde mi arama yapıyor, merak ettim

    • Veri, sunucuya bağlı parmak izi veritabanından geliyor. Her parça eklendiğinde bu parmak izleri oluşturuluyor
  • Böyle bir şeyi mutlaka yapmayı istediğim bir yapılacaklar listem vardı; gerçekten harika

    • İlham vermesine sevindim. Klonlayıp daha da geliştirebilirsin
  • Parmak izlerini topluluk temelli paylaşmanın bir yolu olsa epey iyi olurdu

    • Sadece ses için değil, görüntüler ve video klipler için de böyle bir yöntem olsa iyi olurdu
      Hatırladığım kadarıyla BitTorrent dağıtık hash tablosu kullanıyor, ama hash tüm içerik üzerinden olduğu için kaynak gösterimi berbat olan türev işlerin aslını bulmak için pek kullanışlı değil
      Görsellerin orijinalini bulmada Tineye bazen işe yarıyor
    • MusicBrainz bunu destekliyor gibi görünüyor: https://musicbrainz.org/doc/AcoustID
  • Spotify parçaları ekleniyorsa, sonucu da Spotify parçası olarak döndürmek daha doğal olmaz mı?

    • Aslında doğrusu bu. Ancak Spotify doğrudan indirmeye izin vermediği için parçayı YouTube'da bulup indirmek zorunda kaldım
  • Google telefonlarda yerleşik bir müzik tanıma özelliği var ve bu alandaki en iyi uygulamalardan biri olduğunu duymuştum
    Hangi yaklaşımı kullandığını bilen var mı merak ediyorum. Ayrı olarak, SoundHound'un Shazam'dan daha iyi olduğunu hep düşünmüşümdür

    • Hatırladığım kadarıyla yalnızca müzik çalarken uyandıran küçük bir algoritma ya da donanım parçası vardı
      Böylece telefonun sürekli aktif olması gerekmiyor; ondan sonra da mevcut algılama algoritmalarından herhangi biri kullanılabilirdi. Bana o ultra düşük güç aşaması sihir gibi gelmişti ama ayrıntılarını hiç okumadım