2026.06.29

See-Through × Kaggle × Claude Code で1枚絵からLive2Dモデルを(ほぼ)自動生成する

前回の記事のFigmaをやめて、PenpotとClaudeで開発してみたから引き続き、遊んでみました。

1枚のキャラクターイラストからLive2Dモデルを作るパイプラインを構築しました。See-Through(Kaggle T4 x2)でAIパーツ分け、GIMP MCPサーバーでPSD自動生成、Cubism Editor 5.xの自動リギング、そしてClaude Code + MCPサーバーで一連の作業を統合制御します。完全自動化はまだ遠いですが、手作業が必要な範囲はかなり狭められました。


 

こんにちは、GMOインターネットグループ AI研究開発室のK.Sです。

なぜ作ったのか

Live2Dキャラクターで、新しいキャラクターを追加したいが、Live2Dモデルの制作は専門スキルが必要で、外注すれば数万〜数十万円、自作でも数日〜数週間かかります。

「キャラの画像素材はある。1枚絵さえあれば、あとはAIで自動化できないか?」

Live2D経験ゼロのエンジニアが、AIの力を借りてどこまで自動化できるかの挑戦です。


全体のワークフロー

最終的にたどり着いた構成はこちら。

Live2Dモデル制作フロー

  1. キャラ画像(1枚)を用意
  2. See-ThroughでAI自動パーツ分け
    全自動
  3. PSD生成
    GIMP + Claude Codeで全自動処理
  4. Cubism Editorでリギング
    半自動
  5. MCP経由でパラメータ調整・動作確認
    AIと対話しながら調整
  6. Live2Dモデル完成

一つずつ見ていきます。

※今回は、同僚の写真を撮り、イラスト化したキャラ画像を使いました。


① See-Through: AIで1枚絵をパーツ分け

Live2Dモデルを作るには、キャラクターの画像を「目」「口」「髪」「顔」などのパーツに分ける必要があります。通常はPhotoshopで手作業ですが、ここをSee-ThroughというAIツールで自動化しました。

See-Throughは1枚のイラストを入力すると、各パーツのPNG画像と深度マップを出力してくれます。ComfyUIのカスタムノードとして動作します。

実行環境はKaggle一択

See-Throughはそれなりのスペックを要求します。

環境 GPU RAM 結果
Google Colab無料枠 T4 12.7GB RAM不足で失敗
Kaggle T4 × 2 29GB 安定動作

Colabの無料枠では途中でメモリが溢れます。Kaggle一択でした。

T4でのbfloat16問題

Kaggleで動かせるものの、T4(Turing世代)はbfloat16に対応していません。See-Throughのコードにはbf16がハードコードされているため、実行前にパッチが必要です。

import glob

ST_PATH = '/kaggle/working/ComfyUI/custom_nodes/ComfyUI-See-through'

for py_file in glob.glob(f'{ST_PATH}/**/*.py', recursive=True):
    with open(py_file, 'r') as f:
        content = f.read()

    if 'bfloat16' in content:
        new_content = content.replace('bfloat16', 'float16')

        with open(py_file, 'w') as f:
            f.write(new_content)

力技ですが、全.pyファイルのbfloat16をfloat16に一括置換するだけで動きます。

seedガチャという現実

See-Throughの生成品質はseed値に大きく依存します。同じ画像でもseedが変わるとパーツの境界が全く違う結果になります。

パラメータ 説明 推奨値
seed 乱数シード 複数試して選ぶ
resolution 処理解像度 1024
num_inference_steps 推論ステップ数 50

1回あたり25〜30分かかるので、3パターン程度が現実的なライン。生成されたレイヤーを重ねてカバレッジ(元画像をどれだけ復元できるか)を比較し、最も良いものを選びます。今回は約72%のカバレッジが最高値でした。残りの28%は髪のサイド部分や肩の領域が白抜けになります。

出力形式

See-ThroughはパーツごとのPNG + 深度マップに加え、layers.jsonにメタデータを出力します。

