NotShazam - Algoritme Shazam yang direkonstruksi dalam bahasa Go
(github.com/cgzirim)- SeekTune adalah proyek yang mengimplementasikan algoritme pengenalan lagu Shazam, serta mengintegrasikan API Spotify dan YouTube agar dapat mencari dan mengunduh lagu
- Untuk menjalankannya dibutuhkan Golang, FFmpeg, NPM, dan YT-DLP, dan server serta klien dapat dijalankan dengan Docker Compose atau di lingkungan native
- Integrasi Spotify dilakukan dengan mengatur Client ID dan Client Secret dari aplikasi developer di
server/.env, sementara aplikasi akan otomatis mengambil dan menyimpan cache access token yang diperlukan - Basis data default adalah SQLite, dan jika
DB_TYPE=mongoditentukan melalui environment variable maka MongoDB dapat digunakan; bila tidak ada nama pengguna atau kata sandi, koneksi dilakukan kemongodb://localhost:27017 - CLI mendukung pengunduhan tautan Spotify, penyimpanan audio lokal, pencocokan file rekaman, serta penghapusan fingerprint dan lagu; item tersimpan tanpa YouTube ID tidak akan ditampilkan sebagai hasil pencocokan di frontend
Ikhtisar proyek
- SeekTune adalah aplikasi yang mengimplementasikan algoritme pengenalan lagu Shazam
- Implementasinya didasarkan pada materi di bagian resource pada README
- API Spotify dan YouTube diintegrasikan untuk mencari dan mengunduh lagu
- Tautan demo dan proses pembuatannya disediakan
Instalasi dan cara menjalankan
-
Alat yang diperlukan adalah Golang, FFmpeg, NPM, dan YT-DLP
-
Perintah untuk meng-clone repositori adalah sebagai berikut
git clone https://github.com/cgzirim/seek-tune.git cd seek-tune -
Pengaturan API Spotify
- Anda perlu membuat aplikasi Spotify dan mendapatkan Client ID serta Client Secret
- Buat file
.envdi direktoriserverlalu atur nilai berikut
SPOTIFY_CLIENT_ID=your-client-id SPOTIFY_CLIENT_SECRET=your-client-secret- Aplikasi akan otomatis mengambil dan menyimpan cache access token yang diperlukan
-
Menjalankan dengan Docker
- Docker dan Docker Compose diperlukan
- Build dan menjalankannya dilakukan dengan perintah berikut
docker-compose up --build- Setelah dijalankan, aplikasi dapat diakses di
http://localhost:8080 - Untuk menghentikannya gunakan perintah berikut
docker-compose down -
Menjalankan secara native
- Instal dependensi backend
cd server go get ./...- Instal dependensi klien
cd client npm install
Cara penggunaan CLI
- Aplikasi klien dijalankan dari direktori
clientnpm start - Backend dijalankan di terminal terpisah
cd server go run *.go serve [-proto <http|https> (default: http)] [-port <port number> (default: 5000)] - Anda dapat mengunduh lagu dengan tautan Spotify
go run *.go download <https://open.spotify.com/.../...>- Tautan yang disalin dari aplikasi mobile Spotify tidak berfungsi
- Anda dapat menggunakan tautan yang disalin dari aplikasi desktop atau web
- File lagu lokal atau direktori dapat disimpan ke basis data, dan semua format audio didukung
go run *.go save [-f|--force] <path_to_song_file_or_dir_of_songs>-fatau--forceakan menyimpan lagu meski YouTube ID tidak ditemukan- Tanpa YouTube ID, frontend tidak akan menampilkan hasil pencocokan
- Anda dapat mencari kecocokan untuk lagu atau file rekaman
go run *.go find <path-to-wav-file> - Mendukung penghapusan fingerprint dan lagu
go run *.go erase go run *.go erase db go run *.go erase all- Default-nya hanya basis data yang dihapus
erase allmenghapus basis data beserta file lagu
- Jika
*.gotidak berfungsi, Anda dapat menggunakan./...
Contoh output
- Contoh unduhan mengambil informasi track Spotify, lalu mengunduh track dan menyimpan fingerprint
$ 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 - Contoh pencocokan menampilkan 20 hasil teratas dan prediksi akhir untuk
Voilà - André Rieu.wav- Hasil teratas adalah
Voilà by André Rieudengan skor5390686.00 - Waktu pencarian ditampilkan sebagai
856.386557ms - Prediksi akhirnya juga ditampilkan sebagai
Voilà by André Rieu
- Hasil teratas adalah
Pilihan basis data
- Basis data default adalah SQLite
- Untuk menggunakan MongoDB, instal MongoDB lalu atur environment variable koneksinya
DB_TYPE: setel ke"mongo"untuk menggunakan MongoDBDB_USER: nama pengguna MongoDBDB_PASS: kata sandi MongoDBDB_NAME: nama basis data MongoDB yang akan digunakanDB_HOST: hostname atau alamat IP server MongoDBDB_PORT: nomor port server MongoDB
- URI koneksi basis data dibentuk dari environment variable
- Jika
DB_USERatauDB_PASStidak ada, secara default koneksi dilakukan kemongodb://localhost:27017
Referensi dan lisensi
- How does Shazam work - Coding Geek: resource utama
- Song recognition using audio fingerprinting
- How does Shazam work - Toptal
- Creating Shazam in Java
- Proyek ini didistribusikan dengan MIT License
1 komentar
Komentar Hacker News
Sebagian teknologi Shazam berasal dari CCRMA di kampus Stanford, tempat yang istimewa dan juga sangat terkait dengan sejarah awal komputer
Menarik bahwa begitu banyak penerapan awal teknologi komputer justru berkaitan dengan audio. Contohnya berlanjut dari kotak musik John Bardeen, alat bantu dengar yang menjadi aplikasi komersial pertama transistor, osilator audio yang dibuat di garasi HP di Palo Alto, iPod yang berlanjut menjadi iPhone, internet yang dibangun di atas kabel tembaga yang dahulu membawa saluran telepon analog, hingga Bell Labs
Mungkin hipotesis bahwa manusia lebih dulu belajar menangani rentang kHz lalu beralih ke rentang MHz/GHz juga terdengar cukup menarik
Sinyal audio cukup mudah diubah menjadi sinyal listrik, sedangkan grafis jauh lebih rumit bahkan mulai dari menampilkannya di layar. Speaker yang mengubah sinyal listrik menjadi gelombang suara juga, jika dilihat dari struktur intinya, adalah perangkat yang sangat sederhana
Selain itu, karena audio memberi kesan yang kuat pada manusia, saya pun kemungkinan akan memilih audio jika ingin menunjukkan kemampuan elektronika atau komputer
Jika ini benar-benar reproduksi Shazam yang sesungguhnya, setidaknya hingga Maret 2025 mungkin masih berada di bawah paten Apple: https://patents.google.com/patent/US7627477
Paten tersebut diajukan di AS pada 2004-10-21. Saya bukan ahli hukum, tetapi di AS ini tampaknya bisa menjadi dasar yang merugikan paten tersebut
Mungkin tangkapan PDF Google Drive yang ada di artikel asli adalah materi itu
Hanya saja, agar cara ini bekerja, Anda memerlukan tanda tangan untuk seluruh musik di planet ini ;)
Presentasi salah satu pendiri Shazam, Avery Wang, di DAFx17 cukup bagus
Ia sedikit membahas latar belakang teoretis algoritmenya, dan juga melihat masalah nyata seperti kebisingan latar: https://www.youtube.com/watch?v=YVTnj3OIhwI
Belakangan akurasi Shazam terasa menurun, dan justru SoundHound memberi hasil yang lebih baik
Di Shazam, cukup banyak hasil yang berasal dari tradisi musik Asia, yang sebenarnya bagus, tetapi masalahnya lagu yang dikembalikan itu salah. Jika cakupan musik yang dicocokkan diperluas, algoritmenya mungkin juga perlu ditingkatkan, dan sekarang rasanya tabrakan hash table lebih sering terjadi
Referensi: https://github.com/cgzirim/not-shazam/…
Kesimpulannya, BeatFind dan Shazam mengetahui lagu paling banyak, tetapi keduanya juga saling melengkapi, dan setiap layanan setidaknya punya satu lagu yang hanya bisa dikenali olehnya sendiri
Pengujian itu mencampurkan lagu dari berbagai genre dan tingkat kepopuleran, tetapi akan lebih baik jika jumlah sampelnya lebih besar. Saya juga tidak menguji kebisingan seperti suara orang berbicara atau musik teredam yang terdengar dari balik dinding
Lucunya, “Night Driver” muncul dengan keterangan “1 Shazams”, jadi mungkin saya orang pertama yang men-Shazam lagu itu, dan “THEY'RE TAKING THE HOBBITS TO ISENGARD!”—ke mana hobbit dibawa semua orang tahu, tetapi tak satu pun layanan bisa mengenalinya
Proyeknya terlihat enak untuk dipakai dan dimodifikasi, tetapi menurut saya pribadi masih agak terlalu dini untuk dipublikasikan
Panduan cara menjalankannya tampak kurang akurat, dan meskipun MongoDB diperlukan, penjelasan tentang cara koneksi dan penggunaannya tidak ada. Kalau memungkinkan, sebaiknya DB dibuat bisa diganti dan menyediakan opsi yang bebannya lebih ringan seperti sqlite
Jika MongoDB tidak bisa digantikan, sebaiknya sediakan Dockerfile dan docker compose agar mudah dijalankan dan diuji. Di
npm installpada klien muncul 8 kerentanan kritis; mungkin itu sebenarnya bukan masalah, tetapi tetap membuat orang ragu untuk melanjutkan pengujianBahkan kalau tidak terlalu memikirkan paten atau hak cipta, sebaiknya namanya diganti. GitHub sendiri berada di AS, jadi kalau ada DMCA masuk, proyeknya bisa diturunkan
Terakhir, akan bagus juga kalau ada fitur untuk menambahkan lagu dari file WAV. Tidak semua audio yang ingin diuji ada di Spotify atau YouTube
Bukan bermaksud menjatuhkan, tetapi kalau penyelesaian kecil seperti ini kurang rapi, orang jadi mudah mengabaikan atau menilai rendah proyeknya. Kalau sempat, saya mungkin akan kirim PR, dan karena saya ingin bereksperimen dengan pencocokan audio di luar ranah musik, proyek ini terlihat paling mudah untuk dimodifikasi
Saya akan memperbaiki panduan konfigurasi, memprioritaskan opsi penambahan DB berbasis file demi fleksibilitas, serta menangani kerentanan
npm. Fitur untuk langsung membuat fingerprint dari file WAV juga ide yang bagus, jadi akan saya prioritaskanSaya juga paham risiko hukum dari nama proyek ini dan berencana menggantinya. Kalau ada usulan nama yang bagus, saya ingin mendengarnya
Saya belum melihat repositorinya secara mendalam, tetapi saya penasaran datanya berasal dari mana untuk pencarian
Apakah memuat pustaka sendiri, atau mencari di pustaka besar yang didapat dari tempat lain?
Saya punya bucket list untuk suatu hari membuat hal seperti ini, keren sekali
Kalau ada cara untuk berbagi fingerprint secara berbasis komunitas, sepertinya akan cukup bagus
Kalau saya ingat benar, BitTorrent memakai distributed hash table, tetapi hash-nya berdasarkan keseluruhan konten, jadi kurang berguna untuk mencari karya asli dari turunan yang atribusi sumbernya berantakan
Untuk mencari sumber asli gambar, Tineye kadang lumayan berguna
Kalau memasukkan lagu Spotify, bukankah lebih alami kalau hasilnya juga dikeluarkan sebagai lagu Spotify?
Ponsel Google punya fitur pengenal musik bawaan, dan saya pernah dengar implementasinya yang terbaik di bidang ini
Saya penasaran apakah ada yang tahu pendekatan apa yang dipakai. Terpisah dari itu, saya selalu merasa SoundHound lebih baik daripada Shazam
Jadi ponselnya tidak perlu selalu aktif, dan setelah itu kemungkinan bisa memakai algoritme deteksi yang sudah ada. Bagi saya tahap berdaya ultra-rendah itu terasa seperti sihir, tetapi saya belum pernah membaca detailnya