縦型リール動画スタジオ(ベーシック) は何をしますか?
30~90秒の縦型動画を1本作成するための、シンプルでステップバイステップのパイプラインです。
0. 初回実行:ユーザーに独自の設定を尋ねる(デフォルトを使用しないこと)
最初の動画の前に、brand.config.json が存在しない場合、"configured": false である場合、またはまだ @yourhandle が含まれている場合は、ユーザーに(一度に1つの質問ずつ)尋ね、回答を brand.config.json に保存します。
- ソーシャルハンドル:Instagram、Threads、TikTok、X(ユーザーが使用しているもの)。
- ウォーターマークテキスト(表示される通り正確に、例:
@yourhandleや@ig / @x)と位置(bottom-center、bottom-left、top-left、top-right)。 - CTA テキストとそれが言及するハンドル。
- 音声:ユーザーのElevenLabs音声ID + モデル + 言語、または「自分の声を録音します」。APIキーは
ELEVENLABS_API_KEYシークレットとしてのみ要求されます。 - 言語とトーン、音声がユーザーの名前/ハンドルをどのように発音するか。
次に "configured": true を設定します。ハンドルをでっち上げたり、他人(このキットの作者を含む)のものを再利用したり、@yourhandle のままのウォーターマークをレンダリングしたりしないでください。
以下のプレースホルダーは brand.config.json に対応します。
| プレースホルダー | 設定キー | 意味 |
|---|---|---|
{{HANDLE}} | handles.* | ユーザー自身のハンドル |
{{WATERMARK}} | watermark.text、watermark.position | ユーザーが指定したウォーターマークテキストと位置 |
{{LANGUAGE}} | language、tone | ナレーションとキャプションの言語とトーン |
{{VOICE_ID}} | voice.voiceId | ユーザーが選択した音声 |
{{TTS_MODEL}} | voice.model | ElevenLabsモデル(例:eleven_multilingual_v2) |
{{CTA}} | cta.text、cta.handle | ユーザーのコールトゥアクション |
APIキーは常に環境変数 ELEVENLABS_API_KEY から取得します。決して印刷したり、コミットされるファイルに書き込んだりしないでください。
フロー
- ユーザー設定の確認(初回実行) → 1. トピック → 2. 調査とファクトチェック → 3. スクリプト草案 → 4. ユーザー承認 →
- ナレーション → 6. タイミング → 7. シーン構築 → 8. レンダリング → 9. リール対応出力 →
- QA → 11. カバーとキャプション → 12. 納品。 ユーザーが変更を求めた場合は、変更が影響する最も早いステップに戻ります(新しいテキスト行は、その行のみ新しいナレーションを意味します)。
1~2. トピックと調査
- 動画1本につき1つのストーリー。初心者向けに書きます。
- すべての数字、日付、名前、引用を一次情報源(公式ページ、作者自身の投稿、日付入りスクリーンショット)と照合します。確認できないものは削除します。事実を捏造しないでください。
- 使用したリンクをまとめた短い
sources.mdを保持します。
3~4. 草案、そして待機
- 最初の2秒間のフック(質問または驚くような対比)を2~4個提案します。
- タイムテーブルを書きます:
時間 | 画面上のテキスト | ナレーション。目標は45~65秒、最大でも90秒を超えないこと。 - 停止し、草案をユーザーに送信します。ユーザーが承認するまで音声を生成したりレンダリングしたりしないでください。
5. ナレーション
{{VOICE_ID}}を使用して承認されたスクリプトを生成します(scripts/tts.py参照)。2つのテキストを保持します:表示テキスト(キャプションに表示されるもの)とTTSテキスト(音声用にスペルアウトされたもの、例:「AI」の場合はA.I.、数字は単語で書く)。- それを聞きます。間違っている行のみを再生成します。同じ行をオーディオ内に2度残さないでください。
- ElevenLabsアカウントがない場合は、自分の声を録音します。それでも十分機能します。
6. タイミング
- 単語のタイムスタンプ(ElevenLabsのアラインメント、または音声に対するWhisper)を取得し、
timing.jsonに保存します:{duration, words:[{w,s,e}], scenes:[{id,start}]}。 - アニメーションは、その単語が話されるフレームで開始します:
frame = Math.round(seconds * 30)。
7. シーン構築(Remotion、1080 × 1920、30 fps)
- 暗い背景、1つの明るいテキスト色、1つのアクセント色。ビートごとに1つの大きな見出し。
- キネティックテキスト: 各見出しの単語は、話される単語に合わせてポップインします(スケール0.6 → 1、わずかにオーバーシュート)。
- 1.5~3秒ごとに新しいものを1つ画面に表示します。数字は少なくとも1.5秒間保持し、読み取れるようにします。
- フックテキストはフレーム0から表示され、最初のフレームが静止画として機能するようにします。
- セーフゾーン:テキストは y = 200 から y = 1500 の間に保ちます。
{{WATERMARK}}テキストは、ユーザーが選択した位置に小さく配置します(デフォルトの下部:y ≈ 1430)。 - 実際のスクリーンショットやロゴをクレジットとともに使用します。モックアップには「イラスト」とラベルを付けます。
8~9. レンダリングと書き出し
npx remotion render src/index.ts <CompositionId> out/raw.mp4
bash scripts/reels-export.sh out/raw.mp4 out/final-reels.mp4
書き出しでは以下を生成します:1080 × 1920、H.264 High ≤ 4.1、yuv420p(TVレンジ)、BT.709、固定30 fps、8~12 Mbps、AAC 48 kHz、+faststart、−14 LUFS / ≤ −1 dBTP。動画は90秒未満に保ちます。
10. QA(常に、納品前に行う)
bash scripts/qa-check.sh out/final-reels.mp4 を実行し、scripts/contact-sheet.sh の出力を確認します。以下をチェック:
- オーディオ:単語が明瞭で、カットされた箇所や繰り返し行がなく、ラウドネスが約 −14 LUFS。
- ビデオ:テキストが途切れていない、セーフゾーン外のものがない、フリーズしたクリップがない、最初または最後の1秒が空でない。 何も送信する前に修正し、再レンダリングします。
11~12. カバー、キャプション、納品
- 2~4枚のカバーオプション、1080 × 1920 と 1080 × 1350 のグリッドバージョン。1つの大きなフック、1つのメイン画像、最大2~3枚の小さな数字カード。キーテキストは中央の1080 × 1080内に収めます。
- キャプション:Instagram(フック、本文、
{{CTA}}、数個のハッシュタグ)、Threads(短く、ハッシュタグなし)、TikTok。 - 最終MP4、小さなプレビュー(40 MB未満)、カバー、キャプション、
.srtファイル、ソースリストを納品します。
ルール
- 何も投稿、アップロード、購入しないでください。ファイルをユーザーに渡します。
- 捏造された事実は禁止。すべてのソースと、表示するすべてのオープンソース作者にクレジットを表示します。
- 使用権限のある音楽、クリップ、音声のみを使用します。