- คำอธิบายเกี่ยวกับม็อดที่สร้างขึ้นในปี 2021 เพื่อปรับปรุงลิปซิงก์และการกะพริบตาใน Deus Ex 1
- ผู้พัฒนาพบว่าการทำงานของ ระบบลิปซิงก์ ในเกมต้นฉบับนั้นทำงานผิดปกติมาตั้งแต่ตอนวางจำหน่าย
- มีการวิเคราะห์ว่า Deus Ex ใช้วิธีดึงหน่วยเสียงและแมปปากคล้ายกับ Half-Life 2 ของ Valve
- แก้ไขปัญหาการตรวจสอบเฟรมเรตและจังหวะการ blend ที่ผิดพลาดใน โค้ด Unrealscript จนทำให้แอนิเมชันดูเป็นธรรมชาติมากขึ้น
- หากต้องการให้สมบูรณ์แบบ ยังต้องแก้ปัญหาเรื่อง ความถี่ในการอัปเดตหน่วยเสียง เพิ่มเติม
บทนำและพื้นหลัง
- ม็อดนี้เป็นโปรเจกต์ที่ปรับปรุงลิปซิงก์บทพูดของตัวละครและแอนิเมชันการกะพริบตาใน Deus Ex 1
- ในเกมต้นฉบับ การทำงานของลิปซิงก์และการกะพริบตาถูกทำไว้ผิดปกติมาตั้งแต่ช่วงเปิดตัว
- ผู้เขียนนำงานที่เคยเผยแพร่ไว้บน Twitter มาจัดเรียงและอธิบายอย่างเป็นระบบ
- ดาวน์โหลดม็อดได้จากลิงก์แยกต่างหาก(ModDB)
การตรวจสอบระบบลิปซิงก์เดิม
- ระหว่างเล่นเกม ผู้เขียนสังเกตเห็นปัญหาเรื่อง การสลับรูปปากของลิปซิงก์ และลักษณะแอนิเมชันที่แปลกผิดปกติ
- อ้างอิงบทสัมภาษณ์ของ Chris Norden (ผู้พัฒนา Deus Ex): ระบบลิปซิงก์ช่วงแรกละเอียดกว่านี้ แต่ถูก ลดทอนลงเพราะเหตุผลด้านประสิทธิภาพ
- จึงตรวจสอบว่าภายในส่วนของ Unrealscript มีการทำไว้ถึงระดับใด และสามารถแก้ไขได้มากน้อยแค่ไหน
- ไม่มีซอร์สโค้ดให้ใช้งาน และเข้าถึงได้เพียงสคริปต์เท่านั้น
หลักการทำงานของลิปซิงก์
- ผู้เขียนเคยสั่งสมประสบการณ์จากการวิเคราะห์ระบบลิปซิงก์ของ Half-Life 2 มาก่อน
- Valve ใช้วิธี ดึงหน่วยเสียง (phoneme) จากไฟล์เสียง แล้วแนบข้อมูลภาษานั้นไว้ท้ายไฟล์ .wav จากนั้นตอนรันจึง สลับรูปปาก (viseme) ให้ตรงตามจังหวะเวลา
- วิธีนี้มีข้อดีคือใช้การดึงหน่วยเสียงล่วงหน้า จึง ลดภาระระหว่างรันไทม์
ปัญหาเชิงโครงสร้างของ Deus Ex
- ใน Deus Ex ดูเหมือนว่าข้อมูลหน่วยเสียงไม่ได้ ถูกเก็บไว้ที่ใดเลย จึงมีความเป็นไปได้ว่าระบบจะดึงแบบเรียลไทม์ระหว่างรัน
- จากการวิเคราะห์ Unrealscript พบว่าเกมใช้ vertex animation แทน skeletal animation และมีเพียงรูปปาก 7 แบบกับแอนิเมชันกะพริบตา 1 แบบเท่านั้น
- ระบบเสียงภายนอกจะกำหนด
nextphoneme เป็น A, E, F, M, O, T, U หรือ X (สถานะปิดปาก) และสคริปต์ตัวละครจะสลับรูปปากตามนั้น
บั๊กและการปรับปรุง
- ในโค้ดเดิม ตรรกะการตัดสินเฟรมเรตทำงานกลับด้าน ทำให้แม้ในเฟรมเรตสูงก็ยังสลับรูปปากทันที
- ระยะเวลาการ blend (
tweentime) ถูกตั้งไว้ สั้นเกินไป (0.1 วินาที) จนการเคลื่อนไหวดูไม่เป็นธรรมชาติ
- ผู้เขียนจึง ไม่สนใจเงื่อนไขตรวจสอบเฟรมเรต และปรับ
tweentime ให้ยาวขึ้นพอสมควรเป็น 0.35 วินาที
- ผลลัพธ์คือ ลิปซิงก์เชื่อมต่อกันได้ลื่นไหลขึ้น
การปิดปากและการกะพริบตา
- มีการเพิ่มตรรกะเพิ่มเติมเพื่อให้ช่วง ปิดปากหลังพูดจบ ใช้การ blend อย่างเป็นธรรมชาติด้วย
- เดิมที ตรรกะแอนิเมชันตรวจแค่
bIsSpeaking แต่ได้ปรับปรุงให้แอนิเมชันลิปซิงก์ทำงานอยู่เสมอ
- ยังมีการปรับ ความเร็วของการกะพริบตา ให้ผู้เล่นสังเกตเห็นได้ต่อเนื่องมากขึ้น
ข้อจำกัดเชิงโครงสร้างและจุดที่น่าเสียดาย
- ตัว ความถี่ในการอัปเดตของ
nextphoneme เองมีความไม่สม่ำเสมอ และมีข้อจำกัดเชิงโครงสร้างที่ทำให้มันไม่ได้อัปเดตทุก tick
- ผลคือ ต่อให้ใส่การ blend ได้ครบถ้วนก็ยัง ไม่สามารถมอบประสบการณ์ลิปซิงก์ที่สมบูรณ์แบบได้
- หากอัปเดตด้วยความถี่คงที่ ก็จะสามารถปรับความเร็วของการ blend ให้เหมาะสมได้ แต่ในโครงสร้างปัจจุบันทำไม่ได้
- ยังมีความไม่มีประสิทธิภาพในโค้ด เช่น การ ทำตรรกะชุดเดียวกันซ้ำ ทั้งในคลาส NPC และคลาสตัวละครผู้เล่น
โค้ดตัวอย่างฉบับแก้ไขขั้นสุดท้าย
- ช่วงท้ายบทความมี โค้ดเต็มของฟังก์ชันลิปซิงก์ที่ปรับปรุงแล้ว ให้ดู
- จุดปรับปรุงหลัก: ไม่ใช้การตัดสินเฟรมเรต, เพิ่ม
tweentime อย่างมาก, ปิดปากอย่างนุ่มนวลหลังจบบทพูด, และปรับความถี่กับความเร็วของการกะพริบตา
บทสรุป
- เมื่อใช้ม็อดนี้ จะได้สัมผัสกับ ลิปซิงก์และแอนิเมชันกะพริบตาที่เป็นธรรมชาติและดีขึ้นกว่าต้นฉบับมาก
- แม้จะยังทำ ลิปซิงก์ที่สมบูรณ์แบบ ได้ยากเพราะข้อจำกัดเชิงโครงสร้าง แต่นี่คือแนวทางแก้ที่ดีที่สุดเท่าที่เข้าถึงได้ในตอนนี้
ยังไม่มีความคิดเห็น