Communityコーディング&開発github.com

make-ai-short — 生成系ショート動画(エンドツーエンド)

ビデオモデルで生成したピクセルを使い、Remotionで合成・キャプション・ループを施した縦型ショート(1080×1920、約35~40秒)をエンドツーエンドで構築します。ブルーマン「The Door」で実証済み。

make-ai-short — 生成系ショート動画(エンドツーエンド) とは?

このスキルは、FalのSeedance 1.5 Proなどのビデオモデルから生成されたクリップと、Remotionによる合成・キャプション・ループ処理を組み合わせて、高品質な生成系ショート動画を制作するためのエージェントスキルです。主に縦型(1080×1920)の約35~40秒のショート動画を対象とし、哲学的・ナラティブなボイスオーバー、単語単位でシンクしたキャプション、効果音の試聴、そしてフレーム0と最終フレームがシームレスに繋がるループを特徴とします。このスキルは、Claude CodeやCodexなどのエージェントプラットフォームで使用することを想定しており、ユーザーが「AI動画ショートを作って」といったリクエストをした際に起動されます。make-short(TSXアニメーション)やmake-vox(レイヤードコラージュ)とは異なり、ピクセルそのものをビデオモデルから生成する点が最大の違いです。処理の流れは、スクリプト作成→音声生成→開始フレーム画像生成→クリップ生成→品質チェック→Remotion合成→効果音試聴→保存、という8ステップで構成され、各段階で厳格なルール(キャラクターの一貫性、コスト明示、ループ制約)が適用されます。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/gbax316/shorts-director/tree/main/.claude/skills/make-ai-short

Installed? Explore more コーディング&開発 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

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

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

ドキュメント

make-ai-short — 生成系ショート動画(エンドツーエンド) は何をしますか?

ピクセルはビデオモデルから生成され、Remotionはクリップとキャプションの合成のみを行います。ブルーマン #1「The Door」で実証済み。/make-short(100% TSX)の兄弟版で、同じ規律に加え、TSXが決して必要としなかった3つのゲートがあります:生成前にコストを明示、character.jsonからキャラクターの固定、終端フレームの条件付けによるループの固定。

リポジトリルートから実行します。.env に FAL_KEY(クリップ+画像)と ELEVENLABS_API_KEY(音声)が必要です。

3つの鉄則

  1. テキストからキャラクターを2度生成してはいけません。 ai-shorts/<char>/character.json + character.png が固定された参照です。キャラクターが必要な静止画はすべて gen_image.py --ref character.png で生成し、すべてのクリップは既にキャラクターを含むフレームからの画像→動画変換です。キャラクターシートがまだ存在しない場合、1枚作成すること(そしてユーザーの確認を得ること)は、他の何よりも先に行う独立したステップです。
  2. コストを支払う前に明示してください。 引用ではなく計算:Seedance 1080p 音声オフ = h×w×24×dur/1024 トークン × $1.2/1M ≈ $0.0583/秒(fal価格API 2026-07-14検証 — 完全なテーブル+Wan/Veo-Liteの注意点は ai-shorts/IDEAS.md を参照)。常に generate_audio:false — 音声はElevenLabs、効果音は当社のSFXパイプラインです。
  3. ループは運任せではなく、制約によって実現します。 ショット1の真のフレーム0(プロンプト画像ではなくクリップから抽出)がループのターゲットです。最終ショットはこれを end_image_url(Seedance/Kling)として渡し、最終的な合成は最後の約10フレームにわたってその正確な静止画に落ち着きます(remotion/src/shots/ai-1/Ai1Door.tsx 内の LoopSettle パターン)。

アーティファクト契約

ai-shorts/<name>/
  script.md · beats.json      — /make-short と同じ契約(実際のワードタイムを持つ vo[])
  character.json              — 固定された参照(+ video_model ブロック = 選択されたモデル)
  shots/NN-slug.png           — ショットごとの開始フレーム(gen_image.py --ref character.png [--ref scene])
  shots/NN-slug.json          — gen_clip サイドカー(モデル、ペイロード、リクエストID)
  shots/upload-urls.json      — fal ストレージURL(アップロードは再ロール間で再利用可能)
  voice/ · sfx-plan.json · output/                                          [voice/output は gitignore]
