/fabrica-videos-reels — スクリプトからMP4へ
Fábrica de Vídeos Agêntica のスキル (fabrica-videos スキルを参照)。これは「スクリプトファースト」のワークフローです。クライアントは録画前にスクリプトとストーリーボードを承認する必要があります。クライアントがスクリプトなしで録画済みの場合は、fabrica-videos-rapido スキルを使用してください。
ポルトガル語で、シンプルな言葉で話してください(動画を依頼する人はほとんどプログラミングをしません)。コードではなく、レンダリングされたプレビューで進捗を示してください。
Remotion のコードを書く前に、CLAUDE.md(デザインシステムのルール、各ファイルの場所、コマンド)を読み、公式の Remotion スキルがインストールされている場合は remotion-best-practices も読んでください。
完全な承認済みの例は動画 Exemplo です:roteiros/exemplo*.{md,json} + src/videos/Exemplo.tsx。この構造をコピーしてください。
すべてのコマンドはプロジェクトルートのターミナルで実行します。以下の表で、TRABALHO = trabalho フォルダ(git 管理外)。
0. 動画がどの段階にあるか確認する
短い slug(例:minha-ideia)を選び、既存のものを確認します:
| 存在するもの… | 次へ進む |
|---|---|
| 何もない | 1. スクリプト |
roteiros/<slug>.md 承認済み、-animacoes.md なし | 2. ストーリーボード |
ストーリーボード、src/videos/<Nome>.tsx なし | 3. 構築 |
| 構成完了 + 新しい録画(クライアントが保存場所を知らせる) | 4. 録画 |
TRABALHO\out\<slug>-final.mp4 | 5. 納品 |
1行で現在の段階を伝え、その指示に従ってください。段階 1 と 2 は会話です:提案、傾聴、改良;クライアントの承認を得てから先に進んでください。
1. スクリプト → roteiros/<slug>.md
- ここでクライアントと会話しながらスクリプトを作成します。質問:テーマ(または参考リンク/動画)、ピラー(ブランドテーマの1つ)、目標時間(30~60秒 ≈ 2.5単語/秒)。
- 構造は
roteiros/exemplo.mdと同じ:推定開始時間、台詞、カードを持つブロック;視聴者が初心者の場合の類義語辞典;録画用の連続テキスト;必要なスクリーンショット;リンク付きで確認された事実。 - 声(人物に合わせて調整;ルールはブランドに従う):一人称、短い文、具体的な数字;最初の3秒でフック;決して「革命的」「未来が来た」とは言わない;質問 + CTA で締める。警報は宣言ではなく質問にする。ニュースを捏造しない。
2. ストーリーボード → roteiros/<slug>-animacoes.md + roteiros/<slug>.ancoras.json
- ビートごと(2~3秒ごとに視覚変化):時間、フレーズ、画面上に表示されるもの(エリア 1080×960)。
- 新しいパーツを作成する前に、
src/pecas/の既存パーツを再利用:RedeNeural+Bisturi(AIの「脳」)、GradeConexoes、LoopPensando、Lupa、ContadorBarra、TrocaPrints、TextoRiscado(モードriscar/somar)、OlhoRiscado、LinhaVersoes;ヘルパーTituloCena、Halo、RotuloMono、aparece(util.tsx)。 ancoras.json:{ "cena": "そのシーンで最初に話される言葉" }台詞の順番で。アンカーに固有名詞を避ける(Whisper が誤認識する:「Qwen」→「quen」、「Claude」→「clou」、「OpenAPI」→「OpenAI」、「Vercel」、「MCP」、「JSON」も同様)。シーン内の内部ビート(例:取り消し線を引く瞬間)もアンカーにします。
3. 構築 → src/videos/<Nome>.tsx
Exemplo.tsxのスケルトンをコピー:zod スキーマ(pilar、video、enquadramento、mostrarGuia、nome、cargo、prints、encerramento、tempos)、外側のTelaDividida、シーンごとに1つの<Sequence>+<Cena>(6フレームのフェード)、最後に2秒のEncerramento。src/videos/index.tsxに登録。<Folder name="Videos">内に、calculateMetadata(再生時間 =duracaoFala+ 2秒)を設定。- 各シーンは 独自のコンポーネント で、
useCurrentFrame()を呼び出します(親コンポーネントのオブジェクト/配列の関数内でフックを呼び出さない:フレームが正しく取得できません)。useCurrentFrame、useVideoConfig、Sequenceはsrc\relogio.tsxからインポートし、remotionからはインポートしないでください:フレームは30 fpsで書き込まれ、時計が残りを処理します(動画が60 fpsで出力される場合)。 - 新しいパーツは
src/pecas/に配置(汎用的、props 付き)、src/animacoes/tema.tsのトークンに従います。 - パーツのスクリーンショットと画像(小さいファイル):このフォルダの
public\<slug>\に保存し、npm run prepararを実行します。 - 録画前のテスト用仮台詞:連続テキストを
roteiros\<slug>.fala.txt(UTF-8)に保存し、npm run fala -- <slug> roteiros\<slug>.fala.txtを実行 →TRABALHO\public\previa\fala-<slug>.mp4(システム音声、1080×960)。次にnpm run legendar+npm run batidas(セクション4)を実行してsrc/videos/<slug>.tempos.jsonを生成し、videoprop を"previa/fala-<slug>.mp4"に設定。 - 確認:
npx tscとガイド付きのコンタクトシート:npm run folha -- <Id> src\videos\<slug>.tempos.json→TRABALHO\out\folha-<Id>.jpg(各シーン終わりの1フレーム)。画像を確認:赤い部分なし(上部270、下部320、側面96、右側のボタン)、重なりなし、テキストが収まっていること。 - プレビューをレンダリング:
npm run renderizar -- <Id> "trabalho\out\previa-<slug>.mp4" previa(軽量、540×960;プレビューであることを伝える)してクライアントに送信。
4. 実際の録画 → 同期とフレーミング
- 新しい録画を見つける(クライアントに保存場所を尋ねる)。元のファイルを
TRABALHO\originais\に コピー(決して移動や変更しない)して変換:npm run converter -- "trabalho\originais\<arquivo>" <slug>→TRABALHO\public\gravacao-<slug>.mp4(縦向き、H.264、標準色、録画の解像度とフレームレートのまま:4K 60fps はそのまま4K 60fpsで出力。HDR は例外:SDR に変換され、コンバーターが通知。コマンド末尾にate=12を付けると最初の12秒だけ変換、迅速なテスト用)。コンバーターはffprobeでファイルを確認し、4K HDR(最近のiPhone) の場合はzscale+tonemapで HDR 処理(これがないと色が薄くなる)。セッション内で初めての HDR 録画の場合、変換済みから1フレーム抽出してクライアントに表示し、スマートフォンと比較させる。 npm run legendar -- "trabalho\public\gravacao-<slug>.mp4"(バックグラウンド、約1~2分)→legendas/gravacao-<slug>.json。録画に長い間、エラー、繰り返しテイクがある場合、先に進む前にクリーンアップする(fabrica-videos-corteスキル):以降の動画はgravacao-<slug>-limpa.mp4となり、トランスクリプトはクリーンな動画のもの。npm run batidas -- legendas\gravacao-<slug>.json roteiros\<slug>.ancoras.json src\videos\<slug>.tempos.json "<vídeo>"。アンカーが不足している場合、トランスクリプトを読んでフレーズを調整する。クライアントが台詞の意味を変えた場合、アニメーションを適応(例:「一人だけでなく」→TextoRiscado modo="somar"を取り消し線の代わりに)し、そのことをクライアントに伝える。duracaoFala≤ 動画の再生時間(そうしないと画像の下に一瞬余白ができる):上記コマンドで動画を指定すると、batidasが自動的に制限;指定しない場合は手動で修正。- フレーミング(顔が字幕帯 y 985–1125 と下部ゾーン y 1600 の間に収まる必要がある):約12の瞬間でトリミングをテストする。
ffmpeg -ss <t> -i <video> -frames:v 1 -vf "crop=1080:960:0:<offset>" "trabalho\out\enq-<t>.png"を実行し、各画像を確認。enquadramento="50% <offset/960*100>%"(ソース 1080×1920 の場合)。動画全体で頭全体がフレーム内に収まること。 顎が下部ゾーンに触れてもよいが、口は決して触れない。クライアントがカメラに近づく場合もテストし、頭頂部が決して切れない最大のオフセットを使用する。 - 名前のバーを確認:顔を覆う場合、上半分に配置する(
TelaDivididaのデフォルト)。 - 最終レンダリングをバックグラウンドで実行:
npm run renderizar -- <Id> "trabalho\out\<slug>-final.mp4";ffprobeで再生時間/解像度を確認し、動画を送信。- 入力された品質がそのまま出力されます。
renderizarは録画の解像度とフレームレートを読み取り、最終出力もそれに従います:4K 60fps で録画すれば、2160×3840 60fps で出力。最終出力ではnpx remotion renderを直接使用しないでください:常に 1080×1920 30fps で出力されます。 - パラメータが指定された場合のみ解像度を下げます、そしてスキル呼び出し時にクライアントが要求した場合のみ(例:
/fabrica-videos-reels <slug> 1080p):1080pで解像度を下げ、30fpsでフレームレートを下げます(npm run renderizar -- <Id> "<saída>.mp4" 1080p 30fps)。パラメータなしでは解像度を下げないでください。 - HDR はこのルールの対象外: Remotion は標準色のみ描画。録画が HDR の場合、最終出力は SDR になることをクライアントに伝えてください。
- 4K 60fps でのレンダリングは、1080p 30fps に比べて描画する画像が8倍になります。事前に時間がかかることを伝えてください。
- 入力された品質がそのまま出力されます。
5. 納品
fabrica-videos-entregaスキルで最終処理(技術確認、カバー、コンタクトシート、NOTAS.md)。以下のポイントはこのフロー独自のものです。- クライアントが後で編集アプリケーションで字幕を付ける場合、字幕を配置する場所を説明:分割バーのすぐ下(ピラーの色で)(ガイドの緑色の帯)、最大2行。クライアントが動画に字幕を焼き付けたい場合、
fabrica-videos-legendasスキルを参照(LegendaQueimada、位置faixa)。 - トランスクリプトがよく誤認識する名前を伝える。
- 投稿の説明:クライアントが要求した場合、
NOTES.mdに 提案 を書く(フック、正確な数字を含む2~3文、質問 + 同じ CTA、出典、最大3つの絵文字、4~6つのハッシュタグ、研究で裏付けられていない誇張は避ける)。 entregas\AAAA-MM-DD-<slug>\に記録:NOTAS.md(構成ID、使用したコマンド、録画と最終出力のパス、再生時間、フレーミング、クライアントが台詞を変更した点)、capa.jpg、コンタクトシート。最終動画はTRABALHO\out\に残す。- 承認後、録画を
TRABALHO\public\から削除し、trabalho\arquivo\AAAA-MM-DD-<slug>\に保存(Remotion はレンダリングのたびにpublic全体をコピー;フォルダが大きいと処理が遅くなる)。新しいパスをNOTAS.mdに記録。 - 決して公開、スケジュール、送信しない。 公開するのはクライアントです。
既に解決された落とし穴(再現しないこと)
- Halo:
<Halo>(filter: blurのdiv)を使用し、透明な要素にbox-shadowを使用しない(暗い「ピル」になる)。 - 複数単語の強調:
*10 tarefas*は単語ごとではなく、断片として扱う必要がある(TextoImpacto/Destaqueを参照)。 - ポイントに中央揃えされたラベル(例:
v1)は、96px のマージンを侵害しないために余分な余裕が必要。 - PowerShell:JSON を直接
--props='{...}'に渡すと引用符が失われる。ファイルに保存して--props=arquivo.jsonを使用すること。 - プロジェクト内の録画や動画はリポジトリに追加される:常に
TRABALHOに配置。 - Studio のポートは 3210。
シリーズ(同じテーマの複数のリール)
- エピソードごとに1つのスラッグ(
<serie>-<n>-<tema>)、クライアントが要求した場合はエピソードごとに1つのセッション。並行セッションは同じフォルダを共有:各セッションは自分のスラッグのファイルのみを操作;src/videos/index.tsxは編集前に再読み込みし、自分の<Composition>のみを追加;共有パーツは変更しない。 - すべてに適用される事実と決定事項(変更された数字、CTA、ピラー)は、すべてのセッションに同時に伝える必要がある。これがないと、各動画が異なるルールになってしまう。
- シリーズの最終画面:
src/pecas/TelaFinalReels.tsxをEncerramentoの代わりに使用、台詞の4秒後(再生時間 =duracaoFala+telaFinalSeg)。9:16 の空きスペース2つ(400×711)をクライアントが編集アプリでリールで埋める:1つは次のチャプター用(最後は最初に戻る)、もう1つはシリーズの元となったリール用。
音声(オプション、クライアントが要求した場合、または承認済みの場合のみ)
public内の音声フォルダに4つの短い音声を配置(自身で用意し、明確なライセンスを持つこと:リポジトリは音声を含まない):abertura.mp3(フック時のライザー、音量約0.35)、tecla.mp3(各アイテムが入るとき、約0.3)、whoosh.mp3(ターン/ズーム時、約0.2)、blip.mp3(数字や最終回答が届いたとき、約0.3)。- 各音声は、
@remotion/mediaの<Audio>を持つ短い<Sequence>で、シーンと同じタイミングに固定;パスと音量はスキーマの props(空文字列で無効)。 - レンダリング後、ピークを
ffmpeg -i <video> -af volumedetect -vn -f null -で測定(0 dB 未満、音声は声より小さいこと)。自分では聞けない:クライアントに耳での確認を依頼すること。
録画の教訓
- スクリプトなしで録画する人は、フレーズごとに話し、長い間を置き、始める前にウォームアップし、気に入らないフレーズを繰り返し、最後にフレームアウトすることがよくある。
fabrica-videos-corteスキルがこれらすべてを解決する。 - 録画時に台詞を変えるのはよくあること。アンカーを信頼する前にトランスクリプト全体を読み、実際に話された内容に合わせて画面と投稿のキャプションを調整する。
- 台詞がスクリプトより短い場合、省略された詳細と数字は画面に表示されたままになる。
- 事実を変更する場合(例:更新された数字)、すべての場所で変更:台詞、画面、タイトル、投稿キャプション、カバー。