DanceGAI คือทีมที่อยู่เบื้องหลัง ManiaGAI ตัวสร้าง beatmap osu! mania ด้วย AI DanceGAI กำลังสร้างโครงสร้างพื้นฐาน AI ที่เปลี่ยนเพลงให้เป็นประสบการณ์ที่เล่นได้ และ ManiaGAI คือผลิตภัณฑ์แรก: คุณอัปโหลดเพลง แล้วระบบจะสร้าง mapset osu! mania ที่สมบูรณ์และเล่นได้ — ทั้งไทมมิ่ง โน้ต และหลายระดับความยาก — แพ็กเป็นไฟล์ .osz มาตรฐาน เพลงอาจเป็นไฟล์เสียงที่อัปโหลด หรือเพลงของ beatmapset บน osu! ที่คุณใส่ลิงก์มา ไม่ว่าแบบไหนก็ใช้แค่ไฟล์เสียงเท่านั้น ไม่เคยใช้ชาร์ตเดิม ระบบเวอร์ชัน 2 เปิดใช้งานอยู่บนเว็บไซต์นี้ osu! mania คือฟอร์แมตผลลัพธ์แรก: ระบบนี้สร้างมาสำหรับเกมจังหวะแบบเลื่อนแนวตั้ง (VSRG) โดยรวม
หน้านี้อธิบายว่าระบบทำงานอย่างไร และทำไมถึงออกแบบมาแบบนี้ เราเปิดเผยเรื่องสถาปัตยกรรมและการตัดสินใจทางวิศวกรรม แต่ไม่เผยแพร่รายละเอียดที่คนอื่นจะใช้สร้างระบบขึ้นมาใหม่ได้ ตัวเลขไหนที่ยังไม่เปิดเผย หน้านี้จะบอกตรง ๆ แทนที่จะเดา
สรุปทางเทคนิค
| งาน | เสียงเพลง → mapset osu! mania ที่เล่นได้ (.osz) ได้ระดับความยากครบชุดในการรันแต่ละครั้ง |
|---|---|
| ขอบเขต | เกมจังหวะแบบเลื่อนแนวตั้ง (VSRG) — เริ่มที่ osu! mania และวางแผนรองรับฟอร์แมต VSRG อื่น ๆ |
| ไทมมิ่ง | activation จาก Beat This → การฟิตกริดแบบเฉพาะของเรา (รองรับจังหวะที่เปลี่ยน) ในเบนช์มาร์กของเรา 97.1% ของเพลง ranked ที่จังหวะคงที่ 2,501 เพลง ได้ไทมมิ่งคลาดจากไทมมิ่งของ mapper ไม่เกิน 40 ms |
| การแทนข้อมูลเพลง | MERT-v1-95M จัดเรียงให้ตรงกับกริดไทมมิ่งทีละบีต |
| ตัววางแผน | Gaussian diffusion บนสถานะเกมเพลย์รายท่อน ~6M พารามิเตอร์ |
| โมเดลโน้ต | transformer แบบ non-autoregressive สไตล์ MaskGIT บน pattern token ~51M พารามิเตอร์ |
| การควบคุม | 4K–9K · เป้าหมาย ★1–10 · สไตล์ 5 มิติ (สัดส่วน LN, LN inverse, jack, mini LN, delay) |
| ข้อมูลเทรน | ชาร์ตที่คนทำ 150,622 ชาร์ต · 86,255 เพลง · mapper ~14,500 คน · เสียงเพลง 4,227 ชม. |
| การตรวจสอบ | ตรวจกริดไทมมิ่ง ล้างโน้ตที่ไม่ถูกต้อง ป้องกันช่วงเงียบ วัดค่าดาวแบบ osu! ความสม่ำเสมอของ mapset |
| การเทรน | RTX 4070 Ti SUPER หนึ่งใบ · ~580 GPU-hours ที่บันทึกไว้ตลอดสายพัฒนาของโมเดลที่ใช้งานจริง |
| การสร้าง | ระดับความยากที่ขอทั้งหมดถูกสร้างพร้อมกันใน GPU pass เดียวแบบ batch · ใช้การประมวลผล GPU ~20 วินาที ต่อ mapset ครบชุด |
| การให้บริการ | GPU worker แบบ serverless ที่กู้คืนจาก memory snapshot และปรับไฟล์เสียงให้เป็นมาตรฐานในเบราว์เซอร์ |
beatmap ไม่ใช่การถอดโน้ต
วิธีมองการสร้าง beatmap อัตโนมัติที่ชัดที่สุดคือ “ใส่เสียงเข้าไป ผ่าน neural network แล้วได้โน้ตออกมา” แต่ในทางปฏิบัติ กรอบคิดแบบนั้นได้ชาร์ตที่ตามเพลงในทางเทคนิค แต่เล่นแล้วไม่สนุก แมพ osu! mania ที่ดีใกล้เคียงกับการเรียบเรียงมากกว่าการถอดโน้ต: mapper ตัดสินใจว่าเสียงไหนควรมีโน้ต ท่อนไหนควรหนาแน่นแค่ไหน จะวาง jack หรือ long note ตรงไหน แพทเทิร์นไหลระหว่างสองมืออย่างไร และทั้งหมดนั้นเปลี่ยนไปอย่างไรระหว่างระดับ Easy กับ Expert
ManiaGAI จึงมองการสร้าง beatmap เป็นลำดับของปัญหาที่แยกกันชัดเจน — ทำความเข้าใจเพลง วางแผนเกมเพลย์ วางโน้ต และตรวจผลลัพธ์:
- เพลง
- ทำความเข้าใจ
- วางแผน
- สร้าง
- ขัดเกลา
- Beatmap
1. การทำความเข้าใจเพลง
ทุกขั้นตอนถัดไปขึ้นอยู่กับภาพที่แม่นยำของเพลง ขั้นแรกเปลี่ยนไฟล์เสียงดิบให้เป็นสองอย่าง: กริดไทมมิ่ง และการแทนข้อมูลดนตรีความละเอียดสูงของทุกช่วงเวลาในเพลง
ไทมมิ่ง activation ของบีตและ downbeat มาจาก Beat This โมเดล beat tracking แบบโอเพนซอร์ส การเปลี่ยน activation เหล่านั้นให้เป็นกริดไทมมิ่งของ osu! — BPM และ offset รวมถึงเพลงที่เปลี่ยนจังหวะ — เป็นวิธีฟิตกริดของเราเอง และได้กริดตระกูลเดียวกับที่โมเดลสร้างใช้เทรน ไทมมิ่งคือสิ่งที่ผู้เล่นสังเกตเห็นเป็นอย่างแรก: ชาร์ตที่คลาดจากบีตไปไม่กี่มิลลิวินาทีก็เล่นไม่ได้ ไม่ว่าแพทเทิร์นจะดีแค่ไหน จึงถูกจัดการเป็นปัญหาหลัก ไม่ใช่แค่ขั้นตอนเตรียมข้อมูล
คุณลักษณะทางดนตรี ไฟล์เสียงถูกเข้ารหัสด้วย MERT-v1-95M โมเดลแทนข้อมูลดนตรีแบบ self-supervised และจัดเรียงให้ตรงกับกริดไทมมิ่ง — โมเดลจึงเห็นเพลงทีละบีต: onset เนื้อเสียง ความเข้มข้น และการเปลี่ยนแปลงตลอดทั้งเพลง ช่วงที่เงียบจะถูกตรวจจับแยกต่างหาก จึงไม่มีโน้ตถูกวางทับช่วงเหล่านั้น
2. การวางแผน beatmap
การตัดสินใจด้านการออกแบบที่เป็นหัวใจของ ManiaGAI คือการแยกว่าอะไรควรเกิดขึ้น ออกจากวิธีวางโน้ต
โมเดลวางแผนโดยเฉพาะจะอ่านการแทนข้อมูลดนตรี และตัดสินใจโครงสร้างเกมเพลย์ของทั้งเพลงก่อนที่จะมีโน้ตแม้แต่ตัวเดียว: แต่ละท่อนควรหนาแน่นแค่ไหน แพทเทิร์นแบบไหนควรอยู่ตรงไหน ความยากควรขึ้นลงอย่างไร และทั้งหมดนั้นเข้ากับระดับความยากและสไตล์ที่ขออย่างไร ผลลัพธ์คือแผนที่อธิบายชาร์ตทีละท่อน — ความยากเฉพาะช่วง และสัดส่วนของ long note, jack และแพทเทิร์นประเภทอื่น ๆ — ไม่ใช่โน้ต
ตัววางแผนคือโมเดล Gaussian diffusion (ประมาณ 6M พารามิเตอร์) มันสร้างแผนของทุกท่อนในเพลงไปพร้อมกัน โดยมีเงื่อนไขจากเพลง จำนวนคีย์ และระดับความยากกับสไตล์เป้าหมาย diffusion เหมาะกับงานนี้: แผนคือคำอธิบายเพลงที่ต่อเนื่องและราบรื่น และการสร้างทั้งหมดในคราวเดียวช่วยให้ตัววางแผนปรับสมดุลทั้งเพลงได้พร้อมกัน
การวางแผนในระดับนี้ทำให้ระบบมีสิ่งที่โมเดลแบบวางทีละโน้ตไม่มี: มุมมองของทั้งเพลง ท่อนฮุกวางแผนให้หนักกว่าท่อนก่อนหน้าได้ ส่วน breakdown ก็วางแผนให้มีช่วงหายใจได้
3. การสร้างโน้ต
โมเดลตัวที่สองเปลี่ยนแผนให้เป็นการวางโน้ตจริง — เลนไหน โน้ตไหนเป็นโน้ตกดและโน้ตไหนเป็น long note แพทเทิร์นเชื่อมต่อกันอย่างไร การวางแผนกำหนดโครงสร้าง ส่วนการสร้างโน้ตเปลี่ยนโครงสร้างนั้นให้เป็นโน้ตที่เล่นได้ซึ่งตามทั้งแผนและเสียงเพลง
โมเดลโน้ตคือtransformer แบบ non-autoregressive สไตล์ MaskGIT (ประมาณ 51M พารามิเตอร์) ชาร์ตถูกแทนด้วย pattern token แบบไม่ต่อเนื่อง และแทนที่จะเขียนทีละตัวตั้งแต่ต้นจนจบ โมเดลจะเติมทั้งชาร์ตแล้วขัดเกลาหลายรอบ — ยืนยันโน้ตที่มั่นใจ และกลับไปทบทวนส่วนที่เหลือ ทุกรอบเห็นบริบททั้งสองฝั่งของทุกท่อน ซึ่งเป็นสิ่งที่ทำให้แพทเทิร์นสม่ำเสมอตลอดเพลง การจัดลำดับรอบเหล่านั้นตลอดทั้งเพลงเป็นวิธีขัดเกลาของเราเอง
ทำไม ManiaGAI ใช้ Planner + Noter (ภาษาอังกฤษ) →
4. การสร้างที่ควบคุมได้
ManiaGAI ไม่ใช่ระบบแบบ “สร้างแล้วลุ้นเอา” เพลงเดียวกันสร้างได้ภายใต้การควบคุมที่ชัดเจน และการควบคุมเหล่านี้เป็นส่วนหนึ่งของสิ่งที่โมเดลถูกเทรนให้ทำตาม:
- จำนวนคีย์ — 4K ถึง 9K
- ระดับความยาก — เลือกค่าดาวชุดใดก็ได้ตั้งแต่ ★1 ถึง ★10 เพลงเดียวได้ mapset ทั้งชุด ตั้งแต่ Easy ถึง Expert ในการรันครั้งเดียว
- สไตล์ — ลักษณะเกมเพลย์ เช่น สัดส่วนของ long note และปริมาณแพทเทิร์น jack, inverse-LN, LN สั้น และ delay ในชาร์ต ซึ่งปรับแต่ละอย่างได้ในตัวสร้าง
- ความหนาแน่น — เป็นผลจากระดับความยากเป้าหมายและแผน ไม่ใช่จากกฎตายตัว
ทุกระดับความยากถูกสร้างจากความเข้าใจเพลงชุดเดียวกัน mapset จึงอ่านได้เป็นชาร์ตครอบครัวเดียวกัน ไม่ใช่ชาร์ตที่ไม่เกี่ยวข้องกัน ขั้นต่อไป เรากำลังพัฒนาการแทนสไตล์แบบเรียนรู้ได้ — อธิบายสไตล์การทำแมพด้วยตัวอย่าง แทนที่จะใช้สไลเดอร์ไม่กี่ตัว
5. การตรวจสอบและควบคุมคุณภาพ
ก่อนที่ชาร์ตจะถึงมือคุณ ระบบจะตรวจสอบ:
- ไทมมิ่ง — timing point ที่เขียนลงไปจะถูกตรวจเทียบกับกริดที่ตรวจจับได้
- โน้ตที่ไม่ถูกต้องและเล่นไม่ได้ — โน้ตที่ซ้อนกัน long note ที่เสีย และตำแหน่งที่เกมแสดงไม่ได้ จะถูกแก้ไข และไม่มีโน้ตถูกวางบนช่วงที่เงียบชัดเจน
- ความยากที่วัดได้จริง — ค่าดาวของทุกชาร์ตถูกวัดด้วยอัลกอริทึมคำนวณค่าดาวเดียวกับที่ osu! ใช้ และระดับความยากจะตั้งชื่อตามค่าที่วัดได้ ไม่ใช่ค่าที่ขอ
- ความสม่ำเสมอทั้ง mapset — ชาร์ตที่ออกมาง่ายกว่าชาร์ตที่ควรอยู่ระดับต่ำกว่า หรือมีความยากเกือบเท่ากับชาร์ตข้างเคียง จะถูกตัดทิ้งแทนที่จะส่งออกไป ในตัวสร้าง คุณจะเห็นว่าดาวไหนถูกตัดและเพราะอะไร
- ความถูกต้องของผลลัพธ์ — ผลลัพธ์ถูกแพ็กเป็นไฟล์ .osz มาตรฐาน พร้อมเสียงเพลง ภาพพื้นหลัง และ hitsound ที่นำเข้า osu! ได้โดยตรง
ตัวเลขสำคัญ
- เพลงในชุดข้อมูลเทรน
- 86,255
- ชาร์ตที่ใช้เทรน
- 150,622
- Mapper
- ~14,500
- เสียงเพลงที่ไม่ซ้ำกัน
- 4,227 ชม.
- ข้อมูลฟีเจอร์สำหรับเทรนบนดิสก์
- ~0.7 TB
- การประมวลผลสำหรับเทรน (ที่บันทึกไว้ สายพัฒนาที่ใช้งานจริง)
- ~580 GPU-hours
- การเทรนรอบสุดท้ายของโมเดลโน้ต
- ~4 วัน
- พารามิเตอร์ของโมเดล
- ~57M (โน้ต 51M + ตัววางแผน 6M)
- การสร้าง mapset ครบชุด
- ~20 วินาที
- โหมดคีย์
- 4K–9K
- ช่วงระดับความยาก
- ★1–★10
- ระดับความยากต่อการรัน
- สูงสุด 10 (น้อยกว่านี้สำหรับเพลงยาว)
ข้อมูลเทรน
โมเดลที่ใช้งานจริงเรียนรู้จากชาร์ต osu! mania ที่คนทำ 150,622 ชาร์ต จากเพลง 86,255 เพลง — เสียงเพลงที่ไม่ซ้ำกัน 4,227 ชั่วโมง — โดยmapper ราว 14,500 คน งานส่วนใหญ่ในระบบแบบนี้ไม่ใช่ตัวโมเดล แต่เป็นข้อมูล: ตัดสินว่าชาร์ตแบบไหนควรค่าแก่การเรียนรู้ ตรวจให้แน่ใจว่าไทมมิ่งของตัวอย่างเทรนทุกตัวถูกต้อง และแทนชาร์ตในรูปแบบที่จับได้ว่าอะไรทำให้มันเล่นได้
สำรวจชุดข้อมูลเทรน (ภาษาอังกฤษ) →
การประเมินผล: ความแม่นยำของไทมมิ่ง
เราเทียบไทมมิ่งของเรากับไทมมิ่งของมนุษย์บน mapset osu! mania ranked ทุกชุดที่มีจังหวะคงที่เพียงจังหวะเดียวที่เราประเมินได้ — 2,501 เพลง — ควบคู่กับโหมดไทมมิ่งของ Mapperatorinator แบบโอเพนซอร์ส และ ManiaGAI v1 ตัวตรวจจับรุ่นก่อนของเรา เพลงหนึ่งจะนับว่าถูกต้องเมื่อ BPM ตรงกับของ mapper (ยอมให้เป็นครึ่งหรือสองเท่าของจังหวะ) และเฟสของบีตอยู่ภายในค่าคลาดเคลื่อนที่กำหนด
| วิธี | ≤10 ms | ≤20 ms | ≤40 ms | BPM ถูกต้อง | timing line เดียว |
|---|---|---|---|---|---|
| ManiaGAI v2 | 71.4% | 92.3% | 97.1% | 98.0% | 100% |
| Mapperatorinator | 78.0% | 90.9% | 91.7% | 92.6% | 11.0% |
| ManiaGAI v1 | 74.8% | 88.0% | 90.7% | 94.0% | 92.8% |
เฉพาะเพลง ranked ที่จังหวะคงที่ “timing line เดียว” = เพลงถูกตั้งไทมมิ่งด้วยเส้นเดียวเหมือนที่ mapper ทำ (เส้นเกินมาในเพลงที่จังหวะคงที่คือการเปลี่ยนจังหวะที่ผิด) วัดบนการตั้งค่าที่ใกล้เคียงกับ แต่ไม่เหมือนกันทุกประการกับเวอร์ชันที่ใช้งานจริง
อ่านเบนช์มาร์กไทมมิ่งฉบับเต็ม (ภาษาอังกฤษ) →
การเทรน
ตัววางแผนและโมเดลโน้ตถูกเทรนแยกกัน แต่ละตัวบนรูปแบบข้อมูลที่มันใช้ — ตัววางแผนเป็นโมเดล Gaussian diffusion บนคำอธิบายเกมเพลย์รายท่อนที่แปลงให้เป็นแบบ Gaussian ส่วนโมเดลโน้ตใช้การทำนาย masked token บน pattern token ตัวอย่างเทรนถูกปรับสมดุลระหว่างจำนวนคีย์และระดับความยาก เพื่อไม่ให้ชาร์ต 8K และ ★10 ถูกกลบด้วย 4K และ ★4 และโมเดลโน้ตเทรนด้วย mixed precision
ทุกการเปลี่ยนแปลงถูกตัดสินจากตัวชาร์ตที่สร้างออกมา — ความแม่นยำของไทมมิ่ง ความยากที่วัดได้เทียบกับเป้าหมาย และความเล่นได้ — ไม่ใช่จาก training loss อย่างเดียว
การรันโมเดลและประสิทธิภาพ
ระบบ AI ที่มีประโยชน์ไม่ได้อยู่ที่คุณภาพของโมเดลเท่านั้น แต่ต้องเร็วพอที่จะใช้งานได้ด้วย คำขอหนึ่งครั้งของ ManiaGAI ทำงานแบบนี้:
- ในเบราว์เซอร์ของคุณ: เพลงจะถูกถอดรหัส ปรับระดับความดัง และเข้ารหัสใหม่ทันทีที่คุณเลือกไฟล์ ระหว่างที่คุณยังเลือกการตั้งค่าอยู่ — GPU จึงไม่ต้องรอการประมวลผลเสียงเลย
- การทำความเข้าใจเพลงบน GPU: Beat This และ MERT โดยการฟิตกริดรันบน CPU ไปพร้อมกับ MERT
- การวางแผนและการสร้างโน้ตสำหรับทุกระดับความยากที่ขอ ใน pass เดียวแบบ batch
- การตรวจสอบ — วัดค่าดาว ตรวจความสม่ำเสมอ
- แพ็กไฟล์ .osz แล้วดาวน์โหลด
GPU worker เริ่มจาก snapshot ที่โหลดไว้ล่วงหน้า แม้ worker ที่เพิ่งเริ่มทำงานก็พร้อมภายในไม่กี่วินาที แทนที่จะเสียเวลาไปกับการโหลดโมเดล mapset ครบชุดใช้เวลาประมวลผล GPU ประมาณ 20 วินาทีสำหรับเพลงทั่วไป — ไม่นับการอัปโหลด การรอคิว หรือการดาวน์โหลด เพลงความยาว 2:50 ที่วัดจริงหนึ่งเพลงพร้อมห้าระดับความยากใช้เวลา 12.7 วินาทีบน NVIDIA T4 — ไทมมิ่งและคุณลักษณะทางดนตรี 3.8 วินาที (รันพร้อมกัน) การวางแผน 1.0 วินาที การสร้างโน้ตสำหรับทั้งห้าระดับความยาก 6.1 วินาที
เราทำให้การสร้างเร็วขึ้นได้อย่างไร (ภาษาอังกฤษ) →
สิ่งที่เราไม่เผยแพร่
เราเผยแพร่หลักการด้านสถาปัตยกรรม การตัดสินใจทางวิศวกรรมเบื้องหลัง และสิ่งที่ระบบทำได้และทำไม่ได้ — รวมถึงโมเดลแบบเปิดที่เราใช้เป็นฐาน (Beat This, MERT) และตระกูลที่โมเดลของเราเองสังกัดอยู่ (Gaussian diffusion, MaskGIT) เราไม่เผยแพร่วิธีที่เราพัฒนาขึ้นเอง หรือรายละเอียดที่จะทำให้คนอื่นสร้างระบบซ้ำได้: วิธีฟิตกริดไทมมิ่งและรวมช่วงจังหวะ วิธีจัดลำดับรอบการขัดเกลาของโมเดลโน้ตตลอดเพลง วิธีกำหนดเงื่อนไขให้โมเดล สถาปัตยกรรม loss และ hyperparameter ที่แน่นอน และวิธีจัดหา คัดกรอง และสร้างข้อมูลเทรน นั่นคือเส้นแบ่งระหว่างการโปร่งใสเกี่ยวกับสิ่งที่เราสร้าง กับการยกสูตรให้ เมื่อเราอ้างเรื่องคุณภาพ เราตั้งใจจะยืนยันด้วยเบนช์มาร์กที่เผยแพร่ — ไม่ใช่ด้วยคำคุณศัพท์
ก้าวต่อไป
ไปไกลกว่า osu! mania ManiaGAI ถูกออกแบบรอบการแทนเกมเพลย์ที่ไม่ได้ผูกกับ osu! mania โดยเฉพาะ: โน้ตและ long note ในเลน วางบนกริดไทมมิ่ง และมีเงื่อนไขจากระดับความยากเป้าหมาย osu! mania คือฟอร์แมตผลลัพธ์แรก ไม่ใช่ขอบเขตของระบบ
เจาะลึก
งานวิจัยและวิศวกรรมเบื้องหลัง ManiaGAI แบบละเอียด: