垂直リール動画スタジオ(プロ版) は何をしますか?
エンドツーエンド: (初回: ユーザーのハンドル/ウォーターマーク/CTA/音声を尋ねる)→ トピック → リサーチ → 原稿 → 承認 → 音声合成 → タイミング → Remotionシーン → レンダリング → リール書き出し → QA → カバー + キャプション → 納品。
これは vertical-reels-video-studio(基本版)のより充実したバージョンです。ブランド設定は brand.config.json(src/brand.ts で読み込まれ、コンポジションに brand プロップとして渡されます)に保存されます。
0a. 初回実行: ユーザーに設定を尋ねる(デフォルトは使用しない)
最初の動画の前に、brand.config.json が存在しない、"configured": false である、またはまだ @yourhandle が含まれている場合は、ユーザーに尋ねて(一度に一つの質問)回答を 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 のままのウォーターマークをレンダリングしたりしないでください。
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. リサーチと原稿(音声なし、レンダリングなし)
- 一次情報源(公式ドキュメント/プレスリリース、作成者自身の投稿、レジストリ、日付入りスクリーンショット)ですべての主張をファクトチェックします。役員の投稿は公式声明として扱います。推定値(
ESTIMATE · 非公式)と疑惑(ALLEGED)にはラベルを付けます。検証できないものは、表現を和らげるのではなく削除します。 - 動画ごとに一つのストーリー、日常的な言葉、ゆっくりしたペース。製品名が難しい場合は画面に表示し、ナレーションでは言いません。
- 2~4個のフックオプション(H1、H2…)を提供します: なぜ/どのようにという質問、または大胆な対比。ユーザーに選んでもらいます。
- 時間指定テーブル:
時間 | 画面表示 | ナレーション。目標45~65秒、最大90秒(修正が収まるよう88秒以下を目指す)。 factcheck.md(主張 → ソース → ステータス)とsources.mdを書きます。- 原稿を送信し、承認を待ちます。 ユーザーから「レンダリングしない」と言われた場合は、GOが出るまで最終決定とします。
2. 音声合成(ElevenLabs)
- 2つのスクリプト:
script-display.txt(キャプション表示用)とscript-tts.txt(音声用にスペル調整)。display↔TTSマップを保持します。 - 発音(
docs/VOICEOVER.md参照):A.I.はドットを入れて英語らしく発音。非英語VOではティッカーを一文字ずつ(ETH →E, T, H)。数字は単語として。英語の専門用語は通常の英語スペルで(ハイフンによる再スペルはしない)。母音の前の最後の /t/ の後にカンマ。ブランド名はテストで効果が確認できた場合のみ再スペル。 - 後処理
atempo1.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. 常に動画と一緒に納品するもの
- IG用キャプション(フック、本文、CTA、控えめなハッシュタグ)、Threads用(短く、ハッシュタグなし)、TikTok用、および
.srt。 - 4種類のカバーA~D: 1080x1920 + 1080x1350 グリッド、中央1080x1080内にキーテキスト。フック1つ、メイン写真1枚、最大2~3枚の数字カード。コンタクトシートを添えてユーザーに選んでもらう。
- ソースクレジットとファクトチェックファイル。
videos-log.mdに一行: タイトル、ファイル、再生時間、ラウドネス、デバイス、ソース、ステータス「未投稿」。
ルール
- 投稿、DM、アップロード、購入はしない。ファイルを納品する。
- 事実、スター、価格、結果を捏造しない。オープンソースの作者は画面上でクレジットする。
- 実際の写真、ロゴ、クリップのみ。実在の人物のAI生成顔は使用しない。モックアップは
イラストと明記する。 - 使用権のあるメディアのみを使用。音楽やクリップに著作権がある場合はユーザーに伝える(ミュート/クレームリスク)。
- ファイルに秘密を含めない。質問は最後に、それぞれ別のメッセージで行う。