Communitygithub.com

垂直リール動画スタジオ(プロ版)

RemotionとElevenLabsを使った、教育・説明系の縦型(9:16)リール動画(Instagram、Threads、TikTok向け)の本格制作レシピ。ブランド設定、ファクトチェック済み原稿、フック案、読み上げ用発音マップ、ワードタイムド・キネティックモーション、オプションのリップシンク・プレゼンター、リール安全出力、必須QA、4種類のカバー、プラットフォーム別キャプションを提供します。基本的なスキルでは物足りない場合、あらゆるナレーション入り教育・解説リールにご利用ください。

垂直リール動画スタジオ(プロ版) とは?

このスキルは、RemotionとElevenLabsを活用し、Instagram、Threads、TikTok向けのナレーション付き縦型(9:16)教育・解説リール動画をエンドツーエンドで制作するための本格的なプロダクションレシピです。ユーザーのブランド設定(ハンドルネーム、ウォーターマーク、CTA、音声など)を最初に収集・保存し、ファクトチェック済みの原稿と複数のフック案を生成、ElevenLabsで音声合成、ワードタイムド・キネティックモーション(単語ごとにタイミングを合わせた動き)を適用し、最終的にリールに安全な形式で動画を書き出します。オプションでリップシンクするプレゼンターキャラクターも追加可能です。出力前に必須の品質チェック(音声認識による発音確認、各シーンのコンタクトシート、コーデック・メタデータ検証)を実施し、問題を修正・再レンダリングします。最終的には、動画本体に加え、プラットフォーム別キャプション(IG、Threads、TikTok、SRT)、4種類のカバー画像、ソースクレジット、ファクトチェックファイルを納品します。このスキルは、基本的な `vertical-reels-video-studio` では不足する場合に、より高度な制御と品質保証を必要とするプロジェクト向けに設計されています。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/ahmadaryanto/vertical-reels-video-studio/tree/HEAD/skills/vertical-reels-video-studio-pro

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

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

ドキュメント

垂直リール動画スタジオ(プロ版) は何をしますか?

エンドツーエンド: (初回: ユーザーのハンドル/ウォーターマーク/CTA/音声を尋ねる)→ トピック → リサーチ → 原稿 → 承認 → 音声合成 → タイミング → Remotionシーン → レンダリング → リール書き出し → QA → カバー + キャプション → 納品。 これは vertical-reels-video-studio(基本版)のより充実したバージョンです。ブランド設定は brand.config.json(src/brand.ts で読み込まれ、コンポジションに brand プロップとして渡されます)に保存されます。

0a. 初回実行: ユーザーに設定を尋ねる(デフォルトは使用しない)

最初の動画の前に、brand.config.json が存在しない、"configured": false である、またはまだ @yourhandle が含まれている場合は、ユーザーに尋ねて(一度に一つの質問)回答を brand.config.json に保存します。

  1. ソーシャルハンドル: Instagram、Threads、TikTok、X(使用しているもの)。
  2. ウォーターマークテキスト(表示する正確なテキスト、例: @yourhandle や @ig / @x)と位置(bottom-center、bottom-left、top-left、top-right)。
  3. CTA テキストとそれが言及するハンドル。
  4. 音声: ElevenLabsの音声ID + モデル + 言語、または「自分の声を録音します」。APIキーは ELEVENLABS_API_KEY シークレットとしてのみ要求されます。
  5. 言語とトーン、音声がユーザーの名前/ハンドルをどのように発音するか。

その後、"configured": true を設定します。ハンドルをでっち上げたり、他人のもの(このキットの作者を含む)を再利用したり、@yourhandle のままのウォーターマークをレンダリングしたりしないでください。

0b. ブランド設定(brand.config.json、ユーザーの回答から入力)

キープレースホルダー備考
ハンドル{{IG_HANDLE}}、{{THREADS_HANDLE}}、{{TIKTOK_HANDLE}}、{{X_HANDLE}}handles.*、ユーザー自身のもの
ウォーターマーク{{WATERMARK}} + 位置watermark.text / watermark.position、ユーザーが指定した正確なテキスト、シーンにハードコードしない
言語/トーン{{LANGUAGE}}、{{TONE}}例: カジュアルなインドネシア語 gua/lu、絵文字は控えめ
発音される名前{{SPOKEN_NAME}}音声がハンドルをどう発音するか(例: @janedoe_ に対して「Jane Doe」)。キャプションには実際のハンドルを表示
免責事項{{DISCLAIMER}}金融トピックの場合、例「教育目的であり、金融アドバイスではありません」
音声{{VOICE_ID}}、{{TTS_MODEL}}、{{LANGUAGE_CODE}}voice.*、ユーザーの選択(または自身の録音)
APIキー環境変数 ELEVENLABS_API_KEY印刷、ログ、コミットしない
CTA{{CTA}}、{{CTA_HANDLE}}cta.text / cta.handle、ユーザーに尋ねる(例「フォローは @{{CTA_HANDLE}}」、「「チュートリアル」とコメント」)
ハードルール{{HARD_RULES}}決してパロディしないブランド、ぼかす名前、決して言わない言葉
レンダリングデバイス{{RENDER_DEVICE}}GPUマシンまたはCPU。実際に使用されたものを常に報告

