Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】My Deus Ex lipsyncing fix mod

2025年09月26日に「Hacker News」が公開したITニュース「My Deus Ex lipsyncing fix mod」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

PCゲーム「Deus Ex」のキャラクターの口の動きと音声のズレ(リップシンク)を修正するModの作成経緯や技術的工夫を解説。ゲームの不具合を解消するMod開発の過程から、問題解決に向けたアプローチの具体例を学ぶことができる。

出典: My Deus Ex lipsyncing fix mod | Hacker News公開日:

ITニュース解説

Deus Exというゲームには、キャラクターの口の動きと音声が一致しない「リップシンク」の問題があった。これはゲームの没入感を損ねる大きな要因で、多くのプレイヤーが指摘していた点だ。この問題はなぜ発生し、どのように解決されたのか、その技術的な背景を見ていこう。

まず、リップシンクがずれる根本的な原因は、ゲームが音声ファイルを読み込み、それを再生する処理と、キャラクターの口の動きをアニメーションさせる処理が、うまく同期していなかったことにある。特に問題となったのは、音声ファイルが非常に長く、さらに圧縮されている場合だ。これらの音声ファイルは、ゲームがインストールされているディスクから読み込まれる。ディスクからデータを読み込む処理は、メモリからデータを読み込むよりも時間がかかるため、特に大きなファイルでは遅延が発生しやすい。ゲームエンジンは、この遅延を考慮せずに音声データがすぐに利用可能になると想定して口の動きのアニメーションを開始してしまうため、音声が始まる前に口だけが動いてしまったり、音声が終わってからもしばらく口が動き続けたりする現象が起こっていた。

この問題に対して、過去にもいくつかの解決策が試みられていた。ゲーム内には「Use Old Audio Playback」というオプションが用意されていたが、これを有効にすると他のオーディオ再生に問題を引き起こす可能性があったため、根本的な解決にはならなかった。また、Windowsのオーディオ再生機能であるDirectSound3Dが特定のサウンドカードやドライバと相性が悪く、不安定な動作をするケースもあった。DirectSound自体も、古いバージョンではオーディオデータを一時的に保持する「バッファ」の管理が不十分で、再生と読み込みの同期を正確に行うのが難しかったのである。つまり、音声データをスムーズに供給し続けるための技術的な基盤が、当時のDeus Exでは十分に確立されていなかったと言える。

この状況を改善するため、著者はDeus Exと同じUnreal Engine 1をベースに開発された別のゲーム「Unreal Gold」のコードを詳細に調査した。Unreal GoldはDeus Exよりも後にリリースされており、オーディオ処理に関してDeus Exにはない改善が施されている可能性があったからだ。実際にUnreal Goldのコードを調べると、UdpAudio.cppというファイルに、Deus Exよりも洗練されたオーディオ処理ロジックが実装されていることが判明した。これは、新しいゲームで導入された改善点を、古いゲームに移植する「バックポート」という手法で問題を解決できる可能性を示唆していた。

著者はUnreal Goldで見つかった改善点をDeus Exに適用することを目指した。その中心となったのは、オーディオデータの「ストリーミング再生」の概念だ。従来の方式では、音声ファイル全体をメモリに読み込んでから再生を開始する「全て読み込み型」が主流だったが、これでは長い音声ファイルの場合、読み込み完了までに時間がかかり、それがリップシンクの遅延につながっていた。ストリーミング再生では、音声ファイルを少しずつメモリに読み込み、読み込んだ部分から順に再生していく。これにより、ファイル全体を待つ必要がなくなり、再生の開始を早め、常に新しいデータを供給し続けることができるようになる。

このストリーミング再生を実現するために、ゲームエンジンのオーディオ処理部分にいくつかの重要な変更が加えられた。まず、新しいオーディオバッファの再生モードを示すAUDIOPLAYBACK_SOUNDというフラグが導入された。これは、既存のバッファをより効率的なストリーミングモードで扱うための目印となる。次に、サウンドファイルのデータを取得するUCacheSound::GetSoundWave関数と、サウンドを再生キューに入れるUAudioSubsystem::QueueSound関数が改善された。特にQueueSoundでは、バッファが不足した場合の処理ロジックが見直され、ストリーミング再生を円滑にサポートするように変更された。

さらに重要な変更として、UAudioSubsystem::StreamSoundsという新しいメソッドが導入された。このメソッドは、ゲームの更新ループ内で定期的に呼び出され、再生中のサウンドバッファがデータ不足にならないよう、常にデータを補充する役割を担う。これにより、音声再生が途切れることなく、スムーズにストリーミングされることが保証される。また、これまで多くの処理を抱え込んでいたUAudioSubsystem::Update()関数からサウンドストリーミングに関する処理を分離し、より効率的なループでオーディオ処理を管理するように変更された。これにより、ゲーム全体のパフォーマンスにも良い影響を与えることが期待できる。

他にも、特定の状況で間違ったオーディオデータを返してしまう可能性があったUCacheSound::GetWaveData関数のバグが修正されたり、空いているオーディオバッファを効率的に取得するためのUAudioSubsystem::GetFreeBuffer関数が最適化されたりした。これらの細かな改善が積み重なることで、オーディオデータの読み込み、バッファへの書き込み、そして再生という一連の流れが、より正確かつ効率的に同期されるようになったのだ。

これらの技術的な修正がDeus Exに適用された結果、リップシンクの問題は劇的に改善された。特に、圧縮された長い音声ファイルでの口の動きと音声の同期が大幅に向上し、プレイヤーはより自然で没入感のあるゲーム体験を楽しめるようになった。この事例は、単にバグを修正するだけでなく、既存のゲームエンジンの仕組みを深く理解し、別のプロジェクトで培われたより良い技術を適用することで、長年の問題を根本的に解決できることを示している。システム開発において、既存のコードを分析する力、そして最新の技術動向や他プロジェクトでの解決策を調査し、自らのプロジェクトに適用する「バックポート」の技術は非常に重要であることがわかるだろう。

関連コンテンツ