Communitygithub.com

orange9angel/dula-flat-cel

画像モデルとスクリプトを使用して、ストーリー、キャラクターデザイン、描画、口のバリエーションから、音声付きの完成した動画まで、フルカラーの線画アニメーション短編を作成します。必要なものはPythonとffmpegのみ。アニメ短編、テレビ漫画スタイル、リミテッドアニメーション、会話劇、ショット間でのキャラクターの一貫性維持、口の同期ずれや描画切り替え時のちらつき修正に最適です。

dula-flat-cel とは?

このスキルは、フルカラーの線画アニメーション短編を、画像生成モデルとPythonスクリプトを用いて制作するためのワークフローを提供します。テレビアニメ調のシンプルなデザインに特化しており、3Dモデルや動画生成モデルを必要とせず、1枚の描画を3〜4フレーム保持することで、絵の切り替えと口の形状変化によって動きを表現します。ワークフローは、ストーリーとショットの設計、キャラクターデザイン(最も重要な工程)、背景とセルの描画、口とまばたきのバリエーション追加、音声(dula-voiceによる音声生成または既存音声の利用)、テスト(スチルと範囲指定レンダリング)、最終確認(口の動き、キャラクターの一貫性など)の順に進みます。各工程では、設定ファイル(TSV形式)を編集し、対応するスクリプト(paint.py, prep_cels.py, build_film.py, render.py, check_mouths.py)を実行します。このスキルは、Claude Code, Codex, CursorなどのAIエージェントが、ユーザーの代わりにアニメーション制作の各工程を自動化・支援するために設計されています。複雑なアクションシーンや長時間の連続動作、写実的な描画には不向きですが、会話劇やキャラクター一貫性が求められる作品に最適です。

対応✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/orange9angel/dula-craft/tree/HEAD/skills/dula-flat-cel

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

フルカラーアニメーション(線画)

1枚の絵を3~4フレーム保持し、絵の切り替えと口の形の変化で演技を表現します。シンプルなテレビアニメ調のデザインの場合、画像モデルが最も一貫性を保つことができる方法です。3Dも動画モデルも必要ありません。

スクリプトはこのスキルの scripts/ フォルダにあり、パスはこのSKILL.mdからの相対パスです。以下、$S はそのフォルダを表します。new_project.py を除き、フィルムフォルダから実行してください。環境の問題が発生した場合は、dula-start を使用してください。

相手の言語で話しかけてください。

ワークフロー

python $S/new_project.py my_film && cd my_film

1. ストーリーとショット

story.md を作成し、次に config/film.json(film.jsonリファレンス参照)を作成します。最初のフィルムは20~30秒に抑えてください。話されたセリフ1行は約2~3秒かかるため、15秒で3~5行程度になります。オリジナルキャラクターのみを使用してください。

すべてのセリフについて、誰が誰に言っているのか、カメラが誰を映しているのかを考えてください。ジョークは観客が理解できない言葉に依存してはいけません。因果関係も絵で示す必要があります(走り込む→掴む→物体が飛んでいく)。カットで飛ばさないでください。

2. キャラクターデザイン(最も重要な工程)

各キャラクターを config/anchors.tsv に記述します(名前<TAB>外見)。その後、実行します:

python $S/paint.py anchors config/anchors.tsv

自分で全ての画像を開いて確認してください。 一部のビューアは透明領域を黒地に色付きの光として表示し、切り抜き失敗のように見えることがあります。疑わしい場合は、手順3の build/check_alpha.png を確認してください。その後、作成したデザインを相手に見せ、承認を得てから先に進んでください。後のすべての描画はこれらに従うため、ここでのミスは修正に最もコストがかかります。プロポーションを言葉で修正します。例:「頭は全体の高さの3分の1、丸い顔、小さな黒いビーズの目、赤いオーバーオール」。

3. 背景と描画

config/plates.tsv(名前<TAB>説明)と config/cels.tsv(描画名<TAB>キャラクター<TAB>ポーズ)を記入します。描画名はキャラクター名で始めます(例:hero_run_a)。

python $S/paint.py plates config/plates.tsv
python $S/paint.py cels config/cels.tsv
python $S/prep_cels.py --bases-only    # 口を描画する前に build/check_alpha.png で切り抜きを確認

画像は1枚あたり1~3分かかります。paint.py は進行状況を報告します。長時間のコマンドを停止するツールを使用している場合は、バックグラウンドで実行してください。再実行すると、完了した画像はスキップされます。1枚だけやり直すには、--only <名前> --force を使用します。

描画と場所の連続性を保つために、従うべきものを指定する列をもう1つ追加します:

hero_run_a    hero    右に走る、左足を前に。
hero_run_b    hero    右に走る、右足を前に。    hero_run_a
meadow    灰色の雨雲の下の草原。
meadow_sun    雨が止み、太陽が顔を出す。    meadow

ルール:

  • 画像1枚につきキャラクターは1体だけ描画します。キャラクターデザインは常に最初の参照です。拒否された画像を参照として使用しないでください。
  • まずキャラクターの向きを決定します。 画像は1枚ずつ生成され、それぞれが方向を選ぶため、会話中の2人が背中合わせになりがちです。事前に指定し、flip で間違いを修正します。
  • アクションサイクル内の各描画は、前の描画に従います(上記の追加列)。これにより、方向、スケール、形状が維持されます。これがないと、サイクルが飛び飛びになります。
  • 時間帯の変更には、元のプレートに従って背景を再描画します。色を掛け合わせても青空を隠すことはできません。
  • すべてのショットでキャラクターのプロポーションを確認します。「首を伸ばす」のようなポーズの説明が、異なる体型になってしまうことがあります。

