NotShazam - อัลกอริทึม Shazam ที่สร้างใหม่ด้วยภาษา Go
(github.com/cgzirim)- 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 จากไดเรกทอรี
clientnpm 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"เพื่อใช้ MongoDBDB_USER: ชื่อผู้ใช้ MongoDBDB_PASS: รหัสผ่าน MongoDBDB_NAME: ชื่อฐานข้อมูล MongoDB ที่จะใช้DB_HOST: hostname หรือ IP address ของเซิร์ฟเวอร์ MongoDBDB_PORT: หมายเลขพอร์ตของเซิร์ฟเวอร์ MongoDB
- URI สำหรับเชื่อมต่อฐานข้อมูลจะประกอบจาก environment variables
- หากไม่มี
DB_USERหรือDB_PASSจะเชื่อมต่อไปที่mongodb://localhost:27017โดยค่าเริ่มต้น
เอกสารอ้างอิงและไลเซนส์
- How does Shazam work - Coding Geek: resource หลัก
- Song recognition using audio fingerprinting
- How does Shazam work - Toptal
- Creating Shazam in Java
- โปรเจกต์นี้เผยแพร่ภายใต้ MIT License
1 ความคิดเห็น
ความคิดเห็นจาก 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
สิทธิบัตรดังกล่าวยื่นในสหรัฐฯ เมื่อ 2004-10-21 ผมไม่ใช่ผู้เชี่ยวชาญกฎหมาย แต่ในสหรัฐฯ เรื่องนี้ดูเหมือนอาจเป็นหลักฐานที่ไม่เป็นผลดีต่อสิทธิบัตรนี้ได้
PDF ที่จับภาพไว้ใน Google Drive ซึ่งอยู่ในบทความต้นฉบับ น่าจะเป็นเอกสารนั้น
แต่เพื่อให้วิธีนี้ทำงานได้ ต้องมีลายเซ็นของเพลงทั้งหมดบนโลก ;)
งานพูดของ Avery Wang ผู้ร่วมก่อตั้ง Shazam ที่ DAFx17 ดีมาก
เขาพูดถึงพื้นฐานเชิงทฤษฎีของอัลกอริทึมเล็กน้อย และดูปัญหาจริงอย่างเสียงรบกวนพื้นหลังด้วย: https://www.youtube.com/watch?v=YVTnj3OIhwI
ช่วงหลังความแม่นยำของ Shazam ดูเหมือนลดลง และกลับเป็น SoundHound ที่ให้ผลลัพธ์ดีกว่า
ใน Shazam มักมีผลลัพธ์ที่อยู่ในขนบเพลงเอเชียออกมามาก ซึ่งตัวมันเองเป็นเรื่องดี แต่ปัญหาคือมันเป็นเพลงที่ผิด ถ้าขยายขอบเขตเพลงที่เลือกมากขึ้น ก็น่าจะต้องปรับปรุงอัลกอริทึมด้วย และตอนนี้รู้สึกว่า hash table collision เพิ่มขึ้น
อ้างอิง: https://github.com/cgzirim/not-shazam/…
ข้อสรุปคือ 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 โดยตรงก็เป็นไอเดียที่ดี จะดูเป็นลำดับต้น ๆเข้าใจความเสี่ยงทางกฎหมายของชื่อโปรเจกต์แล้ว และตั้งใจจะเปลี่ยน ถ้ามีข้อเสนอชื่อดี ๆ ก็อยากรับฟัง
ยังไม่ได้ดูรีโพซิทอรีอย่างละเอียด แต่สงสัยว่า ข้อมูลที่ใช้เป็นเป้าหมายค้นหามาจากไหน
อยากรู้ว่าเป็นการโหลดไลบรารีเข้ามา หรือค้นหาจากไลบรารีขนาดใหญ่ที่ได้มาจากที่ไหนสักแห่ง
เคยมีสิ่งนี้อยู่ใน บักเก็ตลิสต์ ว่าอยากลองทำให้ได้จริง ๆ เจ๋งมาก
ถ้ามีวิธีแชร์ลายนิ้วมือแบบ ขับเคลื่อนโดยชุมชน ก็น่าจะดีมาก
เท่าที่จำได้ BitTorrent ใช้ตารางแฮชแบบกระจาย แต่แฮชอิงกับคอนเทนต์ทั้งก้อน จึงไม่ค่อยมีประโยชน์สำหรับการหาต้นฉบับของงานดัดแปลงที่ระบุที่มาเละเทะ
สำหรับการค้นหาต้นฉบับของภาพ Tineye บางครั้งก็พอใช้ได้
ถ้าใส่เพลง Spotify เข้าไป ผลลัพธ์ก็น่าจะส่งออกเป็น เพลง Spotify จะเป็นธรรมชาติกว่าไหม?
โทรศัพท์ Google มีฟีเจอร์รู้จำเพลงในตัว และได้ยินมาว่าเป็นการทำที่ดีที่สุดในสายนี้
สงสัยว่ามีใครรู้ไหมว่าใช้แนวทางแบบไหน แยกกันอีกเรื่อง ผมรู้สึกมาตลอดว่า SoundHound ดีกว่า Shazam
ดังนั้นโทรศัพท์จึงไม่จำเป็นต้องตื่นตัวตลอดเวลา และหลังจากนั้นก็น่าจะใช้อัลกอริทึมตรวจจับที่มีอยู่แบบไหนก็ได้ สำหรับผม ขั้นตอนกินพลังงานต่ำมากตรงนั้นรู้สึกเหมือนเวทมนตร์ แต่ไม่เคยอ่านรายละเอียดมาก่อน