推論・同期・AnimGraphの実装構成
公開ソースのスナップショット · UE 5.8.2 / Windows x64
処理の流れ
「処理の流れ」へのリンクSoundWave → デコード → 16 kHz PCM → 固定窓推論 → 後処理 → Clip ↓音声再生時計 → 現在の表情スナップショット → AnimGraph → ARKitカーブLAMAudio2ExpressionはRuntimeモジュールです。LAMAudio2ExpressionEditorはUncookedOnlyで、AnimGraph編集ノード、モデル設定、接続例生成、PIEテストを担当します。エンジンの改変は不要です。
| 実装 | 担当 |
|---|---|
| LAMAnalyzeAsync | 非同期ロード、解析ジョブ、BP通知、PCMハッシュ、LRUキャッシュ |
| LAMDecoder | Cook済みSoundWaveのデコード、ストリーミングチャンク保持 |
| LAMCore | リサンプル、窓切り出し、NNE推論、CPU代替、後処理 |
| LAMAudio2ExpressionComponent | 再生制御、同期時計、表情スナップショット |
| AnimNode_LAMARKit | スナップショット取得とカーブ合成 |
| LAMLive | マイク・PCM入力、連続リサンプル、ライブ推論、提示遅延 |
| LAMTypes | 52カーブ名、設定、Clip、Profile、補間 |
スレッドと寿命
「スレッドと寿命」へのリンクモデルUObjectのロードとNNEモデル作成はゲームスレッドです。デコード、リサンプル、NNEモデルインスタンス作成、推論、後処理は専用ワーカー1本で処理します。Blueprintへの完了・進捗通知はゲームスレッドです。
実行中のNNE呼び出しそのものは中断しません。キャンセルフラグで後続処理と結果通知を抑止します。EndPlayや非同期アクション破棄時もジョブを無効化します。
AnimNodeはPreUpdateでカーブ配列とProfileをコピーし、Evaluate_AnyThreadではそのコピーとSourcePoseだけを使用します。この段階で推論やUObject検索は行いません。
解析窓と時間
「解析窓と時間」へのリンク通常解析は16,000サンプルずつ進み、各34,133サンプル窓の64出力フレーム中34〜63を採用します。開始前・終了後はゼロで補います。最終フレーム数は整数演算(samples * 30 + 15999) / 16000で求めます。
再生では音声時刻を基準に、次のコールバックまで最大1/30秒の補間予測を許可します。Seekで内部音声を再生成する際は旧再生の通知を無視します。物理的な出力デバイス遅延の補償は含まれません。
キャッシュと共有
「キャッシュと共有」へのリンク解析キャッシュは既定64 MiBで、16 kHz PCMのSHA-1、モデルGUID、スタイル、後処理設定、処理版がキーになります。再生Clipは結果配列を独立して所有するため、キャッシュから追い出されても消失しません。モデルと利用者が保持するClipのメモリはこの予算とは別です。
ライブ処理
「ライブ処理」へのリンク入力キューは最大2秒で、推論用の過去文脈を別に保持します。古い世代の結果は破棄し、遅延時には最新位置へ復帰します。0.2のライブ間隔は可変で、詳細はライブ入力にまとめています。音声のルーティング・Concurrency・イベントは再生制御を参照してください。
保存済みClipの経路(v0.3.0)
「保存済みClipの経路(v0.3.0)」へのリンクプラグイン1f06ac8のULAMBakedExpressionClipは、解析済みのARKit 52カーブをアセットに保持します。再生では配列を共有して52値を補間し、モデルロード・解析用デコード・推論・再生ごとの全配列コピーを省きます。Viseme変換は実行時に残ります。上記の動的解析キャッシュとは別の経路で、v0.3.0に含まれます。生成とロード時の検証を参照してください。
Sequencerとの連携(公開ソース)
「Sequencerとの連携(公開ソース)」へのリンク公開ソースPlugin 1642ffaはRuntimeのLAMAudio2ExpressionSequencerとEditorのLAMAudio2ExpressionSequencerEditorを追加します。Track/SectionはUE標準Audio Track/Sectionを継承し、音声評価はUEに任せます。表情はMovieSceneのTrack Instanceからゲームスレッドで時刻を直接Sampleし、スナップショットを渡してMeshを更新します。通常再生の音声時計とは別の経路です。
同一Actorのセクションをまとめて重み付けし、ARKit 52値を既存AnimBPへ渡します。Viseme変換・Profile補正はAnimBP側に残ります。C++のAcquireSequencerControl/SetSequencerFrame/ReleaseSequencerControlは所有者トークンで制御し、Blueprintには読み取り専用のIs Controlled By Sequencerを提供します。既存Apply LAMノードのピンとClip形式は変更しません。
時刻・所有権・解除条件を参照してください。v0.3.0 ZIPにはこの経路は未収録です。