4. 口とまばたき

発話するすべての描画は、同じ画像のローカル編集を行います。config/variants.tsv 内:

hero_stand_m1    hero_stand    口だけを半分開いた小さな楕円に変更。
hero_stand_m2    hero_stand    口だけを大きく開いた状態に変更。
hero_stand_blink    hero_stand    両目を単純な曲線として閉じる。他は変更しない。

名前:<ベース>_m1 は半開き、<ベース>_m2 は大きく開いた状態。_m1 のみの場合、口は開いた状態と閉じた状態の2状態になりますが、これでも機能します。ベースとなる描画自体は口を閉じている必要があります。口を開けて描かれている場合は、閉じたバリエーションを作成し、film.json で talk を使用して3つの状態すべてを設定します。

発話するキャラクターのすべての描画には、歩行サイクルの各描画も含めて、独自の口のバリエーションが必要です。

python $S/paint.py variants config/variants.tsv
python $S/prep_cels.py

prep_cels.py は描画を真のフルカラーに押し込み、各バリエーションをベースにロックします。その後、build/check_alpha.png を開いて、マゼンタ色の切り抜きを確認します。残った背景、欠けている部分、消された目がある画像は再描画します。変更領域が大きいという警告が出た場合、モデルがボディを編集しています。variants.tsv の4列目にウィンドウ x,y,w,h を追加します。

色がずれていませんか? config/palette.json({"skin": [250, 220, 190]})を追加できます。色はキャラクターデザインからサンプリングします。近い色だけがスナップされ、prep_cels.py は変更後に再度適用します。

5. 音声

以下のいずれかを選択します:

  • 相手自身のキーを使用して、dula-voice で音声を生成します。
  • 既存の音声を使用する:audio/voice/<ラインID>.wav に配置するか、ラインに file を設定します。mp3 と wav の両方が使用可能です。
  • 無声のドラフトを作成する:ラインに seconds 値を指定します。

口の動きはこの音声から計算されるため、テストを作成する前に音声を確定してください。

オプション:ambience(環境音)、bgm、sfx(効果音)、songs。相手が権利を持つ素材のみを使用してください。このプロジェクトは音楽を生成しません。ライセンス音楽がない場合は、スコアを省略し、環境音と効果音でフィルムを支えてください。

6. テスト

python $S/build_film.py
python $S/render.py --stills 1,3,5,8,12
python $S/render.py --range 0,20 -o output/pilot.mp4

build_film.py は、表示されているキャラクターが話しているのに口が動かない場合にエラーで停止します。これは見逃しやすいミスです。テストを見せる前に、すべてのスチルを確認してください。 フィルム全体が完成するまで誰にも見せないでください。

キャラクターを地面に配置する:ground を推測し、スチルをレンダリングして調整します。計算するよりも速いです。

ショットを静止させたままにしないでください。特定のビートで静かにする場合を除き、各ショットに動くものを1つ与えてください:プレートのパン、bob(上下動)や shake(揺れ)、描画の変更、または雨などのオーバーレイ。最後のショットで fade_out を使用してフィルムを終了します。

7. 完全なフィルムと最終確認

python $S/render.py
python $S/check_mouths.py

引き渡し前に、以下の各項目を確認し、確認できなかった場合は率直に伝えてください:

  • すべてのショットから実際のフレームを確認した
  • check_mouths.py が口の固まりを報告していない
  • 各キャラクターがショット間で同じ人物に見える(色よりも顔とプロポーションが重要)
  • 会話中の人物が互いに向き合っている
  • 画面上を移動する単一の描画には bob または複数の描画がある。そうでないとスライドしているように見える
  • 音声を聞いた。聞けない場合は、音声が耳でチェックされていないことを伝える

完全な例

このリポジトリの examples/rainy-slide には、完成した15秒のフィルムのプロンプトとショットリストが含まれており、docs/tutorial.md で説明されています。このファイルから ../../examples/rainy-slide と ../../docs/tutorial.md にあります。誰かが例を求めてきた場合のモデルとして使用してください。

ペーシング

目安:ショットの平均は3~5秒、キャラクターは各描画を3~4フレーム(約1秒間に7描画)保持し、頻繁なクローズアップと大げさな表情を使用します。hold は描画あたりのフレーム数です。

よくある問題

症状原因と修正
口の切り替え時に体の色がちらつくバリエーションが prep_cels.py を通過していない
歩行や走行が背の高さで脈打つ描画のサイズを個別に調整しないでください。1つのアクターは自動的に1つのスケールを共有します。align_head も追加してください
小道具が間違った色になるパレットエントリが近すぎます。削除するか SNAP を下げてください
発話中に口が開いたままになる2状態の口は0.5のしきい値を使用します。音声がこもっていないか確認してください
小さな言葉が閉じたままになる1つの大きな言葉がそのラインのスケールを設定します。_m2 を追加するか、ラインの mouth_open_at を下げてください
雨や風が聞こえない環境音はデフォルトで小さいです。level_db を指定します(例:-35)
常にヒスノイズがする環境音クリップが単なるノイズです。交換してください。ゲインは上限があるため、これ以上増幅されません
Codexが参照画像が失われたと言う画像生成は最初のアクションでなければなりません。paint.py がこれを処理するので、再度実行してください

制限事項

この方法は、複雑な戦闘シーン、長い連続アクション、写実的なペインティングには適していません。

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

関連スキル