3 คะแนน โดย GN⁺ 2024-08-02 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • SeekTune เป็นโปรเจกต์ที่นำอัลกอริทึมการรู้จำเพลงของ Shazam มาทำงานจริง โดยรวม Spotify และ YouTube API เพื่อให้ค้นหาและดาวน์โหลดเพลงได้
  • การรันต้องใช้ Golang, FFmpeg, NPM และ YT-DLP และสามารถเปิด server กับ client ได้ทั้งผ่าน Docker Compose หรือสภาพแวดล้อมแบบเนทีฟ
  • การเชื่อมต่อ Spotify ทำโดยตั้งค่า Client ID และ Client Secret ของแอปนักพัฒนาไว้ใน server/.env โดยแอปจะดึงและแคช access token ที่จำเป็นให้อัตโนมัติ
  • ฐานข้อมูลเริ่มต้นคือ SQLite และหากกำหนด DB_TYPE=mongo ผ่าน environment variable จะสามารถใช้ MongoDB ได้ โดยถ้าไม่มีผู้ใช้·รหัสผ่านจะเชื่อมต่อไปที่ mongodb://localhost:27017
  • CLI รองรับการดาวน์โหลดลิงก์ Spotify, การบันทึกไฟล์เสียงในเครื่อง, การ match ไฟล์บันทึกเสียง, และการลบ fingerprint กับเพลง โดยรายการที่บันทึกไว้ซึ่งไม่มี YouTube ID จะไม่แสดงเป็นผลการ match ใน frontend

ภาพรวมโปรเจกต์

  • SeekTune เป็นแอปพลิเคชันที่นำอัลกอริทึมการรู้จำเพลงของ Shazam มาทำงานจริง
  • การทำงานอ้างอิงจากเอกสารในส่วน resource ของ README
  • รวม Spotify และ YouTube API เพื่อให้ค้นหาและดาวน์โหลดเพลงได้
  • มีลิงก์เดโมและขั้นตอนการสร้างให้ดู

วิธีติดตั้งและรัน

  • เครื่องมือที่ต้องใช้คือ Golang, FFmpeg, NPM และ YT-DLP

  • คำสั่ง clone repository มีดังนี้

    git clone https://github.com/cgzirim/seek-tune.git
    cd seek-tune
    
  • การตั้งค่า Spotify API

    • ต้องสร้างแอป Spotify แล้วรับ Client ID และ Client Secret
    • สร้างไฟล์ .env ในไดเรกทอรี server แล้วตั้งค่าต่อไปนี้
    SPOTIFY_CLIENT_ID=your-client-id
    SPOTIFY_CLIENT_SECRET=your-client-secret
    
    • แอปจะดึงและแคช access token ที่จำเป็นให้อัตโนมัติ
  • การรันด้วย Docker

    • ต้องมี Docker และ Docker Compose
    • build และรันด้วยคำสั่งต่อไปนี้
    docker-compose up --build
    
    • หลังจากรันแล้ว เข้าถึงแอปได้ที่ http://localhost:8080
    • ใช้คำสั่งต่อไปนี้เพื่อหยุด
    docker-compose down
    
  • การรันแบบเนทีฟ

    • ติดตั้ง dependency ของ backend
    cd server
    go get ./...
    
    • ติดตั้ง dependency ของ client
    cd client
    npm install
    

วิธีใช้ CLI

  • รันแอป client จากไดเรกทอรี client
    npm start
    
  • รัน backend ใน terminal แยกต่างหาก
    cd server
    go run *.go serve [-proto <http|https> (default: http)] [-port <port number> (default: 5000)]
    
  • สามารถดาวน์โหลดเพลงด้วยลิงก์ Spotify ได้
    go run *.go download <https://open.spotify.com/.../...>;
    
    • ลิงก์ที่คัดลอกจากแอป Spotify บนมือถือจะใช้งานไม่ได้
    • สามารถใช้ลิงก์ที่คัดลอกจากแอปบนเดสก์ท็อปหรือเว็บแอปได้
  • สามารถบันทึกไฟล์เพลงหรือไดเรกทอรีในเครื่องลงฐานข้อมูลได้ และรองรับไฟล์เสียงทุกรูปแบบ
    go run *.go save [-f|--force] <path_to_song_file_or_dir_of_songs>
    
    • -f หรือ --force จะบันทึกเพลงแม้หา YouTube ID ไม่พบ
    • หากไม่มี YouTube ID frontend จะไม่แสดงการ match
  • สามารถค้นหาการ match ของเพลงหรือไฟล์บันทึกเสียงได้
    go run *.go find <path-to-wav-file>
    
  • รองรับการลบ fingerprint และเพลง
    go run *.go erase
    go run *.go erase db
    go run *.go erase all
    
    • ค่าเริ่มต้นจะลบเฉพาะฐานข้อมูล
    • erase all จะลบทั้งฐานข้อมูลและไฟล์เพลงพร้อมกัน
  • หาก *.go ใช้งานไม่ได้ สามารถใช้ ./... แทนได้