remotion/src/shots/ai-N/      — 合成 + vo.gen.ts
media/projects/<name>/        — staticFile() 用のクリップコピー(コミット対象 — ピクセルは再現不能;
                                 shots/*.mp4 ワーキングコピーは gitignore)

実行手順(ピクセルより音声が先)

  1. スクリプト — script.md + beats.json。フックはフレーム0で構成。テーゼはループを欲するものに(ブルーマン #1:「到着は神話である」→ 終わり=同じドアに向かって歩く)。約80~100ワード、2.5~2.7 wpsのウィンドウ。エンゲージメントCTAのアウトロは一切禁止 — 見返りで終わり、ループがエンディングです。
  2. 音声が先 — python tools/gen_voice.py --beats ... --emit-ts remotion/src/shots/ai-N/vo.gen.ts(音声とモデルは .env から、またはシリーズがナレーター(例:eleven_v3タグ付きの George JBFqnCBsd6RMkjVDRZzb)を必要とする場合、beats.json の "voice" ブロックから。クリップが生成される前に、make-short ステージ4と同様に LINE CHECK フラグに従って処理)。実際のワードタイムがショットウィンドウを決定。Seedanceは整数の4〜12秒の長さを取るため、ショットの長さはウィンドウから切り上げます。ダイアログ(2人以上のキャラクター): beats.json の "cast" は各話者をその character.json("voice" ブロックを持つ)にマッピングし、各VOラインは "who" で話者を指定します。--pack 0.3 は、推定ウィンドウに詰め込む代わりに、実際の長さからラインを端から端まで配置します。各キャラクターの音声はその character.json に1つだけ存在し、他にはありません。ダイアログ中の口の動き: ビデオモデルは誰が話しているかを認識しません。聞き手に話させ、話し手を凍らせ、次の文にまたがって笑い声を引き延ばします。クリップの後、python tools/mouth_sync.py ai-shorts/<name> を実行します(beats.json の "shots" は各クリップにグローバルな開始時間と長さを与えます。各 character.json の "mouth" ブロックは、サイド、半径、ゾーン、スタイル、keep_above を与えます)。モデルの口を消去し、各キャラクター独自の口を音声トラックのラウドネスから描画します。同様にQAします:両方の顔を0.5秒ごとに、誰が話しているかと照合します。1つのライン内でのアクションの変更(笑ってから話す)は2つのクリップで、2つ目は最初のクリップのカット時点のフレームから開始します。次に、口を動かした各クリップをフレームごとにスキャンします:クリップの中央値の4倍を超えるスパイクはカット、高速なジェスチャー、またはゴーストフィーチャーを伴う2フレームのモーフです。モーフフレームをそのショットの "hold" にリストし、再実行して、ジャンプがクリーンなカットとして再生されるようにします。
  3. 開始フレーム — ショットごとに1つ、python tools/gen_image.py --model pro --aspect 9:16 --ref character.png(+ ロケーションや小道具がショット間で一致する必要がある場合、ショット1のシーン静止画を2番目の参照として追加)。すべてのPNGをビデオ呼び出しの前にQA — ここでのドリフト修正は安価です。
    • 手、服の詳細、プロポーションを確認 — 再ロール時にはプロンプトで明示的に名前を付けてください。
    • ジオメトリは歩行可能でなければなりません(ショット6の教訓、コスト再ロール2回):終端フレームピンがある場合、開始フレームはモーションが歩行前進によって終了状態に到達できるようにする必要があります。終了フレームのキャラクターが開始時よりもカメラに近い場合、モデルは代わりにクローンを生成します。開始時は終了状態よりもキャラクターを大きく/近く配置し、前方への動きでキャラクターが縮小して終了状態に入るようにします。
  4. クリップ — 導出された総コストを明示し、次に各ショットに対して python tools/gen_clip.py を並行して実行(--set image_url=<fal storage url> --set 'duration="N"' --set resolution=1080p --set generate_audio=false、最終ショットは --set end_image_url=<frame0 url>)。参照は bakeoff_clip.upload_ref を使用して一度アップロードし、URLを shots/upload-urls.json に保持します。上記のfalフォームはこのチェックアウトのデフォルトです(CLIP_PROVIDER=fal、FAL_VIDEO_MODEL は .env)。代わりに kie.ai の場合(--provider kie): フィールド名は fal ではなく kie モデルに従います。bytedance/seedance-2 の場合:--aspect none --set first_frame_url=@ai-shorts/<name>/shots/NN-slug.png --set duration=N --set resolution=1080p --set generate_audio=false、最終ショットは --set last_frame_url=@<frame0.png>。@path はローカルファイルをアップロードします(kieは24時間保持するため、upload-urls.json の再利用は1日以内のみ有効)。コスト:kie.ai/pricing、falのテーブルではありません。実行時に使用クレジットが表示されます。bakeoff_clip.py は依然として fal 専用です。すべてのクリップを以下のプロンプトで生成:正確なキャラクターのフレーズ + 「ショット全体を通してシーン内に正確に1人のキャラクター」(クローンが#1の障害) + カメラ移動 + 「モーフィングなし」 + スタイルライン。
  5. クリップQA、フレームごと — クリップごとに開始/中間/終了のストリップ + 最終クリップの最後のフレームとループターゲットの並べ替え。失敗したものは再ロール(再ロールコストを明示)。5秒の1080p再ロールは約$0.29 — クローンを出荷するより安価です。
  6. 合成 — 1つのタイムライン上の OffthreadVideo のシーケンス、約8フレームのクロスフェードアンダーラップ(クリップはウィンドウより約1秒長い — これが余裕)、ルートに Captions + ProgressBar、末尾に LoopSettle ディゾルブ。最終クリップを media/projects/<name>/ にコピー。npm run gen、frames.mjs を境界とハイライトで実行、すべてのPNGを読み取り、その後 render-all --scale=1 でレンダリングし voice.wav をマルチプレクサ。
  7. SFX — /suggest-sfx フロー。ギャップVOキャリブレーション(ブルーマン #1): VOギャップ内のキューはマスキングもダッキングも不要 — 密なナレーションテーブルより約7~8 dB低くする必要があります(ギャップのウィッシュ音:-9~-13、-3~-5ではありません)。volumedetect RMSを音声平均参照と比較して検証。ヒーローレイヤーは一度だけ音声レベルに触れる可能性があります。ミックス試聴はユーザーの耳を待ちます(ハードゲート)。
  8. 保存して戻す — catalog used_in、beats.json の実際のタイミング(gen_voice が書き込み)、サイドカーをコミット、コスト元帳を最終レポートに記録。

完了条件 =

すべてのクリップのすべてのフレームでキャラクターが一貫している(フレームごとにQA済み) · ループが検証されている(最終フレーム vs フレーム0の並べ替え) · 実際のワードタイムでキャプション · 各支出前にコストを明示し、合計を後で表示 · SFX試聴レンダリング済み、ユーザーの耳を待つ · CTAアウトロなし。· tools/check_text.py が話し言葉と画面上のテキストでクリーン · tools/export_phone.py で電話用コピー作成 · LESSONS.md に日付入りのエントリ(教訓が動作を変更する場合、一般的な用語でスキルも更新)。

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

gbax316/shorts-director

Directs a faceless vertical short from idea to finished, mastered file, and gets better with every run. Picks a format, writes the episode in a writers' room (three premises judged as the buyer), voices it, gates on an animatic, then decides beat by beat how each moment is made: drawn in code in Remotion, a cut-out from a generated still, a generated clip, or one of the engine tracks. Modes: series, writers-room, produce, sound, finish, bakeoff, effects (/effects), improve (the learning loop after every short). Formats so far: character skit with dialogue and synced mouths, photoreal mini documentary with sourced figures. Triggers on "make a short", "next episode", "make a video about X", "faceless video", "reel for this offer". Do NOT trigger for editing an existing video file, for a pure code-drawn explainer with no writers' room (make-short), or for collage (make-vox).

gbax316/vidtsx-2d-generator

Generate production-ready 2D TSX video files for VidTSX (Remotion-based) from a shot, scene, or video description. Use whenever the user wants to create or generate a VidTSX video, a 2D TSX shot or scene, an animated clip, title card, or rendered motion graphic — including when they describe a visual animation they want built, or say "make a shot", "build this scene", "generate the TSX", or "turn this into a video". Covers the mandatory file structure and composition config, dimension presets (horizontal/vertical/square), six style presets (minimalist, memphis, neo-brutalism, glassmorphism, neon, corporate), and the hard rules that keep renders from crashing, covering frame-based animation only (no useState/useEffect/setTimeout), strictly monotonic interpolate ranges, Easing.bezier not wrapper syntax, and the chroma-js and @remotion/paths import gotchas. Not for 3D/three.js compositions, general React work, or editing video files.

関連スキル