Communitygithub.com

make-video

アイデアを、無料のローカルツールだけで完成済みMP4動画に変換します。YouTubeショート、Instagramリール、長尺動画に対応。

make-video とは?

このスキルは、開発者やAIエージェントユーザーが、無料でローカル実行可能なツール群(Remotion、Chatterbox、Whisper、FluidSynthなど)を組み合わせて、ソーシャルメディア向け動画(YouTubeショート、Instagramリール、長尺動画)を自動生成するための完全なパイプラインを提供します。ユーザーが「動画を作って」「リールを生成して」と依頼した際に、スクリプト作成、音声合成(Chatterbox、ユーザーの声のクローンも可能)、単語単位で同期されたキャプション(Whisper)、音楽・効果音(FluidSynthによるコード生成)、レンダリング、そして自動品質チェック(QAゲート)までを一貫して実行します。Apple Silicon(M1/M2/M3)搭載のMacでのみ動作し、APIキーやクレジットは不要で、すべての処理がローカルで完結します。また、生成された動画は、テイクチェッカーにより不明瞭な発話を再録音する機能や、テンプレート(ストーリー形式・モーショングラフィックス形式)に基づいた構成管理、エクスプロイナーテンプレート(How it works系)など、高品質な動画制作に必要な設計が盛り込まれています。

対応✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/TheNoumanDev/zero-dollar-studio/tree/main/plugins/make-video/skills/make-video

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

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

ドキュメント

make-video は何をしますか?

アイデアを、無料のローカルツールだけでレンダリング・チェック済みのMP4に変換します。このスキルから作られたプロジェクトには独自のルールが AGENTS.md にありますので、それに従ってください(アニメーションの純粋性、useScale、sec()、フォルダ構成など)。

0. 動画プロジェクトのセットアップ(1回のみ)

カレントフォルダに tools/make-story.sh がなければ、まだ動画プロジェクトではありません。

  1. マシンの確認を最初に行う:uname -sm(Darwin arm64 が必要)、node --version(20+)、brew --version、df -h ~(約8GBの空き容量)。他のOSの場合は、何が動作しないか(ChatterboxとテイクチェッカーはApple GPU上で動作します)を先に伝えてから進めてください。NodeまたはHomebrewが不足している場合は、ユーザーにインストールコマンドを1つ提示し、待機します。

  2. ダウンロードするものをユーザーに伝え、承諾を得るまで待ちます。 承諾なしにダウンロードを開始しないでください。以下の表を表示します(すべて無料、公式ソースから)。

    ダウンロードサイズ用途保存先
    npmパッケージ(Remotion等)~500 MBレンダリングnode_modules/
    ffmpeg, uv, FluidSynth(Homebrew、不足している場合のみ)~150 MB音声・動画ツールHomebrew
    Pythonパッケージ(PyTorch、Chatterbox…)~1.5 GB音声、品質保証.venv/
    GeneralUser GS サウンドフォント~30 MB音楽tools/soundfonts/
    Chatterbox 重み~3 GB音声Hugging Face キャッシュ(~/.cache/huggingface)、全プロジェクトで共有
    Whisper small.en~590 MBキャプションtools/models/
    Whisper large-v3-turbo(オプションのテイクチェッカー)~1.6 GB不明瞭なラインの再録音Hugging Face キャッシュ

    合計約6 GB、10〜20分かかります。より軽量なオプションも提供:SKIP_TAKE_CHECK=1 でテイクチェッカーをスキップ(合計4.4 GB)。プロジェクトの作成場所を尋ねます(デフォルトは ~/videos)。

  3. 承諾を得たら、このSKILL.mdの隣にある template/ フォルダをプロジェクトにコピーします(ドットファイルも含む:cp -R <skill dir>/template/. <dest>/)。その後 git init を実行。

  4. tools/setup.sh をバックグラウンドで実行し、ユーザーに進捗を伝えます:どのステップにいるかを表示し(▶ 行を出力)、大きなダウンロード中は進捗状況を示します(du -shL ~/.cache/huggingface/hub/models--ResembleAI--chatterbox、目標 ~3 GB)。再実行は安全です:完了したステップはスキップされ、中断されたダウンロードは再開されます。ダウンロードが停止した場合(5分間サイズが増加しない場合)、停止してセットアップを再実行してください。失敗した場合はエラーを読み、原因(ツール不足、ディスク容量、ネットワーク)を修正して再実行してください。モデルが不足している場合でも回避策を取らないでください。

  5. 動作確認:tools/make-story.sh stories/fridge-drama FridgeDrama で33秒のサンプル(冷蔵庫の中で3つの野菜が議論する)を約4分で作成します。ユーザーに out/FridgeDrama.mp4 を表示し、次に何を作りたいか尋ねます。