{
  "width": 1024,
  "height": 1024,
  "layers": [
    {
      "name": "back hair",
      "left": 379,
      "top": 170,
      "depth_median": 0.900
    },
    {
      "name": "face",
      "left": 402,
      "top": 194,
      "depth_median": 0.486
    }
  ]
}

depth_median(0.0が手前、1.0が奥)がパーツの前後関係を決めます。この値がPSD生成時のレイヤー順序に直結する重要な情報です。

 

 


② PSD生成: 地味に最大の沼

See-Throughの出力はパーツごとのPNGファイルです。Cubism Editorで読み込むにはPSD形式に変換する必要があります。

「PNGをPSDにまとめるだけでしょ?」——そう思っていました。

失敗の歴史

方法 Cubism互換 備考
pytoshop単体 NG Cubism Editorで開けない
ImageMagick NG 同上
pytoshop + psd-tools再保存 OK Python完結だが不安定
GIMP OK 最も安定。最終的にこれを採用

pytoshopでPSD構造をゼロから構築してみたところ、Pythonとしては問題なく書き出せるのにCubism Editorで開くとエラー。ImageMagickでも同様。PSD仕様は公開されていますが、Cubism Editorが要求する構造が微妙に厳しいようです。

pytoshopで構築→psd-toolsで再保存という2段階変換で一応読み込めるようになりましたが、user_layer_maskチャンネルの追加が必須だったり、レイヤー名にASCII以外を使うと文字化けしたりと、地雷が多い。

最終的にGIMPでPSDを保存するのが最も安定するという結論に至りました。GIMPは業界標準のPSD出力に対応しているので、互換性の心配がありません。

GIMP + Claude Code で全自動PSD生成

GIMPをプログラムから操作する方法はいくつかあります。Script-Fuスクリプトを生成する方法と、GIMP MCPサーバー経由でClaude Codeから直接操作する方法を併用しました。

アプローチA: Script-Fu生成

Pythonでlayers.jsonを読み、GIMP Script-Fuスクリプトを自動生成します。

(let*
  (
    (image (car (gimp-image-new 1024 1024 RGB)))
    (layer 0)
  )

  ;; 背景レイヤー
  (set! layer
    (car
      (gimp-file-load-layer
        RUN-NONINTERACTIVE
        image
        "background.png"
      )
    )
  )
  (gimp-image-insert-layer image layer 0 -1)

  ;; See-Throughパーツ(depth順に追加)
  (set! layer
    (car
      (gimp-file-load-layer
        RUN-NONINTERACTIVE
        image
        "back_hair.png"
      )
    )
  )
  (gimp-image-insert-layer image layer 0 -1)
  (gimp-layer-set-offsets layer 379 170)
  (gimp-item-set-name layer "back_hair")

  ;; ... 20パーツ分 ...

  ;; PSDとして保存
  (file-psd-save
    RUN-NONINTERACTIVE
    image
    (car (gimp-image-get-active-drawable image))
    "/path/to/output.psd"
    "output.psd"
    0
    0
  )
)

アプローチB: GIMP MCPサーバー経由

GIMP MCPサーバーを導入すると、Claude CodeからGIMPを直接操作できます。

{
  "mcpServers": {
    "gimp": {
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "/path/to/gimp-mcp",
        "gimp_mcp_server.py"
      ]
    }
  }
}

GIMPのPython APIをMCP経由で呼び出し、レイヤーグループの作成やPSD保存ができます。

# Claude CodeからGIMPを操作(MCP経由)

group = Gimp.GroupLayer.new(image)
group.set_name("EyeL")

image.insert_layer(group, None, 0)

image.reorder_item(eyelash_layer, group, 0)
image.reorder_item(eyewhite_layer, group, 1)

ハマりポイント: レイヤーグループが超重要

ここが最大の学びでした。PSDのレイヤーグループがCubism Editorのパーツフォルダになるのです。

レイヤーをフラットに並べたPSDを読み込むと、Cubism Editorでは全てのパーツがフォルダなしで表示されます。これだと、Cubism Editorの「顔のデフォーマの自動生成」機能がパーツを認識できず、ドロップダウンが空っぽになります。

[PSD]                         [Cubism Editor]

