キャラクターembeddingの技術プライマー:内部アーキテクチャ
AI動画スタックにおけるキャラクター一貫性システムが内部でどう動いているかをエンジニア向けに解説。アーキテクチャ、設計判断、失敗モード、未解決の研究課題。
本記事はエンジニア向けです。AI動画ツールを構築または評価しているリサーチャー、ML実務者、開発者を想定しています。キャラクター一貫性が重要である非技術的な概観を求めるなら、完全ガイドから始めてください。
ここでは、現代のAI動画スタックにおいてキャラクターembeddingシステムが実際にどう動いているかを解説します。アーキテクチャ、設計判断、失敗モード、そして我々がまだ解いていない未解決問題をカバーします。
問題定義
生成動画モデルMとキャラクターCが与えられたとき、Cを参照するプロンプト系列p_1, p_2, …, p_nの任意のp_iに対して、生成出力すべてがCの同一性を保持するような手続きを設計したい。
ナイーブなアプローチ — すべてのプロンプトにキャラクター記述を含める — は失敗します。なぜなら拡散サンプリングは確率的で、プロンプトはカテゴリーを記述するのであって同一性を記述しないからです。各生成は記述に合致する有効キャラクター分布からの抽選であり、抽選を跨いで同一性がドリフトします。
記述ではなく、特定の学習済み同一性に対してモデルの出力を条件付けする方法が必要です。
アーキテクチャ
現代のキャラクター一貫性システムは6つのコンポーネントから成ります。
1. 特徴抽出 — 参照から同一性embeddingを生成
2. ストレージ — embeddingをcharacter_idに紐づけて永続化
3. ネガティブプロンプト合成 — ドリフトカタログから自動でnegative_promptを構築
4. コンディショニング注入 — embeddingをモデルのコンディショニングに注入
5. 生成 — コンディション付きモデルで拡散サンプリング
6. 一貫性検証 — 事後の類似度チェック、必要なら再生成順に見ていきます。
1. 特徴抽出
キャラクターのアップロード時に、参照画像に対して複数の専門モデルを実行します。
- 顔エンコーダ:ArcFace、FaceNet、または類似のもの。顔認識最適化された512次元の同一性embeddingを出力。同一性不変な特徴を捉える。
- ボディパーサー:体型と姿勢のためのPIFuまたはSapiens。身長、体格、姿勢を符号化する低次元ベクトル。
- 外観エンコーダ:髪色、肌の色、服のスタイルのためのCLIP(Contrastive Language-Image Pretraining、対照学習による画像エンコーダ)画像エンコーダ。768次元の意味embedding。
- スタイル分類器:参照が写実か、スタイライズか、アニメか等を別途符号化。小さなカテゴリカルベクトル。
これらを連結(またはアテンションで統合)して、高次元のキャラクターembedding e_Cを得ます。総次元数は通常1500〜3000です。
なぜ1つではなく複数のモデルか?同一性は単一エンコーダでは完全に捉えられない複数の軸を持つからです。顔エンコーダは「これは同じ顔か?」に強いですが体型には盲目です。ボディパーサーは顔の細部に盲目です。CLIPは意味的な外観に強いですが細かい同一性を失います。連結することで直交的なカバレッジが得られます。
トレードオフ:抽出パイプラインが複雑になるとアップロード時の計算コストが増えます(業界の多くのシステムでは〜30〜90秒)。コンシューマー向けツールならOK。高スループットパイプラインでは、アップロード時に一度embeddingを事前計算し、生成時に参照できます。
2. ストレージ
各キャラクターは(character_id, embedding_vector, metadata)として保存します。メタデータには以下を含みます。
- ソース参照画像(デバッグと再抽出のため)
- 所有者/プロジェクトの関連
- サブバリアントポインタ(状態バリアント節で詳述)
- スタイルアンカー(クロススタイル作業のため)
- ドリフトモードのオーバーライドリスト(キャラクター単位のカスタマイズ)
ストレージは通常ベクターデータベース(Pinecone、Qdrant、Weaviate)またはカスタムインデックス構造です。ルックアップは高速である必要があります — 100ms未満 — なぜなら毎回の生成で発生するからです。
プライバシー機微なデプロイメントでは、embeddingをテナント単位の鍵で暗号化保存できます。抽出は一方向関数(embeddingから参照画像は復元できません)ですが、実在の人物を扱うシステムでは、embeddingをPIIとして扱うことが正しいデフォルトです。
3. ネガティブプロンプト合成
これがシステムの非自明な部分であり、エンジニアリング作業の大半が存在する場所です。
我々は共通ドリフトモードのカタログを維持しています — 数千件の生成にわたって観測されたカテゴリカルな失敗タイプです。各モードに対して、その失敗を抑制する対応するnegative_promptフラグメントを持っています。
業界カタログの例:
| ドリフトモード | ネガティブプロンプトフラグメント |
|---|---|
| 目の色シフト(茶 → 緑) | 「green eyes, hazel eyes」(参照が茶色の場合) |
| 顎ライン狭窄 | 「narrow jaw, weak chin, soft jawline」 |
| 生え際後退 | 「high hairline, thinning hair, receding hairline」 |
| 肌色暖色化 | 「warm skin tone, golden complexion」(参照がクールトーンの場合) |
| 非対称化 | 「asymmetric face, uneven features」 |
| 目の間隔シフト | 「wide-set eyes, close-set eyes」 |
このカタログを構築するにはラベル付きデータが必要です。業界の多くのチームはパブリックなAI動画ツール(Runway、Pika、Sora等)からの〜10,000件の生成に、現れたドリフトモードをラベル付けしました。クラスタリングにより〜30の異なるモードが生まれ、観測ドリフトの〜85%をカバーしています。
各生成において、システムは:
- キャラクターの参照属性を取り出す
- 各属性の「反対」を計算する(例:参照に濃い目があれば、反対は薄い目)
- 関連するドリフト抑制因子を組み立てたキャラクター単位のネガティブプロンプトを構築する
結果として、プロンプトのみの生成より遥かに強いコンディショニング信号が得られます。
4. コンディショニング注入
動画モデルによってコンディショニングの受け方は異なります。
- 参照画像ベースのモデル(多くのパブリックAPI):参照画像を渡せます。学習済みプロジェクションでembeddingを「合成参照画像」に再エンコードしてから渡します。
- テキストのみコンディショニング:embeddingの学習済みソフトプロンプトプロジェクションを渡します。
- APIレベルのモデルアクセス(利用可能な場合):IP-Adapterコンディショニングのように、embeddingをクロスアテンション層に直接注入します。
業界の多くのチームの経験では、APIレベル注入は参照画像ベースより遥かに効果的ですが、ほとんどのパブリックAPIはこの深さのアクセスを露出していません。利用可能なAPI表面で作業する中で、強力なネガティブプロンプトと参照画像エンコードされたembeddingを組み合わせることで、APIレベル注入の80〜90%まで到達できることがわかっています。
これが、基盤モデルを制御していなくてもキャラクター一貫性レイヤーを構築する意味がある理由の一部です — パブリックAPIが既に露出しているコンディショニング表面には、有意なヘッドルームが存在します。
5. 生成
標準的な拡散サンプリングですが、コンディショニングが以下の組み合わせになります。
- 元のプロンプト(シーン、アクション、フレーミング)
- キャラクターembedding(上記メカニズムで注入)
- ネガティブプロンプト(自動合成)
- スタイルアンカー(セグメントに該当する場合)
生成コストはバニラ生成のおよそ1.0〜1.2倍です。限界費用は小さいです。
6. 一貫性検証
生成後、別の同一性モデル(通常はステップ1で使用したものと同じ顔エンコーダ)を出力に対して実行します。出力の同一性embeddingと元の参照embeddingの間のコサイン類似度を計算します。
閾値:通常0.85のコサイン類似度。閾値以上なら出力は受理されます。閾値以下なら、より厳しいコンディショニング(高いネガティブプロンプト重み、強いembedding注入)で再生成をトリガーします。
これは平均で〜5〜10%の生成コストを追加し(ほとんどのショットは初回でパス)、最悪のドリフトケースがユーザーに到達するのを防ぎます。
うまく機能するもの、しないもの
うまく機能するもの:
- 標準的なシーンバリエーションにおける、単一キャラクターの30ショット以上の高い一貫性
- プロジェクト横断のキャラクターライブラリ再利用(一度抽出、無限再利用)
- クロスプラットフォーム一貫性(同じcharacter_id、合理的範囲内の異なるシーン/スタイル間で同じ同一性)
- 異なる特徴(異なる年齢、性別、民族)を持つマルチキャラクターシーン
より難しいもの:
- 状態バリアント:同じキャラクターだが負傷、加齢、異なる服装。マスターから派生するサブembeddingを使用し、マスターは不変な同一性を、サブはデルタを符号化します。中程度の変動には機能、大規模変換(例:同じキャラクターの8歳バージョン)では破綻。
- マルチキャラクターシーンでの同一性混入:2人のロックされたキャラクターがフレームを共有し、似た特徴を持つ場合(例:両方とも30歳のアジア系女性)、約10%の生成で部分的特徴混入が発生。
- クロススタイル整合性:ロックされた写実キャラクターをスタイライズされた「水彩」セグメントに配置。セグメント単位スタイルアンカーで部分的に解決されますが、劣化は目視可能。
- 動物/非人間キャラクター:同じアーキテクチャが適用されますが、人間の顔以外では顔エンコーダの品質が急落。
- 〜3分超の長尺整合性:ドリフト抑制はショット単位で機能しますが、50ショット以上で蓄積した微差は注意深い視聴者には僅かな視覚的不整合として現れ得ます。
未解決の研究課題
この領域で取り組んでいるなら、解決を見たい課題は以下の通りです。
- 状態バリアント不変量。同一性不変な顔構造を捉えつつ、任意の状態変換を許容する正しい学習表現とは何か?
- サンプリング中のアクティブドリフト検出。現在の一貫性チェックは事後的です。拡散プロセス中にドリフトを検出し、サンプリング途中で補正できるか?
- 暗黙対明示的な同一性のトレードオフ。キャラクター単位の小さなLoRA訓練がembeddingベースのコンディショニングを上回るのはいつか?境界はどこか?
- マルチキャラクター相互作用モデリング。2つのロックされた同一性だけでなく、ショット間で保持される関係性ダイナミクスをどう捉えるか?
- 同一性の不確実性定量化。モデルが同一性について不確かなとき、自信を持ってドリフトする代わりに、その不確かさを表面化できるか?
これらに取り組んでいてノートを比較したいなら、Juyingのチームは本気で関心があります。連絡ください。
ビルダーへの実用的なアドバイス
自社プロダクトにキャラクター一貫性レイヤーを構築するなら、3つのアドバイスがあります。
1. ネガティブプロンプトカタログから始めること。これが最高インパクト・最低コストの勝ち筋です。APIレベルのモデルアクセスは不要 — ネガティブプロンプトはどのパブリックAPIも露出しています。1週間かけて1000生成にラベル付ければ、大半のドリフトをカバーするカタログが手に入ります。
2. 事後検証を過小評価しないこと。単純な「類似度0.85未満なら再生成」ループを追加するだけで、最悪10%の失敗をキャッチし、知覚品質が劇的に向上します。利用可能な90/100 → 95/100品質ブーストの中で、最も安価です。
3. ストレージに早期投資すること。キャラクターembeddingを永続アセットとして扱うことは、複利で効く設計上の洞察です。正しいプリミティブを一度構築すれば、すべての将来の機能(スタイルロック、シーンライブラリ、アセット再利用)が自然に拡張されます。
関連記事
この領域で構築していて話したいなら — info@juying.art