コンテンツにスキップ

Live2D はじめに

Live2D を使えば、エージェントが感情、動作、ツール呼び出しにリアルタイムで反応するアニメーションアバターで自己表現できます。このガイドでは、インポートから最初のアニメーションまでの完全なセットアップ手順を説明します。

AnySoul は Live2D Cubism モデルをエージェントのアニメーションアバターとして統合しています。静止画の代わりに、エージェントの感情状態、動作、ツール使用に動的に反応するビジュアルを実現します。

従来の VTuber セットアップでは、カメラによるフェイストラッキングで人間がモデルを操作します。AnySoul では 言語モデルの出力 がアバターを自動駆動します。LLM が会話中に感情や動作を出力し、マッピングルールがそれを Live2D パラメータアニメーションに変換します — カメラは不要です。

2 つのレンダリングモード:

  • Web — ブラウザ内でチャットと一緒に Live2D アバターをレンダリング
  • デスクトップペット — デスクトップ上の透明オーバーレイウィンドウ(Electron アプリ)

対応モデル: Cubism 3、4、5(.model3.json 形式)

Live2D のセットアップは 3 つのステップで行います。各ステップは Live2D 設定パネルのタブに対応しています:

┌─────────────────────────────────────────────────────────────────┐
│ Live2D セットアップの流れ │
│ │
│ ① Model タブ ─── インポートとデフォルト設定 │
│ │ ZIP アップロード → デフォルトパラメータ値を設定 │
│ │ (待機ポーズ: 目の開き具合、口の形、頭の角度など) │
│ │ │
│ ▼ │
│ ② Mapping タブ ─── アニメーションクリップ │
│ │ 再利用可能なクリップを作成: │
│ │ "smile" → ParamMouthForm: 0→0.8, ParamEyeLOpen: 1→0.7 │
│ │ "think" → ParamAngleX: 0→-8, ParamEyeLOpen: 1→0.5 │
│ │ "speak" → ParamMouthOpenY: 0↔0.6 サイクル (ループ) │
│ │ │
│ │ 各クリップの再生モード: │
│ │ · One Shot — 1回再生して終了 │
│ │ · Loop — トリガー終了まで繰り返し │
│ │ · Repeat N — 正確にN回再生 │
│ │ │
│ │ 完了ポリシー: │
│ │ · Complete — トリガー終了後もアニメーションを最後まで再生 │
│ │ · Bound — トリガー終了時に即停止 │
│ │ │
│ ▼ │
│ ③ Mapping タブ ─── ルール │
│ │ LLM出力 → クリップを接続: │
│ │ emotion=happy → "smile" クリップ再生 │
│ │ emotion=thinking → "think" クリップ再生 │
│ │ action=speaking → "speak" クリップ再生 (ループ) │
│ │ tool_call=web_search → "search" クリップ再生 │
│ │ idle → "breathing" クリップ再生 (ループ) │
│ │ │
│ │ マッチした全ルールが同時に発火。 │
│ │ 競合はクリップ優先度+ブレンドモードで解決。 │
│ ▼ │
│ │
│ 会話 → LLM が emotion/action 出力 → ルールマッチ │
│ → クリップ再生 → パラメータアニメーション → モデルが動く │
└─────────────────────────────────────────────────────────────────┘

ステップ 1: モデルのインポートとデフォルト設定

Section titled “ステップ 1: モデルのインポートとデフォルト設定”

Live2D モデルは以下の構造を含む ZIP ファイル にパッケージする必要があります:

my-model.zip
├── model.model3.json # 必須 — モデル定義
├── textures/ # テクスチャ画像 (.png)
│ └── texture_00.png
├── motions/ # モーションファイル (.motion3.json)
│ ├── idle_01.motion3.json
│ └── happy.motion3.json
└── expressions/ # 表情ファイル (.exp3.json)
├── smile.exp3.json
└── surprised.exp3.json

モデルの入手先:

  1. エージェントの設定パネルを開く
  2. Live2D Model 設定に移動
  3. Model タブをクリック
  4. Upload Model (ZIP) をクリックして ZIP ファイルを選択
  5. インポート完了を待つ — モデルがプレビューエリアに即座にレンダリングされます

インポート後、エージェントのスタンディングタイプは自動的に Live2D モードに切り替わります。

Parameters タブに切り替え、モデルの 待機ベースライン を設定します — アニメーションが再生されていない時のニュートラルポーズ:

  • ParamEyeLOpen / ParamEyeROpen を自然な開き具合に設定(例:0.85)
  • ParamMouthForm でデフォルトの表情を設定(-1 = すぼめ、0 = ニュートラル、1 = 微笑み)
  • — 軽い傾きが欲しければ ParamAngleX/Y/Z を調整
  • アイドルモーションMotions セクションでデフォルトのアイドルモーションをピン留め(例:穏やかな呼吸ループ)

