Communitygithub.com

yt-film

静止画像からナレーション付きYouTubeドキュメンタリー/解説動画をエンドツーエンドで制作するPythonフィルムエンジン。タイトルから完成MP4まで、ストーリー調査、検証済み事実リスト、画像ガイド、ナレータースクリプト、音声、音楽、リビングスチル、レンダリング、最終結合、吹き替え、サムネイルをすべて自動化します。

yt-film とは?

yt-film は、静止画像(約150枚)をもとに、ナレーション付きのYouTube用ストーリー動画をエンドツーエンドで制作するためのプロフェッショナルなAIエージェントスキルです。主にClaude(Anthropic)との連携を想定して設計されており、Pythonベースの強力なフィルムエンジン(OpenCV、Pillow、NumPy、SciPy)を中核としています。macOSとWindowsの両方で動作し、チャンネル固有のビジュアルスタイル(ガッシュ、クリーン、ノワール、チョーク、コミック、絵本、ブループリントなど)やフォーマット(ストーリー、解説、カウントダウンなど)を柔軟にカスタマイズできます。このスキルは、ストーリー調査と検証済み事実リストの作成から始まり、ユーザーが選択した画像生成ツール(ChatGPT、Codex、Google Flow/Whisk、Gemini API、Midjourneyなど)向けの詳細な画像ガイドの作成、画像から書き起こされるナレータースクリプト、Gemini TTSまたはユーザー自身の録音による音声生成、Lyriaまたはユーザー提供の音楽によるスコア作成、カメラ移動や煙、炎、表情変化などのリビングスチルエフェクト、並列バッチレンダリング、-14 LUFS準拠の最終結合、そしてスペイン語・フランス語の吹き替えとサムネイル作成までをカバーします。各プロジェクトは専用のワークスペースに整理され、すべての設定は.envファイルで管理されるため、再現性とチームでの共同作業が容易です。

対応✓Claude Code✓Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/AGBOOLA-JOEL/yt-film/tree/HEAD

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

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

ドキュメント

yt-film: 静止画像からナレーション付きフィルムを制作

