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