ツールはモデルを自動で見つけます(ChatterboxとテイクチェッカーはHugging Faceキャッシュ、キャプションは tools/models/ から)。そのため、セットアップ後に設定は必要ありません。2つ目のプロジェクトはキャッシュされた重みを再利用するため、セットアップがはるかに高速です。

1. ブリーフの確定(不足している場合のみ質問)

フィールドデフォルト
プラットフォーム/フォーマットReel/Short: 1080×1920、30 fps · YouTube: 1920×1080、30 fps · フィード投稿: 1080×1350
長さReel/Short: 15〜45秒 · YouTube: 3〜10分
種類ストーリー(キャラクターが話すので§3Bを使用) または モーショングラフィックス(テキスト、データ、図なので§3Aを使用)
トピック + 1つの要点視聴者が覚えるべき1つのこと
音声ボイス(Chatterbox)、音楽+効果音(tools/music.py)、または音楽のみ
音声Chatterboxの組み込み音声、またはユーザー自身の録音のクローン(§3B)。同意なく他人の声をクローンしないでください。

2. コードより先にスクリプトを書く

長さの予算: Chatterboxのペースでの英語の話し言葉は、約 2.6 単語/秒 です。目標時間 ≈ 単語数 ÷ 2.6 + Σ ポーズ + アウトロ。生成前に確認してください。(冷蔵庫ドラマ:62単語 + 6.4秒のポーズ + 3秒のアウトロ = 33秒。)

縦型ショートフォームのペース配分ルール:

  • フレーム 0 でフックを画面と音声で表示。最初の1.5秒で継続率が決まり、フレーム0はサムネイルになることが多いため、空のフレームやフェードで開始しないでください。
  • 各行は12単語以下。キャプションは一度に3単語以下を表示。
  • 毎秒 何かが動いている。
  • 1080×1920 のセーフゾーン: y=220 より上、y=1540 より下には重要なものを配置しない(プラットフォームUI)。また、y≈1000 より下で x≈940 より右にも配置しない(いいね/コメント/共有ボタンが右端に配置されるため)。tools/qa.py --layout で違反を検出します。プレゼンターは左下に配置します。
  • ペイオフまたは決めゼリフで終了し、その後2〜3秒のコールトゥアクションカードを表示。

解説テンプレート(「仕組み」や開発者向けヒントのリール向け、45〜60秒、120〜160単語):

  1. フック(≤ 3秒):驚くべき真実の事実または結果。
  2. 「実際の仕組みはこうです」:解説を開始する一行。
  3. 2〜4つのビート、それぞれに1つの数字 + 1つのアナロジー(「動画は1秒間に30枚の写真、まるでパラパラ漫画のようなもの」)。
  4. 「しかし、ここが落とし穴です」:ひねり、落とし穴、よくある間違い。
  5. 1行のペイオフ、その後1つの明確なコールトゥアクション(保存、共有、フォロー)。

次に、スクリプトの下にすべての事実主張と出典リンクをリストし、検証できないものはマークして、音声化する前に修正または削除します。数字や主張が表示される際に、出典を画面に(小さく、カードの下部)表示します。

ショート/リール向けクラフトチェックリスト:

  • 進捗が見えること。 ステップバイステップの動画には <StepCard steps={[{at: 0, title: "ダウンロード"}, …]} />(src/components/StepCard.tsx)を使用:「STEP 2/4」のピルとセグメントバーを表示。
  • カラオケキャプション(オプションのスタイル)。 <Karaoke words={captions} keywords={["無料"]} style={{left: 60, right: 140, top: 1180}} />(src/components/Karaoke.tsx):2〜5単語のチャンク全体が画面に表示され、発話中の単語は実線、これからの単語は灰色、キーワードと強調単語はアクセントカラーで表示。視聴者はミュートの自動再生でも先読みできます。background で明るいカード風に。qa を渡してレイアウトチェックに認識させる。
  • シリーズチップ。 左上にエピソードマーカー(「パート2」)を付け、連続視聴を促進。
  • 対比を見せる。 「before/after」や「私たち対彼ら」は、スピーチよりも2カラムカードの方が効果的。
  • ストーリービートはリストより効果的。 「試行1失敗→試行2失敗→うまくいった方法」は、機能リストより注目を集めます。
  • CTAの前に決めゼリフ。 人間らしい一行の後、コールトゥアクション。
  • 「キーワードをコメントしてDMします」という報酬は、実際にガイド、プロンプト、リポジトリなどの実体が背後にある場合のみ約束すること。

