ゲームプレイ風のNPC会話クリップ
20本のGTA Vクリップで実績のある手法(examples/gta-v、DirectorClips.cs、tools/shoot.ps1、tools/edit.ts):
クリップは1回のやり取り、5~10秒で、誰かの普段のプレイの一場面になり得るもの。
脚本を書く
clip: 水鉄砲
at: grove 通り、家、または "x, y, z, heading"
time: 21 時刻(時)
a: player 最初に話す人: player(プレイヤー)、character(キャラクター)、または声付きpedモデル
b: LamarDavis
line: ラマー、銃をしまえ。水鉄砲だ。
reply: それでも怖いと言い張り、グローブ街で最も恐れられる男だと言う(LLMがその場で生成)
# または承認済みの台詞を固定:
say: [叫び] 水鉄砲が怖いだって?これこそグローブ街で最も恐れられるもんだ!
do: none 再生するアクション(アクション名、またはnone)
NPCのみのクリップ(警官と田舎者、海兵隊員と観光客)は最高の仕上がりになることも:プレイヤーを隠して二人のNPCにやらせよう。
ゲームプレイらしく見せる
- 固定されたゲームプレイカメラ: 毎フレーム、追従カメラのビューモード、プレイヤーに対するヘディングとピッチを設定し、ルック入力を無効にする。固定で十分。シネマティックカメラはトレーラーっぽく見えてしまう。
- 相手をフレームに収める: プレイヤーの前で少し横に立たせる(前方2m、右1m)。プレイヤーが隠れないように。スポットの周囲をレイキャストし、壁、キオスク、玄関から離れた向きにする。
- 地面に接地: 舗装面にスナップさせ、下方向にレイキャストして地面を検出(日よけや屋根で高さ検索が狂うため)。
- 画面をクリーンに: ゲームのHUDと字幕は表示、MODの表示は一切なし(通知、開発パネル、ヘルプテキストなし)。撮影中は電話とヘルプテキストを抑制。
- 先にレンダリング、その後ロール: 返答を書き、アクションを選び、クリップ開始前に両方の音声をレンダリングしてから、連続して再生する。カメラ前でGPU待ちが発生しない。
録画、同期、編集
shoot.ps1:ゲームを前面に持ってきてMODをリロードし、画面(ffmpegddagrab)とPC音声(WASAPIループバック)を別ファイルで録画、スクリプトを開始、フォーカスが失われたらキャプチャを再開(ゲームが一時停止するため)。- 同期: 各キャプチャセグメントの開始時にホワイトフラッシュと1kHzビープ音を出力し、タイムスタンプとともに記録。MODは
clip_start/clip_endと各行のaudio_on/audio_offをタイムラインに記録。 edit.ts --clips <take>:クリップごとに1つのMP4を生成。clip_startの0.2秒前から最後の台詞またはアクションまで。ゲームウィンドウにクロップ、幅1920、ラウドネス正規化。クリップは最大10秒に制限し、途切れる可能性のある行を報告(切ることはしない)。- 台詞を切らずに再撮影: 長くなったクリップは再撮影(新しいレンダリングは長さが変わる)するか、台詞を数語詰める。
say:/do:で承認済みの返答を固定しておけば、再撮影でもジョークがそのまま残る。 - 投稿前に確認: クリップ1コマのコンタクトシート(
ffmpeg -ss 5 ... tile=5x4)で、隠れた相方や壁が写っていないかを数秒で確認できる。
注意点
- 何も起こらない / MODがリロード後に戻らない。 Windows Smart App Controlが新しいDLLを拒否した(Code Integrityイベント3077)。最初に新しいビルドをテストロードし、最後にロードできたものを残しておく。
- テイクのログにビデオ開始が記録されていない。 別のプロセスがログファイルを開いたままにしていた(Windowsで
tail -Fすると書き込みがブロックされる)。別のスクリプトが追記しているファイルを見ないようにする。別のファイルを監視する。 - クリップ途中で電話やヘルプテキストが表示される。 クリップ再生中は毎フレームそれらを抑制する。
- クリップ内の音声は合成音声である。 クリップをどこかに投稿する前に、人間が判断すること。AIによるものであることを明記する。