3 điểm bởi GN⁺ 2024-08-02 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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 IDClient 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=mongo bằ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ới mongodb://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 .env trong thư mục server và 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 client
    npm 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>
    
    • -f hoặc --force sẽ 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 all xóa cả cơ sở dữ liệu lẫn file bài hát
  • Nếu *.go khô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é Rieu vớ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

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 MongoDB
    • DB_USER: tên người dùng MongoDB
    • DB_PASS: mật khẩu MongoDB
    • DB_NAME: tên cơ sở dữ liệu MongoDB sẽ dùng
    • DB_HOST: hostname hoặc địa chỉ IP của server MongoDB
    • DB_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_USER hoặc DB_PASS, mặc định sẽ kết nối tới mongodb://localhost:27017

Tài liệu tham khảo và giấy phép

1 bình luận

 
GN⁺ 2024-08-02
Ý 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

    • Có lẽ là vì âm thanh tương đối dễ thao tác bằng điện 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
    • Nghe như đang cố gượng ép để nối các ý với nhau
  • 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ài báo mô tả thuật toán của Shazam, “An Industrial-Strength Audio Search Algorithm”(https://www.ee.columbia.edu/~dpwe/papers/Wang03-shazam.pdf), không có ngày xuất bản rõ ràng, nhưng nhìn vào https://www.researchgate.net/publication/220723446_An_Industrial_Strength_Audio_Search_Algorithm thì có vẻ là bài báo năm 2003
      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ế đó
    • Tôi nhớ khoảng 10 năm trước trên HN từng có chuyện Shazam đe dọa pháp lý về việc công khai thuật toán, khiến một bài đăng phổ biến hoặc mã nguồn bị gỡ xuống
      Có lẽ ảnh chụp PDF trên Google Drive trong bài gốc chính là tài liệu đó
    • Cốt lõi là tạo một dấu vân tay đơn giản từ biến đổi Fourier nhanh của tín hiệu âm thanh, rồi dùng cấu trúc chỉ mục đơn giản và tìm kiếm độ tương đồng đơn giản
      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 ;)
    • Vậy tức là ngoài nước Mỹ thì sẽ khó thực thi hơn
    • Nói cách khác là nên clone kho lưu trữ này ngay bây giờ
  • 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

    • Đã thêm vào danh sách xem. Lần đọc bài báo này là một trong những lần đầu tiên tôi có cảm giác wow trước một thuật toán tính toán
  • 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/…

    • SoundHound lúc nào cũng tốt hơn Shazam. Nó nhận ra cả khi người ta hát hoặc với những bài rất nhỏ tiếng
    • Vào tháng 8 năm 2021 tôi đã thử so sánh thư viện nhận diện nhạc của Shazam, SoundHound và BeatFind
      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 install củ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 đồng ý rằng dự án cần thêm khâu hoàn thiện
      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ét
      Tô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
    • Đó chính là lý do đăng lên HN để nhận những phản hồi quý giá như thế này. Tổng hợp rất tốt
  • 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 đó

    • Dữ liệu đến từ cơ sở dữ liệu dấu vân tay được kết nối với máy chủ. Mỗi khi một bài hát được thêm vào thì loại dấu vân tay này sẽ được tạo ra
  • 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

    • Rất vui vì đã truyền cảm hứng. Bạn cứ clone và phát triển thêm cũng được
  • Nếu có cách chia sẻ dấu vân tay theo kiểu cộng đồng thì có lẽ sẽ khá hay

    • Sẽ rất tuyệt nếu có cách như vậy không chỉ cho audio mà còn cho cả hình ảnh và video clip
      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
    • Có vẻ MusicBrainz hỗ trợ việc này: https://musicbrainz.org/doc/AcoustID
  • 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?

    • Thực ra đúng là như vậy. Chỉ là Spotify không cho tải trực tiếp nên tôi phải tìm bài trên YouTube rồi tải xuống
  • Đ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

    • Theo tôi nhớ thì có một thuật toán nhỏ hoặc một mẩu phần cứng chỉ đánh thức khi nhạc đang phát
      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ể