ตัวอย่าง output

  • ตัวอย่างการดาวน์โหลดจะดึงข้อมูลแทร็ก Spotify จากนั้นดาวน์โหลดแทร็กและบันทึก 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
    
  • ตัวอย่างการ match จะแสดง 20 อันดับแรกที่ match และการทำนายสุดท้ายสำหรับ Voilà - André Rieu.wav
    • ผลลัพธ์อันดับแรกคือ Voilà by André Rieu และมีคะแนน 5390686.00
    • เวลาในการค้นหาแสดงเป็น 856.386557ms
    • การทำนายสุดท้ายก็แสดงเป็น Voilà by André Rieu

การเลือกฐานข้อมูล

  • ฐานข้อมูลเริ่มต้นคือ SQLite
  • หากต้องการใช้ MongoDB ให้ติดตั้ง MongoDB และตั้งค่า environment variable สำหรับการเชื่อมต่อ
    • DB_TYPE: ตั้งเป็น "mongo" เพื่อใช้ MongoDB
    • DB_USER: ชื่อผู้ใช้ MongoDB
    • DB_PASS: รหัสผ่าน MongoDB
    • DB_NAME: ชื่อฐานข้อมูล MongoDB ที่จะใช้
    • DB_HOST: hostname หรือ IP address ของเซิร์ฟเวอร์ MongoDB
    • DB_PORT: หมายเลขพอร์ตของเซิร์ฟเวอร์ MongoDB
  • URI สำหรับเชื่อมต่อฐานข้อมูลจะประกอบจาก environment variables
  • หากไม่มี DB_USER หรือ DB_PASS จะเชื่อมต่อไปที่ mongodb://localhost:27017 โดยค่าเริ่มต้น

เอกสารอ้างอิงและไลเซนส์

