NotShazam - Go diliyle yeniden oluşturulan Shazam algoritması
(github.com/cgzirim)- 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/.enviç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=mongobelirtilirse MongoDB kullanılabilir ve kullanıcı adı/şifre yoksamongodb://localhost:27017adresine 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
serverdizininde bir.envdosyası 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:8080adresinden 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ı
clientdizininde çalıştırılırnpm 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>-fveya--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.waviçin en iyi 20 eşleşme ve nihai tahmin çıktılanır- En üst sonuç
Voilà by André Rieuolup puanı5390686.00'dır - Arama süresi
856.386557msolarak gösterilir - Nihai tahmin de
Voilà by André Rieuolarak gösterilir
- En üst sonuç
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ınDB_USER: MongoDB kullanıcı adıDB_PASS: MongoDB şifresiDB_NAME: Kullanılacak MongoDB veritabanı adıDB_HOST: MongoDB sunucu ana bilgisayar adı veya IP adresiDB_PORT: MongoDB sunucu port numarası
- Veritabanı bağlantı URI'si ortam değişkenlerinden oluşturulur
DB_USERveyaDB_PASSyoksa varsayılan olarakmongodb://localhost:27017adresine bağlanır
Kaynaklar ve lisans
- How does Shazam work - Coding Geek: ana kaynak
- Song recognition using audio fingerprinting
- How does Shazam work - Toptal
- Creating Shazam in Java
- Proje MIT License ile dağıtılmaktadır
1 yorum
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
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
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
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
Muhtemelen orijinal yazıdaki Google Drive PDF ekran görüntüsü o materyaldi
Ancak bu yöntemin çalışması için dünyadaki tüm müziklerin imzasına ihtiyaç var ;)
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
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/…
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 installsırasında 8 kritik güvenlik açığı çıkıyor; gerçekten sorun olmayabilir ama testi sürdürme konusunda insanı tereddütte bırakıyorPatent 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
Kurulum talimatlarını iyileştirmeyi, esneklik için dosya tabanlı bir DB ekleme seçeneğini ve
npmgü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ğımProje adının hukuki riskini de anladım ve değiştireceğim. İyi isim önerileri varsa duymak isterim
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
Böyle bir şeyi mutlaka yapmayı istediğim bir yapılacaklar listem vardı; gerçekten harika
Parmak izlerini topluluk temelli paylaşmanın bir yolu olsa epey 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
Spotify parçaları ekleniyorsa, sonucu da Spotify parçası olarak döndürmek daha doğal olmaz 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
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