TTS(テキスト読み上げ)向けのライティング:

  • 行を「…」で始めない:Chatterboxがフィラーの単語を即興で入れてしまいます。
  • 行を数字の単語だけで始めない(「二つ。顔」は「to the face」と出力されました)。「第二に、…」と書きましょう。
  • 数字や奇妙な名前は、発音通りに書きます(「5.6」、「XZ」)。実際のテキストは行の caption フィールドに入れます。
  • 大きな数字は丸める(「600以上」)。TTSは「646」や「87,000」をうまく発音できません。
  • フック内の短い単語は不明瞭になりやすい(「このリポ」は「The three」と聞こえました)。テイクチェッカーが正しく聞き取れるまで言い換えます。
  • 複数の声で同じ短い単語を同時に叫ばせないでください。ミックスが不明瞭になります。
  • 句読点は話し方を指示します:「?」は語尾を上げ、「。」は下げ、大文字は強調を追加します。

3A. モーショングラフィックス動画

  1. src/compositions/_Template を src/compositions/<名前> にコピーし、ビートタイプごとに1つのコンポーネントを作成(Hook、Point、Stat、List、CTA)。
  2. スクリプトから再生時間を計算(ビートの合計 − トランジション)。getSampleIntroDuration と同様に行います。
  3. src/Root.tsx にインラインの defaultProps を指定して登録。
  4. 音楽のみ:totalMs、outroStartMs、events を含むタイムラインJSONを作成し、tools/music.py を実行。

3B. 音声付きストーリー(キャラクター + キャプション + 音楽)

stories/<スラッグ>/script.json を作成(stories/fridge-drama/script.json をコピー):

  • characters:color、exaggeration(0.3 穏やか → 0.9 劇的)、オプションで refVoice:クローン用のクリーンな10〜30秒のWAVファイルを tools/voices/ に配置。これがない場合は、Chatterboxの組み込み音声が使用されます。ユーザーの声をクローンする場合:静かな部屋で60〜90秒自然に話してもらい、音楽やエコーのないクリーンな10〜15秒の部分を切り出す(ffmpeg -ss <開始> -t 12 -i note.m4a -af highpass=f=80,loudnorm=I=-18 -ar 24000 tools/voices/me.wav)。
  • lines:speaker、text、pauseAfter(秒)、オプションの event + eventAt: "start" でストーリービート(ドアが開く、隠れる…)をマーク。アニメーションと音楽の両方がこれをキーにします。
  • 各行にオプションの音声指示:emotion(calm|neutral|warm|excited|dramatic|whisper)、pace(slow|normal|fast)、emphasis(大文字で発話されキャプションで強調表示される単語)、pauseBefore(秒)。"pace": "slow" と0.4秒のポーズで、すべての単語が明確になります。

次に 1つのコマンド を実行:

tools/make-story.sh stories/<スラッグ> <CompositionId>     # 音声 → キャプション → 音楽/効果音 → lint → レンダリング → マスター → 品質保証
SKIP_VOICE=1 tools/make-story.sh …                     # ビジュアルのみを反復
SAMPLE=15 tools/make-story.sh …                        # 最初の15秒を承認用にレンダリングして停止
ツール出力
tools/voice.pypublic/<スラッグ>/lines/*.wav(テキスト+音声設定でキャッシュ)、public/<スラッグ>/voice.wav、stories/<スラッグ>/timeline.json(ラインタイミング、イベント、フレームごとの口の形状)。テイクチェッカーがインストールされている場合、Whisperが各文を聞き、不明瞭なものを再録音します(VOICE_TAKES、デフォルト3回)。
tools/captions.mjspublic/<スラッグ>/captions.json(Whisperからの単語タイミング、スクリプトからのスペル)、stories/<スラッグ>/captions-report.json(単語誤り率と行ごとの一致単語数、Whisperが見逃した「filled」部分、全体的な matchRate)
tools/music.pypublic/<スラッグ>/music.wav(MIDI → FluidSynth、カットに合わせて調整)、public/<スラッグ>/sfx.wav
tools/qa.pystories/<スラッグ>/qa/report.md:PASS / FIX / FAIL

timeline.json / captions.json からコンポジションを構築(src/compositions/FridgeDrama/data.ts を参照)。mouthOpen() で口の動きを制御、アクティブな話者に視線を向け、イベントは timeline.events.* を介して、再生時間は timeline.durationInFrames から取得。

タイミングの変更(テキストまたはポーズ)はキャプションの再生成が必要です。 キャプション時間は絶対値なので、そうしないとずれます。make-story.sh は常にキャプションを再実行します。

4. 検証(常に、完了と言う前に行う)

tools/make-story.sh は tools/qa.py で終了し、FAILの場合はゼロ以外の終了コードを返します。ファイル、ラウドネス(-14 ±1 LUFS、トゥルーピーク ≤ -1)、キャプション精度、ビートに合ったカット(≤ 120 ms)、フリーズ状態(≤ 3秒)、視覚的な多様性(最長の同じ見た目の連続 ≤ 5秒)、および画面上のテキストを繰り返すキャプションをチェックします。LAYOUT=<CompId> はさらに、キャプションがデッドゾーンや顔にかかっていないかをチェックします(コンポジションは、キャプションを #FF00FF、顔を #00FFFF で囲む qa プロパティが必要です)。stories/<スラッグ>/qa/report.md を読み、すべてのFAILとFIXを修正します。

次に目視確認:

  1. npm run lint。
  2. stories/<スラッグ>/captions-report.json 内の WER > 0.2 の行は、おそらく不明瞭に発話されています。言い換えて再生成(キャッシュのおかげで安価)。Whisperが見逃した単語は、ギャップの音声部分にのみ配置され、長い単語により多くの時間が割り当てられ、filled の下にリストされます。それらの箇所を聞いて確認します。matchRate が70%未満の場合、スクリプトと音声が異なるため、先に進む前に再音声化します。
  3. キービート(フック、各話者、各イベント、アウトロ)で静止画をレンダリングし、1枚のコンタクトシートにまとめて確認します:
    npx remotion still <Id> out/stills/f<N>.png --frame=<N> --scale=0.4
    ffmpeg -i a.png -i b.png … -filter_complex hstack=inputs=K out/stills/contact.png
    
    キャラクターのサイズ、セーフゾーン、キャラクターを覆うオーバーレイ、アウトロの背景に残るもの、キャプションの同期、テキストサイズ(チップは28 px以上、本文は54 px以上、1080幅時)を確認。
  4. 最終MP4から4〜5フレームを抽出して確認。
  5. 重要なものについては、新しいサブエージェントにコンテキストなしでコンタクトシートを批評してもらいます。新鮮な目がビルダーが見逃す問題を見つけます。

5. 納品

ユーザーにMP4、タイトル、キャプション、3〜5個のハッシュタグ、サムネイルフレームを提供します。明示的な承認なしに投稿またはアップロードしないでください。 クローンした声やAIの顔を使用する場合は、YouTubeの「改変または合成コンテンツ」ラベルをチェックするようユーザーに注意を促します。

時間を節約するルール

  • 一度に1つのレンダリング。 複数のRemotionレンダリングを同時に行うと、マシンが長時間過負荷になります。パイプラインは既に --timeout=180000 --concurrency=2 を渡しています。
  • Remotionパッケージの追加は npx remotion add <pkg> で行い、決して npm i だけで行わないでください。バージョンの整合性が保たれます。
  • ラウドネス:台詞 −16 LUFS、音楽ベッド約 −24、最終マスター −14(ツーパス、既に make-story.sh で実施)。音声は音楽より少なくとも10 dB大きい状態を維持。
  • Studioは defaultProps が Root.tsx 内のインラインオブジェクトである場合にのみ、プロップの編集を保存できます。
  • 行をループする場合は while read -r a b c; do …; done <<EOF を使用(zsh)。for x in "a b c" は壊れます。

さらなる教訓と独自の追加方法: reference/lessons.md。

測定されたコスト(M1 Max、64 GB)

ステップ時間
Chatterboxモデル読み込み実行ごとに約20秒(すべての行がキャッシュされている場合はスキップ)
音声生成最初の行約55秒(ウォームアップ)、その後は約3倍の実時間
テイクチェック再テイクが必要な文ごとに約20〜30秒
キャプション(Whisper small.en、WebGPU)11行で約10秒
音楽+効果音2〜5秒
1080×1920、33秒のレンダリング約97秒(動画1秒あたり約3秒)
フルパイプライン音声キャッシュ時約2分、スクラッチから約4分

make-video は TheNoumanDev によるもので、zero-dollar-studio の一部です。これは @0x45.dev YouTubeチャンネルの裏側で動作しているパイプラインです。

関連スキル