1. リサーチと原稿(音声なし、レンダリングなし)

  1. 一次情報源(公式ドキュメント/プレスリリース、作成者自身の投稿、レジストリ、日付入りスクリーンショット)ですべての主張をファクトチェックします。役員の投稿は公式声明として扱います。推定値(ESTIMATE · 非公式)と疑惑(ALLEGED)にはラベルを付けます。検証できないものは、表現を和らげるのではなく削除します。
  2. 動画ごとに一つのストーリー、日常的な言葉、ゆっくりしたペース。製品名が難しい場合は画面に表示し、ナレーションでは言いません。
  3. 2~4個のフックオプション(H1、H2…)を提供します: なぜ/どのようにという質問、または大胆な対比。ユーザーに選んでもらいます。
  4. 時間指定テーブル: 時間 | 画面表示 | ナレーション。目標45~65秒、最大90秒(修正が収まるよう88秒以下を目指す)。
  5. factcheck.md(主張 → ソース → ステータス)と sources.md を書きます。
  6. 原稿を送信し、承認を待ちます。 ユーザーから「レンダリングしない」と言われた場合は、GOが出るまで最終決定とします。

2. 音声合成(ElevenLabs)

  • 2つのスクリプト: script-display.txt(キャプション表示用)と script-tts.txt(音声用にスペル調整)。display↔TTSマップを保持します。
  • 発音(docs/VOICEOVER.md参照): A.I. はドットを入れて英語らしく発音。非英語VOではティッカーを一文字ずつ(ETH → E, T, H)。数字は単語として。英語の専門用語は通常の英語スペルで(ハイフンによる再スペルはしない)。母音の前の最後の /t/ の後にカンマ。ブランド名はテストで効果が確認できた場合のみ再スペル。
  • 後処理 atempo 1.05(高速コンテンツは1.1)。ラウドネス −14 LUFS 統合、 ≤ −1 dBTP。
  • 重複行なし。 フックや以前のビートを繰り返す行は、カットするか言い換えます。
  • 最初に文字クォータを確認します。失敗した行のみ再音声合成(連続性のために previous_text を渡します)。

3. タイミング

  • TTSアライメントからの単語タイムスタンプ(テンポ係数で除算)またはfaster-whisper → timing.json {duration, phrases:[{s,e,words:[{w,s,e}]}], scenes:[{id,start}]}(scripts/build-timing.py)。
  • 再スペルトークンを表示単語にマージ(A.I.→AI、E, T, H→ETH)。そうしないとキャプションの開始が遅れます。
  • シーンは発話単語にキーイング: wt(scene, word) → その単語が始まるフレーム。

4. モーションスタイル(Remotion、1080x1920、30 fps)

ルック: ベース #0A1016、クリーム #EFE6D2、アンバー #FFB000、レッド #E2553F、グリーン #7BD88F。@remotion/google-fonts 経由のフォント: Big Shoulders 800(見出し)、Plus Jakarta Sans(本文/キャプション)、JetBrains Mono(チップ/コード)。 レイアウト: 重要なコンテンツは y 200~1500。フッタークラスター: カラオケキャプション ~y 1310~1353、ウォーターマーク(ユーザーが下部を選択した場合)~y 1427~1446、進行状況 ~y 1474、すべてx 960の左側(リールは右側にボタンを描画します)。 空フレーム禁止: フックはフレーム0で読み取り可能。開始と終了は中間と同じく(ヒーロー画像、プレゼンター、チップなど)充実させ、空白背景に一行だけを配置しない。

イージングヘルパー(src/motion/ease.ts):

const clamp01=(x:number)=>Math.max(0,Math.min(1,x));
const P=(t:number,a:number,b:number)=>clamp01((t-a)/(b-a));
const eOut=(x:number)=>1-Math.pow(1-x,3);
const eIn=(x:number)=>x*x*x;
const backOut=(x:number,s=1.70158)=>1+(s+1)*Math.pow(x-1,3)+s*Math.pow(x-1,2);
const sec=(f:number,at:number)=>(f-at)/30;
const ap=(f:number,at:number,d=0.3)=>eOut(P(sec(f,at),0,d));
const pop=(f:number,at:number)=>Math.max(0,backOut(P(sec(f,at),0,0.35),2.2));
const punch=(f:number,at:number)=>{const t=sec(f,at);if(t<0)return 1;return 1+0.12*eOut(P(t,0,0.2))-0.06*eOut(P(t,0.2,2.5));};
const shake=(f:number,at:number)=>{const t=sec(f,at);return t<0||t>0.4?0:14*Math.exp(-t*10)*Math.sin(t*70);};