1 ความคิดเห็น

 
GN⁺ 2024-08-02
ความคิดเห็นจาก Hacker News
  • เทคโนโลยีบางส่วนของ Shazam มาจาก CCRMA ในวิทยาเขต Stanford ซึ่งเป็นสถานที่พิเศษที่เชื่อมโยงอย่างลึกซึ้งกับประวัติศาสตร์คอมพิวเตอร์ยุคแรกด้วย
    น่าสนใจที่การประยุกต์ใช้เทคโนโลยีคอมพิวเตอร์ยุคแรก ๆ มักเกี่ยวข้องกับเสียงเป็นพิเศษ มีตัวอย่างต่อเนื่องตั้งแต่กล่องดนตรีของ John Bardeen, เครื่องช่วยฟังซึ่งเป็นการใช้งานเชิงพาณิชย์ครั้งแรกของทรานซิสเตอร์, ออสซิลเลเตอร์เสียงที่สร้างกันในโรงรถ HP ที่ Palo Alto, iPhone ที่ต่อยอดมาจาก iPod, อินเทอร์เน็ตที่สร้างขึ้นบนสายทองแดงซึ่งเคยใช้ขนส่งสัญญาณโทรศัพท์แอนะล็อก ไปจนถึง Bell Labs
    บางทีสมมติฐานที่ว่ามนุษย์เรียนรู้วิธีจัดการกับ ย่าน kHz ก่อน แล้วค่อยก้าวไปสู่ย่าน MHz/GHz ก็ดูน่าดึงดูดไม่น้อย

    • ผมคิดว่าเป็นเพราะเสียงนั้น จัดการทางอิเล็กทรอนิกส์ได้ค่อนข้างง่าย
      สัญญาณเสียงสามารถแปลงเป็นสัญญาณไฟฟ้าได้ค่อนข้างง่าย แต่กราฟิกนั้นซับซ้อนกว่ามากตั้งแต่ขั้นตอนทำให้แสดงบนหน้าจอ ลำโพงที่แปลงสัญญาณไฟฟ้าเป็นคลื่นเสียง หากดูเฉพาะโครงสร้างหลักก็เป็นอุปกรณ์ที่เรียบง่ายมาก
      อีกอย่าง เสียงสร้างความประทับใจต่อมนุษย์ได้มาก ดังนั้นถ้าจะโชว์พลังของอิเล็กทรอนิกส์หรือคอมพิวเตอร์ เป็นผมก็คงเลือกเสียงเหมือนกัน
    • ดูเหมือนเป็นการตีความที่ฝืนเชื่อมโยงเกินไป
  • ถ้านี่เป็นการจำลอง Shazam ของจริง อย่างน้อยก็อาจยังอยู่ภายใต้สิทธิบัตรของ Apple จนถึง มีนาคม 2025: https://patents.google.com/patent/US7627477

    • บทความ “An Industrial-Strength Audio Search Algorithm” ที่ Shazam ใช้อธิบายอัลกอริทึม (https://www.ee.columbia.edu/~dpwe/papers/Wang03-shazam.pdf) ไม่มีวันที่เผยแพร่ที่ชัดเจน แต่ดูจาก https://www.researchgate.net/publication/220723446_An_Industrial_Strength_Audio_Search_Algorithm แล้วน่าจะเป็น บทความปี 2003
      สิทธิบัตรดังกล่าวยื่นในสหรัฐฯ เมื่อ 2004-10-21 ผมไม่ใช่ผู้เชี่ยวชาญกฎหมาย แต่ในสหรัฐฯ เรื่องนี้ดูเหมือนอาจเป็นหลักฐานที่ไม่เป็นผลดีต่อสิทธิบัตรนี้ได้
    • จำได้ว่าเมื่อราว 10 ปีก่อนใน HN Shazam เคย ขู่ทางกฎหมายเรื่องการเปิดเผยอัลกอริทึม จนโพสต์ยอดนิยมหรือซอร์สโค้ดถูกลบไป
      PDF ที่จับภาพไว้ใน Google Drive ซึ่งอยู่ในบทความต้นฉบับ น่าจะเป็นเอกสารนั้น
    • ใจความสำคัญคือการสร้าง fingerprint แบบง่าย ๆ จาก Fast Fourier Transform ของสัญญาณเสียง แล้วใช้ดัชนีแบบง่ายและการค้นหาความคล้ายแบบง่าย
      แต่เพื่อให้วิธีนี้ทำงานได้ ต้องมีลายเซ็นของเพลงทั้งหมดบนโลก ;)
    • แปลว่านอกสหรัฐฯ ก็คงบังคับใช้ได้ยากสินะ
    • งั้นก็หมายความว่าตอนนี้ควร clone repository เก็บไว้สินะ
  • งานพูดของ Avery Wang ผู้ร่วมก่อตั้ง Shazam ที่ DAFx17 ดีมาก
    เขาพูดถึงพื้นฐานเชิงทฤษฎีของอัลกอริทึมเล็กน้อย และดูปัญหาจริงอย่างเสียงรบกวนพื้นหลังด้วย: https://www.youtube.com/watch?v=YVTnj3OIhwI

    • อันนี้เพิ่มลงรายการที่จะดูแล้ว ตอนที่ได้อ่านบทความนี้เป็นหนึ่งในครั้งแรก ๆ ที่ผมรู้สึก ว้าว กับอัลกอริทึมด้านคอมพิวติ้ง
  • ช่วงหลังความแม่นยำของ Shazam ดูเหมือนลดลง และกลับเป็น SoundHound ที่ให้ผลลัพธ์ดีกว่า
    ใน Shazam มักมีผลลัพธ์ที่อยู่ในขนบเพลงเอเชียออกมามาก ซึ่งตัวมันเองเป็นเรื่องดี แต่ปัญหาคือมันเป็นเพลงที่ผิด ถ้าขยายขอบเขตเพลงที่เลือกมากขึ้น ก็น่าจะต้องปรับปรุงอัลกอริทึมด้วย และตอนนี้รู้สึกว่า hash table collision เพิ่มขึ้น
    อ้างอิง: https://github.com/cgzirim/not-shazam/…

    • SoundHound ดีกว่า Shazam มาโดยตลอด จับเพลงที่คนร้องเองหรือเพลงที่เบามาก ๆ ได้ด้วย
    • เมื่อเดือนสิงหาคม 2021 ผมเคยเปรียบเทียบ ไลบรารีรู้จำเพลง ของ Shazam, SoundHound และ BeatFind
      ข้อสรุปคือ BeatFind กับ Shazam รู้จักเพลงมากที่สุด แต่ก็มีด้านที่เสริมกัน และทุกบริการต่างก็มีอย่างน้อยหนึ่งเพลงที่มีเพียงบริการนั้นเท่านั้นที่รู้จำได้
      ในการทดสอบผสมเพลงหลายแนวและหลายระดับความเป็นที่รู้จัก แต่ถ้าขนาดตัวอย่างใหญ่กว่านี้ก็คงดีกว่า อีกทั้งไม่ได้ทดสอบเสียงรบกวนอย่างเสียงพูดของคน หรือเพลงที่ถูกกรองจนได้ยินลอดมาจากอีกฝั่งของกำแพง
      ที่น่าสนใจคือ “Night Driver” แสดงว่า “1 Shazams” ผมเลยน่าจะเป็นคนแรกที่ Shazam เพลงนั้น และ “THEY'RE TAKING THE HOBBITS TO ISENGARD!” นั้นทุกคนรู้กันว่าพวกเขาพาฮอบบิทไปที่ไหน แต่ไม่มีบริการไหนรู้จำได้เลย
  • โปรเจกต์ดูเหมือนจะเขียนและแก้ไขได้ง่าย แต่โดยส่วนตัวคิดว่ายังเร็วไปนิดที่จะเปิดเผยต่อสาธารณะ
    คำแนะนำวิธีรันดูเหมือนไม่ถูกต้อง และจำเป็นต้องใช้ MongoDB แต่ไม่มีคำอธิบายเรื่องการเชื่อมต่อและวิธีใช้งาน ถ้าเป็นไปได้ควรทำให้เปลี่ยน DB ได้ และมีตัวเลือกที่ภาระน้อยกว่าอย่าง sqlite
    ถ้าแทน MongoDB ไม่ได้ ก็ควรมี Dockerfile และ docker compose เพื่อให้รันและทดสอบได้ง่าย ตอน npm install ของไคลเอนต์พบช่องโหว่ร้ายแรง 8 รายการ ถึงจริง ๆ อาจไม่เป็นปัญหาก็ได้ แต่ก็ทำให้ลังเลที่จะทดสอบต่อ
    ต่อให้ไม่สนเรื่องสิทธิบัตรหรือลิขสิทธิ์ ก็ควรเปลี่ยนชื่ออยู่ดี GitHub เองอยู่ในสหรัฐฯ ดังนั้นถ้ามี DMCA เข้ามา โปรเจกต์อาจถูกถอดลงได้
    สุดท้าย อยากให้มีฟีเจอร์เพิ่มเพลงจากไฟล์ WAV ด้วย เสียงที่อยากทดสอบไม่ได้อยู่บน Spotify หรือ YouTube ทั้งหมด
    ไม่ได้ตั้งใจจะทำให้หมดกำลังใจ แต่ถ้างานเก็บรายละเอียดเล็ก ๆ แบบนี้ยังขาดอยู่ คนมักจะมองข้ามหรือประเมินโปรเจกต์ต่ำได้ง่าย ถ้ามีเวลาอาจส่ง PR ไปให้ และเพราะอยากทดลองการจับคู่ออดิโอใน领域อื่นนอกจากดนตรี โปรเจกต์นี้ดูแก้ไขได้ง่ายที่สุด

    • เห็นด้วยว่าโปรเจกต์ยังต้องมี งานเก็บรายละเอียด เพิ่มเติม
      จะให้ความสำคัญกับการปรับปรุงคำแนะนำการตั้งค่า เพิ่ม DB แบบอิงไฟล์เพื่อความยืดหยุ่น และแก้ช่องโหว่ของ npm ฟีเจอร์ทำลายนิ้วมือจากไฟล์ WAV โดยตรงก็เป็นไอเดียที่ดี จะดูเป็นลำดับต้น ๆ
      เข้าใจความเสี่ยงทางกฎหมายของชื่อโปรเจกต์แล้ว และตั้งใจจะเปลี่ยน ถ้ามีข้อเสนอชื่อดี ๆ ก็อยากรับฟัง
    • ก็โพสต์ลง HN เพื่อรับฟีดแบ็กมีค่าแบบนี้แหละ สรุปได้ดีมาก
  • ยังไม่ได้ดูรีโพซิทอรีอย่างละเอียด แต่สงสัยว่า ข้อมูลที่ใช้เป็นเป้าหมายค้นหามาจากไหน
    อยากรู้ว่าเป็นการโหลดไลบรารีเข้ามา หรือค้นหาจากไลบรารีขนาดใหญ่ที่ได้มาจากที่ไหนสักแห่ง

    • ข้อมูลมาจาก ฐานข้อมูลลายนิ้วมือ ที่เชื่อมกับเซิร์ฟเวอร์ ลายนิ้วมือแบบนี้จะถูกสร้างขึ้นทุกครั้งที่เพิ่มเพลง
  • เคยมีสิ่งนี้อยู่ใน บักเก็ตลิสต์ ว่าอยากลองทำให้ได้จริง ๆ เจ๋งมาก

    • ดีใจที่เป็นแรงบันดาลใจให้ จะโคลนไปต่อยอดก็ได้
  • ถ้ามีวิธีแชร์ลายนิ้วมือแบบ ขับเคลื่อนโดยชุมชน ก็น่าจะดีมาก

    • อยากให้มีวิธีแบบนั้นไม่ใช่แค่กับออดิโอ แต่กับภาพและคลิปวิดีโอด้วย
      เท่าที่จำได้ BitTorrent ใช้ตารางแฮชแบบกระจาย แต่แฮชอิงกับคอนเทนต์ทั้งก้อน จึงไม่ค่อยมีประโยชน์สำหรับการหาต้นฉบับของงานดัดแปลงที่ระบุที่มาเละเทะ
      สำหรับการค้นหาต้นฉบับของภาพ Tineye บางครั้งก็พอใช้ได้
    • ดูเหมือน MusicBrainz จะรองรับสิ่งนี้: https://musicbrainz.org/doc/AcoustID
  • ถ้าใส่เพลง Spotify เข้าไป ผลลัพธ์ก็น่าจะส่งออกเป็น เพลง Spotify จะเป็นธรรมชาติกว่าไหม?

    • จริง ๆ แล้วนั่นแหละถูกต้อง แต่ Spotify ไม่อนุญาตให้ดาวน์โหลดโดยตรง เลยต้องไปหาเพลงจาก YouTube แล้วดาวน์โหลดลงมา
  • โทรศัพท์ Google มีฟีเจอร์รู้จำเพลงในตัว และได้ยินมาว่าเป็นการทำที่ดีที่สุดในสายนี้
    สงสัยว่ามีใครรู้ไหมว่าใช้แนวทางแบบไหน แยกกันอีกเรื่อง ผมรู้สึกมาตลอดว่า SoundHound ดีกว่า Shazam

    • เท่าที่จำได้ เหมือนจะมี อัลกอริทึมเล็ก ๆ หรือชิ้นส่วนฮาร์ดแวร์ที่ปลุกระบบขึ้นมาเฉพาะตอนมีเพลงกำลังเล่น
      ดังนั้นโทรศัพท์จึงไม่จำเป็นต้องตื่นตัวตลอดเวลา และหลังจากนั้นก็น่าจะใช้อัลกอริทึมตรวจจับที่มีอยู่แบบไหนก็ได้ สำหรับผม ขั้นตอนกินพลังงานต่ำมากตรงนั้นรู้สึกเหมือนเวทมนตร์ แต่ไม่เคยอ่านรายละเอียดมาก่อน