これらのデフォルト値は、アニメーションクリップの再生終了後にモデルが戻る状態です。

インポート後の操作:

  • 名前変更 — モデル名の横にある鉛筆アイコンをクリック
  • エクスポート — バックアップや共有用に ZIP としてダウンロード
  • 削除 — モデルを削除して静止画モードに戻す
  • マウス追従 — 有効にするとモデルがカーソルを追跡

ステップ 2: アニメーションクリップの作成

Section titled “ステップ 2: アニメーションクリップの作成”

Mapping タブに切り替えます。クリップは構成要素 — 各クリップはルールによってトリガーできるパラメータアニメーションを定義します。

クリップは、1 つ以上のモデルパラメータを時間経過とともに変化させる再利用可能なアニメーションです。例えば、「微笑み」クリップなら:

  • ParamMouthForm を 0 から 0.8 に 200ms で増加
  • ParamEyeLOpen を 1.0 から 0.7 に 200ms で減少
  • 1 秒間保持した後、500ms でデフォルトに戻る

3 つの作成方法:

  1. 手動Add Clip をクリック、パラメータトラックを追加してキーフレームを設定。精密なマルチパラメータ制御には Full Editor(タイムライン)を使用。
  2. 表情からインポートCreate From Expression でモデルの .exp3.json プリセットを、Enter/Hold/Release タイミング設定付きのクリップとしてインポート。
  3. モーションからインポートImport Motion As Clip.motion3.json を編集可能なキーフレームクリップに変換。
モード動作使用場面
One Shot1 回再生して終了リアクション(うなずき、手を振る、驚き)
Loopトリガー終了まで繰り返し持続状態(話す口の動き、考え中)
Repeat N正確に N 回再生固定シーケンス(3 回まばたき、2 回うなずき)

トリガー条件がアニメーション途中で終了した時の動作を制御:

ポリシー動作使用場面
Completeアニメーション全体を最後まで再生してから終了ジェスチャーを途中で切りたくない場合
Boundトリガー終了時に即停止エージェント状態変化に厳密に同期

詳細なクリップリファレンスは アニメーションとマッピング を参照してください。


ステップ 3: マッピングルールの設定

Section titled “ステップ 3: マッピングルールの設定”

ルールはエージェントの言語モデル出力とアニメーションクリップを接続する「のり」です。これが AnySoul の Live2D を従来の VTuber セットアップと差別化するポイントです — フェイストラッキングの代わりに、LLM がモデルを駆動 します。

会話中、LLM はテキスト応答とともに構造化メタデータを出力します:

  • Emotion — エージェントの感情(happy、sad、angry、thinking など)
  • Action — エージェントの動作(speaking、nodding、waving など)
  • Tool calls — 使用中のツール(web_search、manage_memory など)

ルールはこれらの出力をクリップにマッピング:

┌──────────────────────┐ ┌──────────────────────┐
│ LLM 出力: │ │ ルールマッチ: │
│ emotion = happy │ ──► │ → "smile" クリップ │
│ action = speaking │ ──► │ → "speak" クリップ │
└──────────────────────┘ └──────────────────────┘
タイプマッチ対象
Emotionエージェントの感情状態emotion = happy
Actionエージェントの動作action = speaking
Tool Call使用中のツールtool_call = web_search
Textモノローグ内の部分文字列text contains "haha"
Idleアクティブなトリガーなし背景の呼吸アニメーション

条件は * ワイルドカード(任意の値にマッチ)と複合ロジック(AND / OR)をサポートしています。

条件を満たすすべてのルールが 同時に 発火します。エージェントが「happy」で「speaking」の場合、smile ルールと speak ルールの両方がトリガーされ、クリップが並列再生されます。

複数のクリップが同じパラメータに影響する場合、クリッププライオリティ(0–3)と ブレンドモード(Add / Multiply / Overwrite)で競合が解決されます。詳細は アニメーションとマッピング を参照。

常時再生のバックグラウンドアニメーション(呼吸、微妙な揺れ、まばたき)には:

  • Loop 再生のクリップを作成
  • 通常のルールではなく Idle Behavior として追加
  • 他のルールがマッチしない時に継続的に再生され、アイドル中でもモデルに自然な動きを与えます

3 つのステップ完了後:

  1. プレビューエリア — デフォルトパラメータでモデルが正しくレンダリングされることを確認
  2. ルールテスト — Mapping タブの シーケンステスター で emotion/action シーケンスをシミュレートし、クリップが正しくトリガーされることを確認
  3. チャットテスト — エージェントと会話を開始し、アバターがリアルタイムで反応するのを確認