動き: キネティックタイポグラフィ(単語がVOのタイミングで着地、scale(0.6+0.4*pop)、±4°の0.25秒の整定、強調語は大きく+アンバー/レッド)、キー画像のズームパンチ、円マスクで表示、ズームスルートランジション(スケール1→4.2を約9フレーム、次のシーン1.3→1)、回転スタンプとモノクロチップ、スクリーンショットの赤ハイライトボックス、ステップカウンター、カラオケキャプション(現在の単語アンバー + 1.08倍)、CTAポップとシェイク、VOの下にウィッシュ/ポップ効果音。約1.5~3秒に1ビート。

ビデオクリップ: 各 <OffthreadVideo> を <Sequence from={at}> でラップし、startFrom をそれに相対的に設定。そうしないと最終フレームでクリップが固まって見えます。長いビートには短いクリップをループ。クリップは使用可能な最初のフレームから開始。

オーディオトランジション: 冒頭でナレーション前にライブオーディオ(曲、クリップ)を使用する場合、無音にフェードアウトし、最初のVOワードの前に約0.3~0.5秒(フラッシュ/ウィッシュトランジション)を残して、VOがマスクされないようにします。

オプション: リップシンク付きプレゼンター(マスコット)

  • すべての動画で一貫したキャラクターアイデンティティ。別々のレイヤー: ボディ(閉じた口は塗りつぶし)、コートの端の下の肩ピボット上のアーム、静的なショルダーキャップ、口スプライト closed/half/open/wide/round。
  • ループではなくVO wavから口を駆動: scripts/build-mouth-track.py → フレームごとの状態(無音時と終了ホールド時はclosed、最低2フレームホールド)。アームをリグの範囲内に固定。全体画像の上下動だけでは不十分。
  • プレゼンターは画面に表示されている間のみマウント。カバーは静止した閉じ口のボディを使用。

5. レンダリング

  • GPUマシンがあれば優先(Remotion --hardware-acceleration、encodingBufferSize/encodingMaxRate なしの設定、これらは必須のNVENCを壊します)。許可された場合のみCPUにフォールバック。常にどのデバイスでレンダリングしたかを報告。
  • 生レンダリング: remotion.config.ts で yuv420p + bt709、その後リールパス。

6. リール安全書き出し(scripts/reels-export.sh、詳細は docs/REELS_SAFE_EXPORT.md)

1080x1920 SAR 1、H.264 High level 4.1、yuv420p TVレンジ、BT.709タグ、CFR 30、GOP 60クローズド、10 Mbps(最小8、最大12)、2パス loudnorm −14 LUFS / −1.5 dBTP、AAC 192k 48 kHz ステレオ、+faststart、< 90秒。40 MB未満の小プレビューも作成(scripts/make-preview.sh)。

7. QA(必須、納品前)

  • 最終MP4をWhisperでチェック(scripts/whisper-check.py): 誤った発音、吃音、不要な音、重複行、各シーンの最初の単語が聞き取れるか。
  • 各シーン境界でコンタクトシート(scripts/contact-sheet.sh): グリッチ、重なり、テキスト切れ、セーフゾーン、フリーズしたクリップ、空の開始/終了、ウォーターマークの有無、brand.config.json と一致し、正確にスペリングされているか。
  • scripts/qa-check.sh: コーデック/プロファイル/レベル、pix_fmt、レンジ、カラータグ、CFR、AAC 48k、moovがmdatの前、再生時間 < 90秒、−14 LUFS。
  • 修正して再レンダリング。改訂時は以前のバージョンを保持。

8. 常に動画と一緒に納品するもの

  1. IG用キャプション(フック、本文、CTA、控えめなハッシュタグ)、Threads用(短く、ハッシュタグなし)、TikTok用、および .srt。
  2. 4種類のカバーA~D: 1080x1920 + 1080x1350 グリッド、中央1080x1080内にキーテキスト。フック1つ、メイン写真1枚、最大2~3枚の数字カード。コンタクトシートを添えてユーザーに選んでもらう。
  3. ソースクレジットとファクトチェックファイル。
  4. videos-log.md に一行: タイトル、ファイル、再生時間、ラウドネス、デバイス、ソース、ステータス「未投稿」。

ルール

  • 投稿、DM、アップロード、購入はしない。ファイルを納品する。
  • 事実、スター、価格、結果を捏造しない。オープンソースの作者は画面上でクレジットする。
  • 実際の写真、ロゴ、クリップのみ。実在の人物のAI生成顔は使用しない。モックアップは イラスト と明記する。
  • 使用権のあるメディアのみを使用。音楽やクリップに著作権がある場合はユーザーに伝える(ミュート/クレームリスク)。
  • ファイルに秘密を含めない。質問は最後に、それぞれ別のメッセージで行う。

Individual skills in this repo

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

関連スキル