NotShazam - Thuật toán Shazam được tái cấu trúc bằng Go
(github.com/cgzirim)- SeekTune là dự án triển khai thuật toán nhận diện bài hát của Shazam, tích hợp API Spotify và YouTube để có thể tìm và tải bài hát
- Để chạy cần Golang, FFmpeg, NPM, YT-DLP; có thể chạy server và client bằng Docker Compose hoặc trong môi trường native
- Tích hợp Spotify được thực hiện bằng cách thiết lập Client ID và Client Secret của ứng dụng developer trong
server/.env; ứng dụng tự động lấy và cache access token cần thiết - Cơ sở dữ liệu mặc định là SQLite; nếu chỉ định
DB_TYPE=mongobằng biến môi trường thì có thể dùng MongoDB, và nếu không có user/mật khẩu thì kết nối tớimongodb://localhost:27017 - CLI hỗ trợ tải từ liên kết Spotify, lưu audio cục bộ, khớp file ghi âm, xóa fingerprint và bài hát; các mục đã lưu không có YouTube ID sẽ không được hiển thị như kết quả khớp ở frontend
Tổng quan dự án
- SeekTune là ứng dụng triển khai thuật toán nhận diện bài hát của Shazam
- Việc triển khai dựa trên các tài liệu trong phần tài nguyên của README
- Tích hợp API Spotify và YouTube để có thể tìm và tải bài hát
- Có cung cấp liên kết demo và quá trình xây dựng
Cách cài đặt và chạy
-
Các công cụ cần thiết là Golang, FFmpeg, NPM, YT-DLP
-
Lệnh clone repository như sau
git clone https://github.com/cgzirim/seek-tune.git cd seek-tune -
Thiết lập Spotify API
- Cần tạo ứng dụng Spotify và lấy Client ID cùng Client Secret
- Tạo file
.envtrong thư mụcservervà thiết lập các giá trị sau
SPOTIFY_CLIENT_ID=your-client-id SPOTIFY_CLIENT_SECRET=your-client-secret- Ứng dụng tự động lấy và cache access token cần thiết
-
Chạy bằng Docker
- Cần Docker và Docker Compose
- Build và chạy bằng lệnh sau
docker-compose up --build- Sau khi chạy, có thể truy cập ứng dụng tại
http://localhost:8080 - Dùng lệnh sau để dừng
docker-compose down -
Chạy native
- Cài đặt dependency cho backend
cd server go get ./...- Cài đặt dependency cho client
cd client npm install
Cách dùng CLI
- Ứng dụng client được chạy trong thư mục
clientnpm start - Backend chạy trong một terminal riêng
cd server go run *.go serve [-proto <http|https> (default: http)] [-port <port number> (default: 5000)] - Có thể tải bài hát bằng liên kết Spotify
go run *.go download <https://open.spotify.com/.../...>- Liên kết sao chép từ ứng dụng Spotify mobile không hoạt động
- Có thể dùng liên kết sao chép từ ứng dụng desktop hoặc web
- Có thể lưu file bài hát cục bộ hoặc thư mục vào cơ sở dữ liệu, hỗ trợ mọi định dạng audio
go run *.go save [-f|--force] <path_to_song_file_or_dir_of_songs>-fhoặc--forcesẽ lưu bài hát ngay cả khi không tìm được YouTube ID- Nếu không có YouTube ID, frontend sẽ không hiển thị kết quả khớp
- Có thể tìm kết quả khớp cho bài hát hoặc file ghi âm
go run *.go find <path-to-wav-file> - Hỗ trợ xóa fingerprint và bài hát
go run *.go erase go run *.go erase db go run *.go erase all- Mặc định chỉ xóa cơ sở dữ liệu
erase allxóa cả cơ sở dữ liệu lẫn file bài hát
- Nếu
*.gokhông hoạt động, có thể dùng./...
Ví dụ output
- Ví dụ tải xuống lấy thông tin track Spotify, sau đó tải track và lưu 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 - Ví dụ khớp in ra 20 kết quả khớp hàng đầu và dự đoán cuối cùng cho
Voilà - André Rieu.wav- Kết quả cao nhất là
Voilà by André Rieuvới điểm số5390686.00 - Thời gian tìm kiếm được hiển thị là
856.386557ms - Dự đoán cuối cùng cũng được hiển thị là
Voilà by André Rieu
- Kết quả cao nhất là
Lựa chọn cơ sở dữ liệu
- Cơ sở dữ liệu mặc định là SQLite
- Để dùng MongoDB, hãy cài đặt MongoDB và thiết lập các biến môi trường kết nối
DB_TYPE: đặt thành"mongo"để dùng MongoDBDB_USER: tên người dùng MongoDBDB_PASS: mật khẩu MongoDBDB_NAME: tên cơ sở dữ liệu MongoDB sẽ dùngDB_HOST: hostname hoặc địa chỉ IP của server MongoDBDB_PORT: số cổng của server MongoDB
- URI kết nối cơ sở dữ liệu được cấu thành từ các biến môi trường
- Nếu không có
DB_USERhoặcDB_PASS, mặc định sẽ kết nối tớimongodb://localhost:27017
Tài liệu tham khảo và giấy phép
- How does Shazam work - Coding Geek: tài nguyên chính
- Song recognition using audio fingerprinting
- How does Shazam work - Toptal
- Creating Shazam in Java
- Dự án được phát hành theo MIT License
1 bình luận
Ý kiến Hacker News
Một phần công nghệ của Shazam xuất phát từ CCRMA trong khuôn viên Stanford, một nơi đặc biệt cũng gắn bó sâu sắc với lịch sử máy tính thời kỳ đầu
Điều thú vị là có rất nhiều trường hợp ứng dụng ban đầu của công nghệ máy tính lại liên quan đến âm thanh. Từ hộp nhạc của John Bardeen, máy trợ thính là ứng dụng thương mại đầu tiên của transistor, bộ dao động âm thanh được chế tạo trong gara HP ở Palo Alto, iPhone tiếp nối từ iPod, Internet được xây dựng trên những sợi dây đồng từng dùng để truyền đường dây điện thoại analog, cho tới Bell Labs, ví dụ cứ thế nối dài
Thậm chí giả thuyết rằng loài người học cách xử lý vùng kHz trước rồi mới chuyển sang vùng MHz/GHz cũng nghe khá cuốn hút
Tín hiệu âm thanh có thể chuyển thành tín hiệu điện khá dễ dàng, trong khi đồ họa thì phức tạp hơn nhiều ngay từ khâu hiển thị lên màn hình. Loa chuyển tín hiệu điện thành sóng âm, xét ở cấu trúc cốt lõi, cũng là một thiết bị rất đơn giản
Hơn nữa, âm thanh tạo ấn tượng mạnh với con người, nên nếu là tôi và muốn phô diễn sức mạnh của điện tử hay máy tính, có lẽ tôi cũng sẽ chọn âm thanh
Nếu đây đúng là một bản tái hiện thực sự của Shazam, thì ít nhất đến tháng 3 năm 2025 nó vẫn có thể còn nằm dưới bằng sáng chế của Apple: https://patents.google.com/patent/US7627477
Bằng sáng chế đó được nộp tại Mỹ vào 2004-10-21. Tôi không phải chuyên gia pháp lý, nhưng ở Mỹ điều này có vẻ có thể là căn cứ bất lợi cho bằng sáng chế đó
Có lẽ ảnh chụp PDF trên Google Drive trong bài gốc chính là tài liệu đó
Dù vậy, để cách này hoạt động thì bạn cần chữ ký của toàn bộ âm nhạc trên Trái Đất ;)
Bài trình bày của đồng sáng lập Shazam Avery Wang tại DAFx17 khá hay
Nó đề cập một chút đến nền tảng lý thuyết của thuật toán, đồng thời xem xét cả các vấn đề thực tế như tiếng ồn nền: https://www.youtube.com/watch?v=YVTnj3OIhwI
Gần đây có vẻ độ chính xác của Shazam giảm đi, và SoundHound lại cho kết quả tốt hơn
Trên Shazam thường hiện ra nhiều kết quả thuộc truyền thống âm nhạc châu Á, bản thân điều đó thì tốt, nhưng vấn đề là toàn sai bài. Nếu họ đã mở rộng phạm vi nhạc mục tiêu thì có lẽ cũng phải cải thiện thuật toán, còn hiện tại tôi có cảm giác va chạm bảng băm xảy ra nhiều hơn
Tham khảo: https://github.com/cgzirim/not-shazam/…
Kết luận là BeatFind và Shazam biết nhiều bài nhất, nhưng chúng cũng có tính bổ sung cho nhau, và mọi dịch vụ đều có ít nhất một bài mà chỉ riêng nó nhận ra
Bài test có trộn các ca khúc từ nhiều thể loại và mức độ nổi tiếng khác nhau, nhưng sẽ tốt hơn nếu cỡ mẫu lớn hơn. Ngoài ra tôi cũng không thử tiếng ồn như giọng nói của con người hay nhạc bị lọc khi nghe xuyên qua tường
Thú vị là “Night Driver” hiện “1 Shazams”, nên có lẽ tôi là người đầu tiên Shazam nó, còn “THEY'RE TAKING THE HOBBITS TO ISENGARD!” thì ai cũng biết họ đang đưa lũ hobbit đi đâu, nhưng không dịch vụ nào nhận ra được
Dự án có vẻ dễ dùng và dễ chỉnh sửa, nhưng cá nhân tôi thấy vẫn hơi sớm để công khai
Hướng dẫn chạy có vẻ chưa chính xác, và tuy cần MongoDB nhưng lại thiếu phần giải thích cách kết nối và sử dụng. Nếu có thể thì nên thiết kế để có thể thay DB, và cung cấp lựa chọn nhẹ gánh hơn như sqlite
Nếu không thể thay MongoDB, thì nên cung cấp Dockerfile và docker compose để có thể dễ dàng chạy và thử nghiệm. Ở bước
npm installcủa client xuất hiện 8 lỗ hổng nghiêm trọng; có thể thực tế không thành vấn đề, nhưng vẫn khiến người ta ngần ngại tiếp tục thửDù không bận tâm đến bằng sáng chế hay bản quyền thì cũng nên đổi tên. Bản thân GitHub nằm ở Mỹ, nên nếu có DMCA gửi đến thì dự án có thể bị gỡ xuống
Cuối cùng, sẽ rất tốt nếu có thêm tính năng thêm bài hát từ tệp WAV. Không phải mọi audio tôi muốn thử đều có trên Spotify hay YouTube
Không phải tôi muốn làm nản lòng, nhưng nếu thiếu những khâu hoàn thiện nhỏ như thế này thì mọi người rất dễ bỏ qua hoặc đánh giá thấp dự án. Nếu có thời gian tôi có thể gửi PR, và vì tôi muốn thử nghiệm audio matching ngoài lĩnh vực âm nhạc nên dự án này có vẻ là thứ dễ sửa nhất
Tôi sẽ ưu tiên cải thiện hướng dẫn cấu hình, xem xét thêm DB dạng tệp để tăng tính linh hoạt, và xử lý các lỗ hổng
npm. Tính năng lập dấu vân tay trực tiếp từ tệp WAV cũng là một ý tưởng hay nên tôi sẽ ưu tiên xem xétTôi cũng hiểu rủi ro pháp lý của tên dự án và sẽ đổi tên. Nếu ai có gợi ý tên hay thì tôi rất sẵn lòng nhận
Tôi chưa xem kỹ kho mã, nhưng tôi tò mò dữ liệu được tìm kiếm đến từ đâu
Không rõ là đang nạp một thư viện, hay đang tìm trong một thư viện lớn lấy từ đâu đó
Tôi từng có một mục trong bucket list là nhất định phải thử làm thứ như thế này, thật sự rất ngầu
Nếu có cách chia sẻ dấu vân tay theo kiểu cộng đồng thì có lẽ sẽ khá hay
Nếu nhớ không nhầm thì BitTorrent dùng bảng băm phân tán, nhưng hash lại dựa trên toàn bộ nội dung, nên không mấy hữu ích cho việc tìm bản gốc của các tác phẩm phái sinh bị ghi nguồn lộn xộn
Với việc tìm ảnh gốc thì Tineye đôi khi cũng khá hữu dụng
Nếu đưa bài hát từ Spotify vào, chẳng phải sẽ tự nhiên hơn nếu cũng xuất kết quả thành bài hát Spotify sao?
Điện thoại Google có tính năng nhận diện nhạc tích hợp sẵn, và tôi nghe nói đây là một trong những cách triển khai tốt nhất trong lĩnh vực này
Tôi tò mò không biết có ai biết họ đã dùng cách tiếp cận nào không. Ngoài ra, riêng tôi lúc nào cũng thấy SoundHound tốt hơn Shazam
Vì vậy điện thoại không cần luôn ở trạng thái hoạt động, rồi từ đó có lẽ họ có thể dùng bất kỳ thuật toán phát hiện có sẵn nào. Với tôi thì tầng siêu tiết kiệm điện đó giống như phép màu, nhưng tôi chưa từng đọc chi tiết cụ thể