レイヤーグループ "EyeL"   →   パーツフォルダ "EyeL"
├── eyelash-l              →   ├── eyelash-l  (ArtMesh)
└── eyewhite-l             →   └── eyewhite-l (ArtMesh)

GIMPでレイヤーグループを作ってからPSD保存することで、Cubism Editorが各パーツを正しく認識するようになりました。

最終的なグループ構成は以下の通り。

グループ名 中身 備考
FrontHair front_hair 最手前
EyebrowL / EyebrowR eyebrow-l / eyebrow-r
Eyewear eyewear メガネ
EyeL / EyeR eyelash + eyewhite まつげ + 白目
IridesL / IridesR irides-l / irides-r 黒目
Nose nose
Mouth mouth
Face face
EarsL / EarsR ears-l / ears-r
Topwear topwear
Neck neck
HandwearL / HandwearR handwear-l / handwear-r
BackHair back_hair 最奥

③ Cubism Editorでリギング: 半自動の世界

PSDをCubism Editorに読み込んだら、リギング(動きをつける作業)です。ここが最も時間のかかる工程ですが、Cubism Editor 5.xの自動化機能でかなり省力化できました。

自動でできたこと

1. 描画順の設定

GIMPのレイヤー順序がそのままCubism Editorの描画順に反映されます。PSD生成時にdepth_median順でレイヤーを並べておけば、Cubism Editor側での並べ替えは不要です。

ただし、数値としては全レイヤーがデフォルト500になるので、手動で調整する必要があります(back_hair=100, face=300, front_hair=500 など)。

注意点: See-Throughの深度値は白目(eyewhite)を黒目(irides)より手前に配置することがあります。正しくは白目→黒目→まつげの順(奥→手前)なので、目の描画順だけは手動チェックが必要です。

2. メッシュの自動生成

全パーツ選択 → Ctrl+A で自動メッシュ生成。一瞬で完了します。

3. 顔のデフォーマの自動生成

メニュー → モデリング → 顔のデフォーマの自動生成。顔のパーツにワープデフォーマを自動配置してくれます。前提条件としてPSDにレイヤーグループが必須(前述)。

4. 顔の動きの自動生成(角度X/Y)

顔のデフォーマが作られた後、メニュー → モデリング → 顔の動きの自動生成。「角度X」「角度Y」「四隅」のボタンを押すだけで、顔を左右・上下に動かすキーフォームが自動生成されます。

Live2Dの自動化は、最新のアップデートでだいぶ自動化が進みましたので、参考に載せておきます。

[AI機能]顔の動きの自動生成

【AI機能】デフォーマの自動生成

自動化できなかったこと

目の開閉・口の開閉のキーフォームは手動です。Cubism Editorの自動生成は角度X/Yのみ対応で、まばたきや口パクは対象外です。

テンプレート機能(既存モデルの動きを転写)も試しましたが、See-Throughのパーツ構成と標準的なLive2Dモデルの構成が違いすぎて、体がぐにゃっと崩れてしまいました。目が3パーツ(まつげ・白目・黒目)に分かれている点が特に相性が悪かったです。

自動化スコアカード

工程 自動化 備考
パーツ分け 全自動 See-Through
PSD生成 全自動 GIMP + Claude Code
メッシュ生成 全自動 Ctrl+A
デフォーマ生成 全自動 顔のデフォーマの自動生成
顔の角度X/Y 全自動 顔の動きの自動生成
描画順の設定 手動 数値の調整が必要
目の開閉 手動 キーフォーム手作成
口の開閉 手動 キーフォーム手作成
揺れ・呼吸 半自動 物理演算で設定可

④ MCPサーバー: AIからCubism Editorを操作

Cubism Editor Plugin APIをMCP(Model Context Protocol)サーバーとしてラップし、Claude Codeから直接Cubism Editorを操作できるようにしました。

アーキテクチャ

Claude Code
    ↓↑
MCP Server
    ↓↑ stdio
WebSocket
    ↓↑
Cubism Editor Plugin API
localhost:22033

MCPサーバーはTypeScript/Node.jsで実装。@modelcontextprotocol/sdkを使い、stdioトランスポートでClaude Codeと通信します。Cubism EditorへはWebSocketで接続し、トークンベースの認証で永続セッションを維持します。

