/bb:edit
目標
生のフッテージを、見知らぬ人が立ち止まり、何かを感じ、行動を起こす短尺動画に変えること。1080x1920のマスターと、適切な1080x1350のフィードマスター。両方とも約-14 LUFS。背後には、なぜ各カットがその位置にあるのかを説明する編集計画があること。
まず最初に:このMacを確認する
python3 "${CLAUDE_SKILL_DIR}/scripts/setup.py" --data "${CLAUDE_PLUGIN_DATA}"
各ツールごとにステータス行が1行出力され、正確な修正方法が表示され、最後にREADYまたはNOT READYが表示されます。再実行しても安全で、全てが揃っていれば数秒で完了します。初回実行時はPythonツールをビルドするため、数分かかります。
NOT READYの場合は、修正コマンドをその人に伝えて停止してください。モデルのみが不足している場合は、約490 MBであることを伝え、承諾を得たら同じコマンドに--download-modelsを追加して実行します。OPTIONALの行はブロックしません。
次に:何をしようとしているのか尋ねる
このスキルを実行する人が文脈を保持しており、その人がここで言うことが良い仕事の鍵です。私たちの広告が失敗したのは何も質問しなかったからです。リールがうまくいったのは、誰かが実際の文脈を提供したからです。
まず、既にあるもの(フッテージ、スクリプト、ブリーフ、メモ)を見て、それを言い換え、相手が再入力するのではなく確認できるようにします。1ラウンドで簡潔に質問してください(まとまっているならAskUserQuestionを、そうでなければメッセージ内で)。
相手が既に伝えていない限り、必ず最初に質問します:
- 何をしようとしていて、それはどんな種類の動画ですか?認知度向上動画、ショーケースリール、何かを売る有料広告、UGCや創業者のトーク、舞台裏、その他?
次に、不足しているものだけを質問:
- 誰に向けたもので、彼らに何を感じてもらい、視聴後に何をしてもらいたいですか?
- どんなスタイル?どのリファレンスが最も近いですか?その後、実際のフッテージから選択するためのオプションを表示します。
- フッテージ、音声や音楽、長さ、配信先は?
広告の場合、スクリプトのバイヤーとフェーズは引き継ぐか、/bb:scriptを先に実行します。編集ではアイデアや主張を決して入れ替えません。それはスクリプトに戻ります。
答えをjob/brief.mdに書き、最後まで作業します。唯一の停止点はステップ2のオプションです。全てが与えられているか、「そのまま進めて」と言われた場合は質問しません。誰も答えられない場合(ヘッドレス実行)は、本来質問すべきだったことを述べ、妥当な解釈を採用します。
センスは仕事に属する
質問1がジョブを決定します。それをjob/brief.mdの最初の行に書きます。ある動画で誰かが気に入ったものは、別の動画には引き継がれません。オーガニックリールと広告は異なる仕事です。広告は売るためのものです。したがって、広告は誰に向けたものか、製品のセールスポイント、証拠、購入理由で判断され、オーガニック作品のジョークや雰囲気では判断されません。オーガニックカットからの教訓は広告に縛られず、その逆も同様です。
なぜか
ジェネリックなAI編集は、音楽のビートごとにカットし、すべてのショットに同じ長さを与え、すべてにプッシュインをかけ、最後の単語が終わった瞬間に停止します。これらのそれぞれは、ここでは拒否されてきました(lessons.mdを参照)。編集書は同じ質問により良く答えてくれるため、決定ごとに参照します:Murchは思考が終わる場所、Pearlmanはリズムと開かれた質問、Blockは視線の向く場所。書籍は質問と一節であり、声ではありません。
良い状態とは
- フレーム0は音をオフにした状態でも静止画として機能する。製品、結果、または驚きであり、ロゴや挨拶ではない。
- フックで1つの質問が開かれ、ペイオフまで開いたまま。
- カットは、思考や動きが完了する場所に配置され、グリッド上ではない。少なくとも1つのショットは他のショットよりも長く保持され、意図的な間として読まれる。
- 各ショットで最も明るい、または動いているものが、見るべきもの。テキストは顎の下か、明確な空の部分に配置。決して口の上には重ねず、同じ言葉を言う別の行とスタックしない。
- クローズは前のショットよりも落ち着いており、依頼は明確。エンディングが決まる。音楽はそれ自身の終わりか、実際のフレーズで終了。まだ続いている曲にフェードアウトをかけたり、最後のヒットの上に重ねたりしない。
- 実際の音が含まれている。フッテージ内の人物は音楽の上で聞こえる。曲の最も大きな瞬間は、映像の最も大きな瞬間と一致する。
- フッテージは撮影されたままに見える。iPhone本来の色、フレーミングは静的、製品のみに優しいプッシュイン、動くズームなし、ミラーフィルなし、黒帯なし。
- 4:5は同じEDLから再レイアウトされ、キャプションと顔がフレーム内に収まる。
コマンド
リファレンスファイルはこれらを短く書きます。シェル状態はコマンド間で引き継がれないため、常に完全な形式を使用し、批評エージェントにも完全な形式を与えてください。
PYは"${CLAUDE_PLUGIN_DATA}/venv/bin/python"、セットアップがビルドしたPython。すべてのPythonスクリプトはこれで実行します。scripts/...は${CLAUDE_SKILL_DIR}/scripts/...。references/...は${CLAUDE_SKILL_DIR}/references/...。search.pyはpython3 "${CLAUDE_PLUGIN_ROOT}/skills/books/scripts/search.py"。
ワークフロー
ジョブフォルダ:<client>-<job>/。現在いるフォルダか、ブリーフが指定するフォルダ(job/)。フッテージは元の場所にそのまま置きます。書き込むのはレンダリングのみ。
- 読み、聴く。 計画を立てる前に
PY scripts/listen.py clips <footage> --out job/soundを実行。各クリップを文字起こしし、発話、笑い声、叫び声、音量ピークを見つけます。すべてを読みます。オフカメラのラインはしばしばアイデアであり、ショットが実際に何であるかを教えてくれます(ある広告の「アプリケーション」ショットは、監督が「何も適用する必要はありません」と言っているものでした)。PY scripts/listen.py song <track>も実行し、歌詞を読みます。映像と競合するか、助けるかがわかります。その後、クライアントからのメモ、lessons.md、クライアント自身の過去の編集フォルダ(そのクライアントのみ、examples/README.md参照)、スクリプトまたはブリーフを確認します。scripts/probe.sh <footage> > job/footage-log.mdを実行し、次にクリップを視聴してタイムコードで最良の瞬間を追加します。HDRは他のすべての前にscripts/proxies.shで変換します。他人が書いたフッテージログは手がかりであり事実ではありません。EDLに入れる前にすべての選択のフレームを確認します(scripts/sheet.sh <clip> <start> <len> job/sheets。これによりフッテージの横には何も書き込まれません)。スクリプトまたはブリーフが行う各主張を、それを示すクリップの瞬間とリストアップします。どのクリップも示さない主張は、今すぐ変更または削除します。批評家が後で行うことではありません。雰囲気を一言で、その人の言葉で書きます。 - 計画。
references/plan.md、rhythm.md、eye.md、sound.mdを読み込みます。PY scripts/beats.py <track>で音楽を測定します:テンポ、最初のビート、ラウドネスマップ(トラックがmusic.startに向けてすでに動いている場所を示す)。ビートごと(フック、ターン、ペイオフ、クローズ):感じるべきこと、リズム、視線の着く場所、音。列ごとに1回検索。job/plan.mdを書き、各行にパッセージIDを付けます。 - オプション。 セクションごとに約3つの処理(カジュアル、ミドル、エクストリーム)をタイルとして提供。各タイルは1フレームと1行の説明。人が選びます。その場にいないか、「そのまま進めて」と言った場合、選択し、理由を
options.mdに記録し、他の選択肢も見えるようにしておきます。その場合はオプションのテーブルで十分です。 - ラフカット。
references/formats.mdを読み込みます。job/edl.jsonを作成し、次にmix.py(サウンド)とcut.py --draft(プロキシ上で)を実行します。結果に対してscripts/sheet.sh、結果に対してlisten.py cutを実行し、レポートとその波形画像を読みます。シート、フックストリップ、フレーム0を自分で見て、音をオフにして一度視聴します。 - 批評。 新しいエージェントが
job/brief.md(ジョブに対して判断するため)、フルサイズのフレーム0、フレーム、ストリップ、リッスンレポート、ミックスログ、主張リスト、references/critic.md、完全なsearch.pyコマンドを取得します。フレーム0が最初に来ます。サムネイルは誤読する可能性があるため。あなたのメモやこのチャットではありません。ビートごとのノート、最大3つの修正(パッセージID付き)、および判定を返します。 - 最終。 批評家が見つけた問題を修正します(またはブリーフが優先される理由を書き留めます)。EDLをフル品質のSDRファイルに向け、
--draftなしでレンダリングし、次にreframe.pyで4:5を作成し、結果に対してcheck_cut.pyとlisten.py cutを実行します。すべてのFAILを修正します。すべてのWARNを読みます。まだ誰も聴いていないことを明確に述べます。 レポートは測定しますが、聴きはしないため、ボイスラインとミックスは実際に人の耳で確認する必要があります。両方のマスターのシート。README.txtと納品はformats.mdの通り。
2つのファイル、フレーム0、批評後に変更された内容をビートごとに1行、書籍を1回だけ名前を挙げて返信します。引用はplan.mdに残し、動画には決して表示しません。
絶対的な制限
- 変更された主張やアイデアは
/bb:scriptに戻します。フッテージやサウンドがアイデアを台無しにする場合は、停止し、批評家とともに診断とスクリプトをやり直します。編集の途中で新しいラインを入れ替えることは絶対にしません。私たちの広告の1つは、編集でラインを入れ替え、オーディエンスも存在理由もないまま出荷されました。 - ドラフトの前に必ずオプションを表示。誰もいなければ選択して記録。スキップ禁止。
- 声の速度を変えたり遅くしたりしない。
cut.pyは、ショットの速度が1でない場合、そのショットのオーディオをミュートします。 - ノイズ除去、ぼかし、動くズーム、ミラーフィル、黒帯は禁止。HDRはまずavconvertでSDRに変換。トーキングヘッドとUGCにはグレーディングなし。軽いルックはブリーフが要求する場合のみ(EDLの
look)、返信で明示的に述べる。 - ショットのオーディオがオフになっているのに、その理由が計画に書かれていない状態で出荷してはいけません。
- ショットは、実際に起こったこと以上の証明にはなりません。オーディオが口パクと言っているなら、それは証明ではありません。
- キャプションは話されている言語で、重要な単語はすべて、決して口の上に重ねず、コールアウトとスタックしない。
- 画面上の主張、価格、オファーはブリーフまたはクライアントのライブサイトからのみ。決して創作しない。
- クライアントに送付、公開、または費用が発生するものは、その人の承認なしに行わない。クライアントのDriveへの納品とメッセージは、その人用に下書きし、本人が送信します。
ノウハウ
- テキスト: Homebrewのffmpegにはdrawtextもlibassもないため、テキストは
scripts/text_png.swift(CoreText、cut.pyによって一度コンパイル)でPNGとして描画し、overlayで重ねます。フォントはassets/fonts/(Geist Black、Geist Bold、Playfair Display Italic)。クライアント独自のフォントはEDLのstylesブロックにパスで指定します。 - Whisperは英語で、オフカメラの声を聞き間違えます。
listen.pyはsmall英語モデルを使用します。キャプションするラインはフレームを読んで確認。疑わしいラインをより明確に読み取るには、setup.py --download-largeでより大きなモデル(1.6 GB)を追加し、listen.py clips --largeで使用します。 - 速度: 最終レンダリングは、1080pソースから1080x1920で、他のエンコードが実行中の場合、約3〜5フレーム/秒。30秒の広告で3〜5分。ラフカットには
--draftを使用。長時間のレンダリングはバックグラウンドタスクとして実行。 - ビートに合わせたカット:
beats.pyはファイルからbpmとoffsetを測定します。トラック全体を測定します。2つの半分が一致するか確認し、イントロの短いウィンドウは間違ったパルスにロックオンする可能性があります。音楽にbpmとoffset(ファイル内での最初のダウンビートまでの秒数)、またはbeatsのリストを与えます。終了がビートに合うべきショットには"snap": trueをマーク。デフォルトではそれらのみスナップします。cut.py --beatsは現在のカットに対するグリッドを表示します。ターンとペイオフをスナップし、すべてのカットをスナップしないでください。check_cut.pyはカットの80%以上がビート上にある場合に警告します。 - テキストタイミング: 絶対秒数ではなく、ショットにテキストを結び付けます(
"shot": 2, "at": 0.3, "dur": 1.2)。これにより、ビートスナップがカットを移動した場合でも、ショットに追従します。 - ラウドネス: 線形モードで-14 LUFSへの2パス
loudnorm、次に4倍サンプルレートのリミッター。cut.pyはファイルを測定し、AACが-1 dBTPを超えた場合は低い天井で再エンコードします。音楽は、ショットが独自の音声を保持する場合、デフォルトでクリップオーディオより14 dB低くなります。music.gain_dbで変更可能。 - 4:5:
reframe.pyは各ショットを9:16とまったく同じようにフレーミングし、ショットごとに1350行のウィンドウ(y45、デフォルト285)を取得します。テキストは画面上の位置を保持し、内側に40ピクセル引き込まれます。9:16のテキストを行330から1590の間に保てば、4:5で追加の作業は不要。 - セーフゾーン(9:16): 行270より上、または1590より下には、全画面カード以外は何も配置しない。下部12%はMetaのボタン領域。
- シート:
sheet.sh <video> [start] [len]は40フレームのシート(横に.txtにタイムコード)、フック(または任意のウィンドウ)の10 fpsストリップ、フレーム0を書き込みます。フラッシュフレームはシートではなくストリップに表示されます。 - クリップの終わり:
cut.pyはショットのoutが映像の最終フレームを超えている場合に警告し、そのフレームを保持します。これによりマスターがオーディオより短くなるのを防ぎます。フリーズが見える場合はoutを戻します。 - 手持ち撮影とプッシュイン:
xはショットごとに1つの数値であるため、手持ちの被写体がフレームから出ていく可能性があり、プッシュインはその動きを拡大します。そのショットのウィンドウを動画で確認(sheet.sh <render> <shot start> <len>で10 fpsストリップ)してからフレーミングを信頼します。 - ワードタイムのずれ: whisperの単語ごとのタイムは最大2秒ずれることがあります。ラインを入れる前に、そのスライスだけを文字起こしします。どちらかの端で単語が失われている場合、カットが間違っています。
- リップシンク: 電話からのコピーはオーディオが約0.1秒早い場合があります。カットする前に1つのクリップを確認します。声が先行している場合、画像の
inを調整します。言葉は決して調整しません。 - 書籍検索:
search.py "<リテラルワード>" --job feel|rhythm|eye --book murch|pearlman|block --k 6、次に--show <id>で1つのノートを読む。リテラルワードは機能します。質問は機能しません。
リファレンス(判断によって読み込む)
references/plan.md:4ビート計画、ビートごとに列ごとに1行、および列ごとのクエリ。references/rhythm.md:カットが入る場所、ホールド、パターン変更、開かれた質問。references/eye.md:視線が向かう場所、テキスト配置、セーフゾーン、4:5バンド。references/sound.md:リスニングステップ、声、音楽、効果、ラウドネス、エンディング。references/critic.md:ルーブリック。批評エージェントのみが読み込む。references/formats.md:EDLの構造、スクリプトの順序、出力、最終ファイルの配置場所。references/drawings.md:ブリーフが要求する場合の、カットに重ねる手描きアニメーション。
教訓
lessons.mdには、実際の反応と結果からの日付付きの行が保持されています。ステップ0で読み込みます。批評家は、カットを最近の5つと照らし合わせます。このフォルダはアップデートのたびに置き換えられるため、クライアント独自の教訓はそのクライアントのフォルダに保存し、全員向けの教訓はリポジトリを通じて追加します(CONTRIBUTING.md)。