静止画像からストーリーフィルムを制作するためのプロダクションライン:ユーザーはClaudeが作成するガイドに基づいて約150枚の静止画像を作成し、Claudeがそれらの画像からスクリプトを書き、音声がそれを読み上げ、Pythonエンジンがすべての画像を言葉に合わせて生き生きと動かします。参考作品はChadwickの例(examples/chadwick/、Carnegie's Daughter:アンドリュー・カーネギーの秘密の娘として数百万ドルを借りた女性)です。その画像、スクリプト、音声、スコア、ショットリスト、70秒のエフェクトテスト動画(examples/chadwick/video/chadwick_effects_test.mp4)がすべてのテクニックを示しています。

REPO はこのスキルのフォルダを指します(このファイルがある場所)。PY はそのPython実行ファイルです:macOS/Linuxでは REPO/.venv/bin/python、Windowsでは REPO\.venv\Scripts\python.exe。エンジンコマンドは常に PY を使用し、プロジェクトの tools/ フォルダから実行してください。.venv が存在しない場合は、最初にセットアップしてください:references/install.md の インストール手順(Claude用) をステップバイステップで実行します(システム全体へのインストール前に確認;ユーザーは自分のAPIキーを貼り付けます)。

基本ルール

  • ユーザーの許可なしにレンダリングしないでください。 stills.py(約30秒でコンタクトシートを作成)で確認してください。バッチレンダリング、プレビュー、エンディング、最終結合には数分から数時間かかることがあります:何をレンダリングするか、どれくらいの時間がかかるかを説明し、同意を待ってください。すでにレンダリングされたものは、変更がない限り、ユーザーが望まない限り再レンダリングしないでください。
  • プロジェクトごとに一度だけユーザーのルートを尋ねてください:使用する画像ツール(references/image-generation.md)、音声(Gemini TTSまたはユーザー自身のもの:references/voice.md)、音楽(Lyriaまたはユーザー自身のもの:references/music.md)、ニッチとチャンネル名、そしてチャンネルを独自のものにする3つの選択肢:画像スタイル(オープナー:ガッシュ、フラットエディトリアル、ノワール、チョーク、コミック、絵本、ブループリント、または独自のもの;キャラクターあり/なし)、エンジンのルック(YTF_LOOK:ガッシュ、クリーン、ノワール、チョーク、コミック、絵本、ブループリント;単一の値には look.json)、フォーマット(story、explainer、countdown、rise-fall、storytime、kids、summary、case-study、news):references/art-styles.md、references/formats.md。例のパステル調の実話スタイルをデフォルトにしないでください。ユーザーに好みがない場合は、オプションを1つの短い表で示し、ニッチに合ったものを推奨してください。
  • ユーザーのニッチはユーザー自身のものです:歴史や例のテーマに誘導しないでください。例はテクニックの参考であり、トピックのテンプレートではありません。
  • Windows:パスはフォワードスラッシュで機能します;長時間のジョブはバックグラウンドで実行されます;パフォーマンス設定は references/performance.md を参照してください。macOS専用のツールを想定しないでください。
  • .env 以外のファイルにAPIキーを保存しないでください。実際の写真やサウンドファイルは、ユーザーの了承を得た後でのみダウンロードしてください(ファイル、ソース、サイズ、ライセンスを明記)。

スタック

役割ツール場所
調査ウェブ検索、検証済み事実リスト(ソース付き);確認できないものにフラグを立てるOUTLINE.md
画像ユーザーの画像ツール、Claudeのガイドに従うIMAGE_GUIDE.md(+ API用 IMAGE_PROMPTS.jsonl)、incoming/
スクリプトClaude、画像ガイドから書き起こす、ビートごとに1つの ## パッセージ、[SHOTS: …] ノートSCRIPT.md
音声Gemini TTS(音声Orus、ゆっくり読む → 1.25倍速、ポーズは上限あり)または import_voice.py を使用したユーザーの音声tools/voice.py、tools/import_voice.py
単語タイミングWhisper:mlx-whisper(Apple Silicon)または faster-whisper(Windows/Intel/Linux)voice/<batch>_words.json
音楽Lyria(Gemini API)、セクションごとに1キュー、または ユーザーのライセンス取得済みトラックtools/music.py → audio/music/
フィルムエンジンPython(OpenCV、Pillow、NumPy、SciPy)、After Effectsは不要tools/film.py、fx2.py、seq.py、signature.py、wr.py、kit.py
ショットリストバッチごとに1ファイル、seq.py で作成、バッチのワードタイムにキューされるtools/<story>.py + tools/shots_bN.py
レンダリング並列、マシンに合わせたサイズ、低優先度tools/render_all.py
エンディングユーザー自身のアニメーションサインオフ(例:cta.py)renders/cta.mp4
最終結合バッチ + エンディング、1つの連続スコア、−14 LUFS / −2 dBTPtools/final.py
吹き替えデフォルトでスペイン語とフランス語:Gemini翻訳 + TTSを約3分のチャンクで、英語のスロットに合わせるtools/dub.py
サムネイルユーザーの画像ツール、ガイドに従うreferences/thumbnails.md

プロジェクトは YTF_WORKSPACE(デフォルトでは ~/yt-film-projects/<story>/)に保存され、PY REPO/scripts/new_project.py <story> で作成されます。これによりエンジンが tools/ にコピーされ、すべてのフォルダが作成されます。設定は .env に保存されます(プロジェクトが優先、次にREPO):GEMINI_API_KEY、YTF_CHANNEL、音声/モデル名、速度調整など(.env.example にすべてリストされています)。engine/ytf.py は任意のOSでフォント、キー、Whisper、共有アートを見つけます。

作業の順序

  1. ストーリーを選ぶ(指定がない場合):ギャップチェック付きの3~5の候補(references/story-finding.md)。フォーマットとルックを指定してプロジェクトを開始:PY REPO/scripts/new_project.py <name> --format <format> --look <look>(フォーマットのスパインテンプレートをOUTLINE.mdに書き込み、YTF_FORMAT と YTF_LOOK を .env に書き込みます)。完全なガイドを書く前に、stills.py で2枚の画像を使って新しいスタイルをテストします(references/art-styles.md、最後のセクション)。
  2. ストーリーと事実:調査;OUTLINE.md にソース付きで記述。確認できないものにはマークを付け、後で回避策を記述(「伝えられるところによると」)、事実として述べないようにします。フックを決定します(references/hooks.md:ユーザーの過去3本のフィルムと同じタイプにしない)。次に、OUTLINE.md の先頭に スパイン を書きます(references/storytelling.md):フィルムが答える1つの質問と、「それで」/「しかし」で結ばれた8~12のビート;最初の誤った行為または決断の瞬間はフィルムの約15%まで;主要人物ごとに1つまたは2つのバックストーリーパッセージ。画像ガイドの前にユーザーに見せます。
  3. 画像ガイドを先に(references/image-guide.md、ユーザーのルート用に書く)。スパインとフィルムのナレーションの方法に従います(見せてから描く:各ビートの行は、それが提供するラインと、そのラインの上または後に何が描かれるかを示します)。約150枚の画像を目指します:スタイルカード、キャストシート、カバレッジ付きの約100枚のシーンショット(W ワイド、M ミディアム、F 顔のクローズアップ(EDITとして)、D ディテール、P 視点)、_lines バージョン付きの6シーン、12枚のスケッチシート + _lines、約10枚の空白のストーリーオブジェクト(「ベース」:ノート、古地図、カード、台帳、封筒、電報、新聞)。正確なファイル名とフォルダ。一貫性ルール:references/consistency.md。
  4. 画像をグループごとにチェック(手、顔、時代のディテール、テキストがないこと、形状:画像は約16:9で到着し、2:1に中央クロップされるため、上下の端に重要なものがないこと)。手動ダウンロード:scripts/sort_images.py。次に、エンジンpx でグリッドシートを作成(COLS=4 PY tools/egrid.py out.png IMG ...)、ショットを書く前にすべての画像の煙突、ランプ、キャンドル、息、静かなエリアをマッピングします。
  5. 画像からスクリプトを作成。 生成されたすべての画像を使用;各パッセージをそのショットにマッピングし、未使用画像チェックを実行します(例:examples/chadwick/tools/script_check.py)、次に PY tools/story_check.py(話された日付、シーンシフトの開始、[DRIVE] パッセージの位置、すべてのバッチの継ぎ目)および references/storytelling.md(再話、15%、しかし/それゆえに、説明の積み重ねなし、5〜7つの話された日付、見せてから描く)のチェックを実行します。長さ制限なし:ストーリーを完全に、ゆったりと語ります(1分あたり約150ワード;Chadwick:1,780ワード → 12分)。ユーザーの「いいね」/「フォロー」の呼びかけで締めくくります。
  6. 音声:Gemini(最初に voice.py --test、次にバッチ;--pace と SPEEDS を使用して各バッチが約140~160 wpmになるように調整)またはユーザーの音声(import_voice.py --full | --passages | --batches)。BATCHES(4~7パッセージ、各約65~100秒、ストーリーが動いている幕の途中でカット;幕の切れ目では2~3カットのみ;バッチの開始時に再導入されるものはありません)と GAPS を設定します。各バッチの単語をショットを書く前に出力します(Whisperは名前を聞き間違え、数字を数字として書くため、書かれた内容にキューを合わせます)。
  7. 音楽:5~7キューの音楽(music.py、またはユーザーのファイルを audio/music/ に配置);final.py の MUSIC でキューをバッチにマッピングします。
  8. ショットリストをバッチごとに seq.py で作成(references/engine.md、examples/chadwick/tools/):フィルムモジュール(<story>.py、例:chad.py)が LIVE テーブル(各画像のリビングレイヤー)とマップ設定を保持;各 shots_bN.py は約60行の S.at(time, scene(...)/page(...)/drawin(...)/map_shot(...))。各リストを PY tools/stills.py bN でチェックし、シートを確認してからレンダリングします。
  9. レンダリング(ユーザーの許可を得て):PY tools/render_all.py はすべてのバッチを並列に実行し、マシンの空きメモリが許す限り多く同時に実行します(レンダリングあたり約1.5 GB;メモリが不足すると同時実行数が多いほど遅くなります);修正後は render_all.py b3 b7 または --changed を使用します。Claudeを閉じても停止しないように、別のウィンドウで起動し、レンダリングが遅い場合やコンピュータが遅くなる場合(特にWindows)は references/performance.md の手順に従います。新しいトランジションやエフェクトは最初に2フレームでテストします(後半のクラッシュはレンダリングを無駄にします)。
  10. エンディングをチャンネルごとに1度作成(references/cta.md)、その後 最終結合 PY tools/final.py;MP4の長さ、fps、ラウドネス(−14 LUFS、ピーク ≤ −1.5 dB)を確認し、スチルをサンプリングします(references/final-render.md)。
  11. 吹き替え(references/dubs.md)と サムネイル(references/thumbnails.md)を必要に応じて作成します。

ルック(例のデフォルト;各チャンネルが独自のものを選択)

  • 例:卵形の頭の人々(卵形の頭、2つの暗い楕円形の目、一本線の口、鼻/耳/眉なし、シンプルな丸い手)が 時代に合った現実世界 に配置;インク線 + マットなパステルガッシュ;エンジンルック gouache。他のチャンネルは独自の画像スタイル、キャラクター(またはなし)、エンジンルックを選択します(references/art-styles.md);以下のルールはすべてのスタイルに適用されます。
  • エンジンルックが追加レイヤーを設定します:グレード、グレイン、ビネット、インク、タグペーパー、アクセント、フォント、描画サウンド(engine/look.py:YTF_LOOK、look.json)。ルックに色やフォントがある場合、ショットファイルにハードコードしないでください(look.rgb("accent")、look.L.type_font);チャンネルのルックは一箇所で変更できる必要があります。
  • 2.5Dなし、切り抜きなし、AI動画なし。 イーズ付きのカメラ移動(プッシュイン、パン、スロードリフト)のみの単一画像。
  • 1つの画像を長く保持しないでください:その瞬間の次のショット(W→M→F→D→P)または描かれたページにカットしてください。
  • スケッチによる説明は実際の描画であり、アイコンではありません:シートのラインワークから切り出したものか、コードでうまく描ける場合(正確な地図、ルート、マーク、単純な図形)はエンジンが描画します。
  • 空白のベースは、その媒体でライブ描画されます:紙の上のグラファイト、ボードの上のチョーク、ブラシインク、新聞に印刷されるハーフトーン写真、地図上のインクルート。
  • 線には意味があります:年数を表す集計マーク、サウンドリング、紙吹雪のパス、スモークライン、取り消された図形。
  • ラベル(日付、場所、名前)は、ルックのタイプフォント(gouache ではタイプライター)で レベルの打刻された テキストであり、ソフトなクリック音とともに一度に1キーずつ打たれます。
  • オブジェクトへの書き込み は、そのオブジェクトの実際の線の上に、その角度で配置されます;その下の読みにくい印刷は最初に消去されます(fx2.clean_text)。
  • 常にコントラストを確保:暗いものの上に暗いものを置かないでください。ラベルはハロー付きのクリーム/インクを自動選択します。color="ink" を強制せず、その下にあるものを確認してください。
  • ツールスプライトは小さい(0.28倍)ため、焦点を奪いません。

シグネチャーアニメーション(すべて静止画像上でコードによって行われます)

engine/signature.py、engine/fx2.py、ショットヘルパー engine/wr.py、engine/seq.py。各一枚絵は examples/chadwick/look/ にあり、すべての動きはエフェクトテスト動画で確認できます。

  • リビングスチル(画像自体は動かない;レイヤーがその上で生きる):すべての煙突からのパーティクルスモーク、寒さの中での息、生きている炎とその投げる光、画像自体のランプを見つけて呼吸させる(fx2.lamps)、雪、雨、落ち葉、きらめき。ピクセルワーピング(sg.Flow)はスモーク、蒸気、火、水には使用しないでください:絵の具をにじませます(look/flow_smear_avoid.png)。
  • 必要な場所でのみ動く顔:自動的な瞬きや表情はありません。顔は、ショットが act= / talk= を渡した場合にのみ動作し、一致する目のペアを持つ顔のみが対象です(sg.face_audit([...], out.jpg):両方の目が緑色のリングで囲まれている場所でのみ動作)。キュー:blinks、glances、widen、mouth_fx、expr(smile、grin、frown、o、laugh、closed eyes、squint...)、talk=(ta, tb)、リアクションマーク(sweat、shake、!、?、zzz)。バッチごとに数回の実際のビートのみ、装飾は不要。
  • 空白のボード上のコミックページ(sg.Comic):境界線が自動でインクを塗り、各パネルがインクを塗ってからペイントされ、カメラがパネルを訪れ、最後のパネルに飛び込みます。フィルムごとに2つ(フック、最初の大きなセットピース)。各パネルは1.8秒以上保持します。
  • ライブ描画(fx2.Draw):1枚のシートの描画が、ストローク順にインクで描かれ(ペンスプライトと音)、その後カラーウォッシュが入ります;card=True は、込み入った画像に最初にソフトなクリームウォッシュを施します。シートは 決して 4つのページとして表示されません:各描画はナレーターが名前を呼ぶときに現れ、矢印と短いタイプ打ちラベルで結ばれます。
  • 説明カード(1つのベースを再利用):名前がタイプ打ちされて取り消され、メカニズムが矢印付きの描画の連鎖として表示され、3つの描画と3つの単語が表示されます。
  • マークの語彙は意味によって選択され、毎回同じマークではありません:下線、チェックマーク、バツ印、ブラケット、動きの線、サウンドリング、ルート(点線のパス + 矢印)、リーダー(点、線、タイプ打ちラベル)、集計;sg.Stamp(ゴム印のドスン:FORGED、CLOSED、14 YEARS)、sg.Tag(破れた紙のラベル)、sg.Inset、sg.Flip(スプリットフラップ)、sg.Pin、fx2.Counter(回転する紙幣カウンター)。
  • 重みのあるエフェクト(バッチごとに数回の感じられる瞬間):fx2.Lift(画像からオブジェクトを切り取ってアニメーション化、fill_from= で穴をクローンフィル)、fx2.Tear(画像が2つに裂ける)、("shatter", s, (cx, cy)) トランジション、sg.Papers(舞い散る紙)、火 + 打撃、振動 + ドスン、プレスフラッシュ + シャッター、sg.Rays、sg.Haze。
  • リビングマップ(seq.map_shot):実際の海岸線がインクで描かれ、水がウォッシュイン、境界線がダッシュイン、湖と町がタイプ打ちされ、赤い旅の...

...

[翻訳のために切り詰められました]

関連スキル