1枚の絵からLive2Dモデルを作る
このキットは、1枚の全身キャラクター描画から、AIRIやOpen-LLM-VTuberなどのアプリが読み込めるLive2Dモデルを生成します。スクリプトが作業を行います。あなたの役割は、手順を順番に実行し、各手順の結果を確認し、次の手順がその上に構築する前に問題を修正することです。初期段階で見逃した欠陥(レイヤーの位置間違い)は、後で追跡がはるかに困難な問題(コートの後ろに隠れた脚)となって現れます。
すべてはプロジェクト内から実行する1つのコマンドで操作します:
python <このフォルダ>/live2d.py <step> <name> ...
<name> はキャラクターのフォルダ名です。live2d.py は各ステップに必要なPythonを自動選択し、実行するコマンドを表示します。最初のキャラクターを作成する前に、このフォルダ内の README.md を一度読んでください。ダウンロード、設定ファイル、各ステップとそのコマンド、レイヤー修正テーブルが記載されています。このファイルは、手順を適切に進めるためのガイドです。
人向けのGUIもあります(live2d.py gui:同じステップがページ上のボタンとして表示されます)。エージェントはコマンドを使用してください。
始める前に
live2d.py checkを実行します。インストールされているものと、各ステップに不足しているものが表示されます。何か不足している場合は、ユーザーにその内容と入手先(READMEの「必要なもの」)を伝えてください。ダウンロードは数ギガバイトあります。開始する前にユーザーに確認を取ってください。キットがまだ使用されていないプロジェクト(checkでlive2d-kit.jsonがないと表示される場合)では、プロジェクトのトップフォルダから最初にlive2d.py initを実行します。これにより設定ファイル、ルックスファイル、およびこのスキルのポインタが作成され、既存のものは変更されません。init --like <別のプロジェクト>は、ツールのパスを既存のプロジェクトからコピーします。live2d.py status <name>を実行します。完了したステップにチェックを入れ、次のコマンドを表示します。キャラクターの作業を再開するときは、ファイルから推測するのではなく、これを使用してください。- グラフィックカードを使用するステップ(draw、cutout、upscale、split)の前にユーザーに確認を取ってください。これらのステップはカードを専有する必要があり、ユーザーが他の処理を実行している可能性があります。
splitは空いているカードで1パスあたり約10分かかり、他の処理が一部でも占有していると数時間かかる場合があります。その旨を伝え、バックグラウンドで実行してください。 draw --runpodは有料です。ユーザーが明示的に要求した場合のみ使用してください。- 自分が開始したものだけを開始・停止してください。
live2d.py comfy statusは、ComfyUIが実行中かどうかと、誰が開始したかを表示します:このプロジェクトか、別のフォルダか(その場合は他の誰かのものです。使用しても構いませんが、停止しないでください)。comfy stopは、このプロジェクトのcomfy startが開始したものだけを停止します。描画、切り抜き、アップスケールのステップが完了したら、あなたのComfyUIを停止してください。
各ステップと確認項目
| ステップ | コマンド | 正しい状態 |
|---|---|---|
| 描画 | comfy start、次に draw <round> --character <name> --seeds ... | ユーザーが1つを選択する。コンタクトシートを見せる。ユーザーが依頼しない限り、代わりに選ばないこと |
| 選択 | pick <name> <picture> | 描画がREADMEの「リギングに適した描画」に適合している。適合しない場合(腕が体に密着、脚が揃っている、手に小道具を持っているなど)、先に進む前に何が問題になるかを伝える |
| 切り抜き、アップスケール | cutout <name>、upscale <name>、comfy stop | full/cutout.png にキャラクター全体が写っており、背景がない。draw からの描画は既に透明度を持っている:pick が既に切り抜きを済ませているため、cutout は何もせず、upscale のみが必要 |
| 分割 | split <name> body | レイヤーが出力される。約17枚が期待される:髪、顔、目、眉、鼻、口、首、服、腕、脚、靴 |
| レイヤー確認 | layers check <name> | カウントが数千ピクセルの細いアウトラインである。保存された画像を確認する。真っ赤なブロックは、他のレイヤーを覆っているレイヤーを示す |
| ヘッドパス | split <name> head、layers scale <name> 2、layers head ...、layers under <name> neck face | layers check を再度実行:カウントが急増しないこと。顔レイヤーが描画の顔と一致すること |
| パーツ | parts closed-eyes <name>、parts mouth <name> | レイヤーに eye_close と mouth_open が含まれている。どの開いた口とどの赤面を使用するかはユーザーの好み:parts mouth-sheet <name> と parts blush-sheet <name> を実行し、2枚の画像を見せて番号を選んでもらう(READMEの「口と赤面」)。口が大きすぎる、小さすぎる、高い、低い、傾いている場合は、--size、--down、--right、--turn で修正可能。まず mouth-sheet で修正結果を見せる。赤面も同様に --size、--in、--down、--turn を使用する。parts mouth-oh <name> は、怖がった・驚いたときの「O」の口を追加する。閉じた口が細すぎて見えない場合は、parts mouth-line <name> --try で再描画を確認、parts mouth-line <name> で作成、その後 parts mouth <name> を再度実行 |
| ビルド | build <name> | 出力(下記)を読む |
| 表示 | view、次に確認シート(下記) | READMEの「モデルを試す」のリスト |
キャラクターの説明はプロジェクトのルックスファイルから取得されます(check が保存場所を表示します。READMEの「ルックスとスタイル」にフォーマットがあります)。描画前にルックスをそこに記述するか、そこで変更してください。それが彼女の見た目を定義する唯一の場所であり、次のラウンドや次のエージェントが同じキャラクターを描画するためです。ルックスは髪、目、体型、服装のみです。キットがフレーミングとポーズ自体を追加するため、それらを繰り返したり別のポーズを要求するルックスはリギングの妨げになります。draw ... --show は描画せずにプロンプト全体を表示します:グラフィックカードを使う前に読んでください。--look "..." は1回限りの使用です。
分割後、<characters>/<name>/layers/full/parts/ 内の各レイヤー画像を一度確認してください。探すものは3つです:一緒に動かなければならない2つのものを保持するレイヤー(コートの前面と背面の内側)、順序が間違っているレイヤー、1つの形状として出力されたペア(腕、脚、目)。READMEの「レイヤーの修正」に各ケースの対処法が記載されています。設定の理由は彼女の live2d.json の "why" に記述してください。後で見た人があなたが見たものを理解できません。
ビルド出力の読み方
head: her head turned -9.9 degrees ...:どれだけ頭をまっすぐにしたか。「No pair of eyes or brows」は、目のレイヤーが左右に分割されなかったことを意味します:最初にそのレイヤーを修正してください。head turn: 13_face_base as face; 16_accessory as glasses; ...:各頭部パーツを何と認識したか。誤って認識されたパーツは正しく動きません:メガネとしてリストされていないメガネは目からずれます。body: her feet at ..., knees ..., hips ..., neck ...; 2 arms that bend, 2 legs that bend; ...:0 arms または 0 legs は、そのペアがレイヤー上で1つの形状になっていることを意味します。Feet at 0.000 はレイヤーの下部に浮遊ピクセルがあることを示します。hair: 6 sections that swing each by itself (...):髪がどのように分割されたか。前髪1セクション、後ろ髪1セクションは、髪が細いか、レイヤーが分割されていることを意味します:欠陥ではありません。in the texture at the head pass's own size: face, eyelash, ...:ヘッドパスのサイズでテクスチャに含まれた頭部パーツ。該当行がない場合、シャープなコピーがないことを意味します:layers sharp <name>で保存されたヘッドPSDから作成します。changed since the head passはヘッドパス後に編集されたヘッドレイヤーを示し、フレームサイズで使用されます:正常であり、欠陥ではありません。
画面を見ずにモデルを確認する
ビューアーを起動し(live2d.py view、バックグラウンドで)、ブラウザツールで http://127.0.0.1:8777/live2d/ を開きます。ページには window.sheets があり、保持ポーズ、モーションフレーム、表情のラベル付き画像を描画し、ファイルとして保存できます。レンダラーのピクセルデータを直接読み取るため、ページが非表示でも正確です。非表示ページのスクリーンショットは古いフレームを表示するため不正確です。
const u = "/live2d/models/akane-full/model/model.model3.json";
await sheets.poses([
["face", u, /face/i, 2.6, [["rest", {}], ["turn", {ParamAngleX: 30, ParamEyeBallX: 1}],
["half shut", {ParamEyeLOpen: 0.5, ParamEyeROpen: 0.5}], ["tilt", {ParamAngleZ: -30}]]],
["body", u, [0.15, 0, 0.85, 1], 0, [["rest", {}], ["sway", {ParamBodyAngleX: 10}],
["arms", {ParamArmLA: 10, ParamArmLB: -10}], ["knee", {ParamLegLB: 10}]]],
], 200, 300);
await sheets.save("akane-check"); // -> <out>/live2d/checks/akane-check.png
await sheets.expressions(u, ["(none)", "happy", "tired", "blushing", "angry", "scared"], /face/i, 1.6, 133, 170);
await sheets.save("akane-expressions");
await sheets.motion(u, "TapHead", /face/i, 1.6, 133, 170, 6, 13);
await sheets.save("akane-taphead");
sheets.done();
フレームはモデルのボックスのシェアで表される [x0, y0, x1, y1]、またはドロウアブル名のパターン(/face/i、/neck/i)とズーム値です。隙間を探す場合は、緑色の背景(poses の最後の引数として "#30c060")を渡します。隙間があると緑色が表示されます。
画像を注意深く確認してください。欠陥がありそうな場所(あご、腰、目)を拡大して見てください。全身サムネイルで判断しないでください。これまでに見つかった欠陥のほとんどは数ピクセル幅でした。各動作の両端と、2つの動作の組み合わせ(回転+視線、持ち上げ+曲げ)を確認してください。パーツが互いに離れる箇所です。
結果をユーザーに表示するときは、画像を送信し、確認した内容と確認しなかった内容を明確に伝えてください。ビューアーはアプリではありません。アプリで彼女を確認していない場合はその旨を伝えてください。
何かがおかしい場合
- 問題のあるパーツを特定します。スライダーでポーズを固定するか、その部分にズームしたシートを作成します。
- 欠陥の原因を特定します。パーツの画像が間違っている、切り詰められている、順序が間違っている、他のパーツに属するものが含まれている場合はレイヤーに問題があります。レイヤーが正しいのに動きがおかしい場合はリギングに問題があります。
references/problems.mdで該当する問題を調べます。これまでに発生した問題、原因、修正方法がリストされています。- レイヤーの欠陥は
layersコマンドまたは彼女のlive2d.jsonで修正し、その後buildを再度実行します。 - すべてのキャラクターに発生するリギングの欠陥は
scripts/rig.pyで修正します。各数値とテーブルには、なぜその値なのかのコメントが付いています。変更するときは理由を追加してください。1つのキャラクターだけに発生する欠陥は、彼女のlive2d.jsonに記述し、rig.pyから読み取られます。 - ビルドし、ページをリロードし、同じシートを再度作成して比較します。リロードが重要です:ページは読み込んだモデルを保持するため、リロードせずにシートを作成すると、ビルド前の状態が表示されます。
意図した以上に影響が及ぶ修正には注意してください。すべてのキャラクターのレイヤーを変更する前に、他のキャラクターにその問題があったか確認してください。ある修正で、本来問題のなかった髪に暗い縞が描かれたことがあります。
動きや表示内容の変更
READMEの「動きの変更」は、各項目を scripts/rig.py の名前に対応付けています。表情は EXPRESSIONS、クリック反応は TAPS、アプリが再生する感情モーションは EMOTIONS と BORROWED です。すべてのキャラクターで同じ名前を維持してください。そうすることで、アプリの設定とプロンプトを1回記述するだけで済みます。
動きの程度はユーザーの好みによります。このキットの最初のユーザーからの標準的なガイダンス:頭の動きは物を見るためのものなので、特徴は少しだけ動き、虹彩が主な視線を担当します。体の動きは控えめで、足は床に固定されたままです。画像を見せてユーザーに判断を仰いでください。
終了処理
- モデルの場所をユーザーに伝えます:
<out>/live2d/<name>-full.zipがアプリがインポートするファイルです。 - 描画、切り抜き、アップスケール後の描画、および
layers/full/内のすべてをバージョン管理に保持してください。<out>内のものは全て再生成可能です。 - 将来の実行で必要になることを学んだ場合(新しい種類の欠陥とその修正方法)、
references/problems.mdに行を追加してください。 - 起動したビューアーとComfyUIを停止してください。