何ができるか

// モデル情報の取得

get_current_model();       // アクティブなモデルのUID
get_parameters();          // 全パラメータ一覧
get_parameter_values();    // 現在の値


// パラメータの操作

set_parameter_values([
  {
    Id: "ParamAngleX",
    Value: 15
  },
  {
    Id: "ParamMouthOpenY",
    Value: 0.8
  }
]);

clear_parameter_values();  // デフォルトにリセット

実際の使い方

AIとの対話でモデルを操作します。キーフォーム生成後の動作確認に特に便利です。

自分:
「顔を右に向けて」

Claude:
set_parameter_values で ParamAngleX = 20 を設定

結果:
Cubism Editorの画面でキャラが右を向く


自分:
「目を閉じて」

Claude:
ParamEyeLOpen = 0
ParamEyeROpen = 0
を設定

結果:
目が閉じた状態になる


自分:
「デフォルトに戻して」

Claude:
clear_parameter_values を実行

結果:
正面向き・目開き・口閉じの状態に戻る

手でスライダーを動かす代わりに自然言語で指示できるので、パラメータの組み合わせを試すときに楽です。

ツールチェーン全体像

最終的に、2つのMCPサーバーをClaude Codeから同時に利用する構成になりました。

Claude Code
├── cubism-mcp-server ←→ Cubism Editor(パラメータ操作)
└── gimp-mcp-server   ←→ GIMP(PSD生成・画像操作)

AIアシスタントが画像処理(GIMP)とモデル操作(Cubism Editor)の両方を一元的に制御できます。「GIMPでレイヤーグループ作ってPSD保存して」「Cubism Editorでパラメータ確認して」といった作業を、一つの対話の中で完結できます。


振り返り: 何が難しかったか

1. PSD互換性の罠

一番時間を使ったのがPSD生成です。PSD仕様は一見シンプルですが、Cubism Editorが要求する構造が微妙に厳しい。pytoshop → psd-tools → GIMPと3段階の試行錯誤を経て、「業界標準のツール(GIMP)に任せるのが一番」という当たり前の結論にたどり着きました。

2. レイヤーグループの存在を知らなかった

PSDのレイヤーグループがCubism Editorのパーツフォルダに対応するという事実は、Live2D経験者なら常識なのかもしれません。でもゼロから始めた自分にはこれが分からず、Cubism Editorの自動生成機能が動かない原因の特定に苦労しました。

3. See-Throughと標準Live2Dの構成のギャップ

See-Throughは目を「まつげ」「白目」「黒目」の3パーツに分けますが、Live2Dの標準構成では「目」は1パーツです。このギャップがテンプレート機能の適用を難しくしています。


まとめ

項目 結果
パーツ分け 全自動(See-Through)
PSD生成 全自動(GIMP + MCP)
リギング基礎(メッシュ、デフォーマ、角度X/Y) 全自動(Cubism Editor AI機能)
目の開閉・口の開閉 手動
パラメータ調整・動作確認 AIと対話(MCP)

「1枚絵 → Live2Dモデル」の完全自動化はまだ遠いですが、手作業が必要なのは目と口のキーフォーム作成くらいまで絞り込めました。

工数で見ると、従来は絵師+Live2Dモデラーの分業で数日〜数週間かかる工程が、AIの支援でパーツ分け30分 + PSD生成5分 + リギング基礎10分 + 手動調整1〜2時間程度に短縮できています。

MCPによるツール統合は想像以上に強力でした。GIMPとCubism Editorという全く異なるGUIアプリケーションを、AIアシスタントとの対話だけで横断的に操作できる体験は、今後のクリエイティブワークフローの可能性を感じさせてくれます。


グループ研究開発本部 AI研究開発室では、データサイエンティスト/機械学習エンジニアを募集しています。ビッグデータの解析業務などAI研究開発室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ募集職種一覧 からご応募をお待ちしています。

  • Twitter
  • Facebook
  • はてなブックマークに追加

グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。

 
  • AI研究開発室
  • 大阪研究開発グループ

関連記事