クリエイティブ AgroPerforma · Fábrica Blindada
HyperFrames(npx hyperframes …)上に構築された縦型クリエイティブ(Reels/Ads)の編集パイプラインです。各クリエイティブは JSON レシピ(creative.base.json)を持つプロジェクトとなり、template.html がそれを合成します。
クライアントの詳細ルール、決定事項、フィードバック履歴:
references/regras-do-cliente.md。 編集前に必ず読んでください — これらのルールが、このドキュメントのすべてのパターンに優先します。
必須フロー(3承認)
- カット → 軽量1080pプレビュー(
cut.py --preview)+推奨ファイル名(コード+愛称、例AP-08 · Tudo Depende de Você)。ユーザーが承認。 - ラフ → モーション/キャプションのキーフレーム(
hyperframes snapshot)、動画全体ではありません。ダイナミクス変更(ズーム)の場合はrender -q draftでプレビューを送信。 - 本番 → 4K での本カット(
cut.pyに--preview無し)+render4k.sh(4K 24fps)+barscan.sh(黒帯チェック)。
一度に1動画ずつ、最初から最後まで。 Whisper large-v3 + ffmpeg 4K +並列レンダリングはMacBookを過熱させ再起動します。
環境
- クライアントのSSDはexFATです(シンボリックリンク非対応 →
hyperframes initが失敗します)。/Volumes/AGROPERFORMA-HFにマウントされたAPFSイメージ内で作業します(scripts/montar.sh)。スクリプトはこのパスを前提としています:projetos/<código>/、projetos/_kit/(=このscripts/+assets/フォルダ)、_scratch/(一時ファイル、faces.swift、shift.swift)。 - すべてのコマンドの前に
source scripts/env.shを実行: TMPDIR、履歴、HyperFramesキャッシュはボリューム上に置かれ、Macのディスクには決して置かれません。 - アプリ再起動時にボリュームはアンマウントされます — 各ステップの前に再マウント。長時間ジョブは
nohup caffeinate -iで実行。 - フォント: Helvetica Now Display Bold(ライセンス済み — リポジトリにはありません;
projetos/_kit/fonts/にコピー)。
ステップ1 — カット
| ステップ | ツール |
|---|---|
| 音声チャンネル(L/Rで異なるマイク;最も強い方を選択、方向が現れたら誰が話しているか確認) | prep_lote.sh(レベル+文字起こし) |
| 生テイクのフレーズ、1つずつ文字起こし(Whisperの長いポーズは不正確) | phrasemap.py <wav> |
| 0.2秒以上のポーズを除去、0.07秒の息継ぎ残す | plan.py <wav> a:b … --gap 0.2 --pad 0.07 |
| 言い間違い(「だ、ど」、「て、え、う」、「く… く」):RMS 20ms+候補を結合して文字起こし;音節を分離して確認 | fine.sh、chunk.sh |
フレームアラインされた連続カット(単一 <video> → LUTが「断片的」にならない)、両チャンネル同じチャンネル、0.5秒+0.7秒の黒フェード | cut.py [--preview] [--no-fade] [--multi] |
実際の話し始めから開始。最後の単語の約0.5秒後+フェードで終了(例外: 最後に人物が視線をそらす場合 → --no-fade)。
ステップ2 — レシピ(creative.base.json)
{
"theme": "green", // green = AgroPerforma (#62AE46) · blue = Fábrica Blindada (#1f4cd7/#0c1f51)
"adjust": {"highlights": -0.25, "shadows": -0.15}, // または "exposure": 0.15
"trackMode": "shot", // ズーム区間ごとに1回顔を中央に配置
"cam": [{"start": 0, "end": 6.78, "s": 1.12, "to": 1.04, "cx": 0.5}],
"captions": [["static text", 1.12, 2.48]],
"motions": [{"start": 5.45, "end": 6.78, "top": 900,
"items": [{"text": "Tudo depende de você?", "at": 5.45, "kind": "secondary", "check": true, "ring": 5.8}],
"arrow": 6.2}]
}
analyze.sh <projeto>→ フレームごとの顔検出(Apple Vision)+カットの文字起こし;caps.pyが自動キャプションを生成(2~4単語でグループ化、「Eo/Ea/Eaí」を修正、孤立したキャプションを統合)。mkcfg.py <projeto>→ ズーム/トラッキングを完成させ、build.pyを介してindex.htmlを生成。- キャプションは画面中央に静的に配置され、モーション表示中は非表示。
- タイプ: ショート(CTA~10~15秒)=モーションのみ · ミディアム=キャプション+キーワードのモーション ·
-GRANDE=キャプション+最終CTAモーションのみ。 - 落ち着いたズーム: 40秒で約5区間、切り替え間隔は6秒以上、思考の切り替え箇所のみ;ズームイン/アウトを交互に。各区間で顔を中央に配置、フレームごとにズームマージン内でフレーミング制限(黒帯を表示しない)。
ステップ3 — 本番
python3 scripts/cut.py "<bruto>.MP4" media/cut.mp4 L <a:b> … # 4K
python3 scripts/mkcfg.py projetos/<código>
HF_DEST="<pasta EDICAO>" scripts/render4k.sh <código> <Nome>_v1_4K
scripts/barscan.sh "<pasta EDICAO>/<Nome>_v1_4K.mp4" # 黒帯フレーム0確認
すべてをプロジェクトの PROJETO.md(生テイク、チャンネル、テキスト、除外内容、バージョン)と projetos/CATALOGO.md に記録。バージョン番号を付け、上書き禁止。
例
examples/ には実際のレシピ(creative.*.json)、PROJETO.*.md、フックバリエーション生成スクリプト(ap08_variants.py — 同じ本文、3つの異なる冒頭文)、レンダリングキュー(fila_*.sh)が含まれています。