Editar criativo (クリエイティブ編集)
キットは kit/(このファイルと同じ階層)にあります。すべてのスクリプトは Python 3.10+ で、ffmpeg/ffprobe を使用します。
Windows では python(python3 ではない)で実行してください。ffmpeg がセッションの PATH にない場合、スクリプトは自動的にユーザー PATH から見つけます。
KIT = <この SKILL.md があるフォルダ>/kit
1. オファーとフォルダ
オファー名を確認してください(リクエストにない場合はユーザーに質問)。デフォルトのルートは ~/Documents/Ofertas(Windows では %USERPROFILE%\Documents\Ofertas)です。
python "$KIT/criar_oferta.py" "Velas de Natal"
以下の構造を作成(または既存を補完、削除はしません)します。
| フォルダ | 内容 |
|---|---|
_work | 一時ファイル(最後にクリーンアップ) |
01_prontos | 最終クリエイティブ .mp4 + lote_XX_resumo.csv |
02_brutos | Bロール、参考動画 |
03_apresentadora | UGC・プレゼンター録画 |
04_imagens | 商品写真、ページスクリーンショット |
05_audios | ナレーション(<id>.mp3 + <id>.palavras.json) |
06_efeitos | キットの9つの効果音 + オプションの musica*.mp3(BGM) |
07_roteiros | スクリプトのロット .json |
08_validados | 既に売れているクリエイティブ(モデリング/バリエーションのベース) |
oferta.json を読み込んでください。produto/publico/promessa が空の場合は、ユーザーに質問するか(ユーザーがリンクを渡した場合はセールスページを読んで)入力してください。スクリプトはこれに依存します。
2. 4つの質問(AskUserQuestion の1回の呼び出し)
- モード — 「何をしますか?」
- 新規クリエイティブ — 新しい角度やスクリプトをテスト
- クリエイティブのモデリング — 既に売れている/スケールしているクリエイティブの構造を基に、ゼロから動画を作成(ユーザー自身のものか、市場のもの)
- 検証済みのバリエーション — 検証済みの自分の動画を再利用し、フックだけを差し替え
注意 — 「この検証済みを改善してバリエーションを作って」: ユーザーが自分の売れているクリエイティブを送り、バリエーションや改善版を依頼した場合、デフォルトは モデリング(送られた動画は構造の参考としてのみ使い、新しいスクリプトと画像で全く新しい動画を作成)。「検証済みのバリエーション」(送られた動画の画像と音声を再利用)は、ユーザーが明示的に元の動画を保持するよう指示した場合のみ使用します。 2. 数量 — 「バリエーションはいくつ?」 5 / 10 / 20 / 50 3. 字幕 — 「字幕のスタイルは?」
- 両方を使い分ける(推奨)— バリエーション間で紫のボックスと黄色の単語を交互に使用
- 紫のボックス — 話された単語を紫のボックス内に表示
- 黄色の単語 — 話された単語を黄色で、背景なしで表示
- ナレーション — 「新しいフックとボディのナレーションはどうしますか?」
- 無料音声で生成(推奨)— ポルトガル語のニューラル音声、無料
- ElevenLabs で生成 — ユーザーのアカウントを使用、クレジット消費
- 既にナレーションがある —
05_audiosに音声を配置
ユーザーがリクエストですでに答えている場合は、再度質問しないでください。
ElevenLabs: APIキーは ~/.config/editar-criativo/.env に保存します(ELEVENLABS_API_KEY= と、オプションで ELEVENLABS_VOICE_ID=)。ない場合は、メモ帳でファイルを開いて貼り付けるようユーザーに提案してください。キーを絶対に表示したり、シェルコマンドに含めたりしないでください。
3. ビジュアル素材
02_brutos、03_apresentadora、04_imagens をリストアップします。素材ソースの優先順位は以下の通りです。
- ユーザー自身の素材(商品写真/動画、ページ録画): 常に最良。
- 無料ストック(Pexels + Pixabay) — 補助的なBロール、商用利用可:
python "$KIT/buscar_midias.py" "<oferta_folder>" "candle making" --qtd 6 python "$KIT/buscar_midias.py" "<oferta_folder>" "christmas candle" --tipo foto --qtd 4- ナレーションで示される内容(工程、材料、結果、使用シーン、感情)をカバーする 英語 の用語で3~5回検索します。
--listarでダウンロード前に確認できます。 - ローカルライブラリを優先: すべてのダウンロードは
~/Documents/Ofertas/_bibliotecaに保存されます(videos/、fotos/、indice.json(データベースのタグ+検索済み用語を含む))。各検索ではまずライブラリ内を探し、不足分だけAPIを呼び出します。ファイルはハードリンクでオファーに追加されるため、重複しません。--sem-apiはライブラリのみ使用、--forcar-apiはライブラリを無視します。そのため、オファー間で一貫した英語の用語を使用してください("stretching"、"back pain"、"yoga mat"...)。 - デフォルト: 縦型を優先し、横型で補完します(キットが切り抜きます)。動画は最長40秒、各タイプ
--qtd個の新しいアイテム。動画は02_brutos/、写真は04_imagens/、クレジットは02_brutos/creditos.csv(列origem: ライブラリまたはデータベース)。 - ダウンロード後、ランダム選択ではなく、各クリエイティブに適切なメディアを
midias/midias_baixoに手動で選択してください。発話に合ったBロールはコンバージョンが高まります。 - 証言を偽装するためにストック画像を使用しないでください。識別可能な人物がオファーを推奨しているように見えてはいけません。
- 無料キーは
~/.config/editar-criativo/.env(PEXELS_API_KEY、PIXABAY_API_KEY)。ない場合はスクリプトが警告し、メモ帳で開いて貼り付けるようユーザーに提案します。一つだけでも動作します。(2026年11月、Pexelsは新規キー発行を停止しました。ユーザーは再開までPixabayのみ使用します。)
- ナレーションで示される内容(工程、材料、結果、使用シーン、感情)をカバーする 英語 の用語で3~5回検索します。
- ソーシャルメディアの参考(モデリング/バリエーション用)、ユーザーが承認したリンクを使用:
python "$KIT/baixar.py" "<oferta_folder>" <url1> <url2> ... --pasta 08_validados。 ユーザーが使用権を持つ素材のみ使用してください。
Webアプリ/ページの画面録画: ユーザーが録画(Win+Alt+R)し、02_brutos に保存します。
4. モード別スクリプト作成
ブラジルポルトガル語で記述します(オファーがポルトガル向けの場合はポルトガルポルトガル語)。口語的なUGC調で、短い文を使います。
- hook: 1文、6~14語、話して3秒以内。パターンを破る、好奇心、痛み、または結果。
- gancho_tela: 赤い帯のテキスト、7語以内、hookを補完(繰り返さない)。
- body: 話して15~35秒(約40~90語): 問題 → メカニズム/デモ → 証明 → CTA。
- cta_tela(オプション): 最後の3秒間の緑の帯の短いテキスト(「LINK NA DESCRIÇÃO」)。
- ロット内で角度を変える: 痛み、好奇心、ビフォーアフター、社会的証明、反論、デモ、価格/アンカリング、季節の緊急性、「よくある間違い」、リスト。同じ冒頭を繰り返さない。
- 広告ポリシーを遵守: 治癒の約束、保証された収入、「あなたは [個人属性]」は禁止。
新規クリエイティブ: 異なる角度のN個のスクリプト。
クリエイティブのモデリング: 参考クリエイティブは 08_validados に配置(またはリンクからダウンロード)。文字起こし:
python "$KIT/transcrever.py" "<arquivo>" — ビジュアル部分が重要な場合は、watch スキルで視聴。構造(フックの種類、各ブロックとその長さ、CTA)をマッピングし、このオファーに対して 同じ構造 でN個のスクリプトを作成します。テキストをコピーしないでください。参考動画のフレームや音声は新しい動画に一切使用しません。
モデリングのチェックリスト(ロットの estrutura_modelada にメモ):
- 長さとスピーチブロック — 例: フック 0~3.5秒 → 商品紹介 → ベネフィット → 価格付きCTA。
- ビジュアルフォーマット — 全画面または分割; 常に表示されているもの(デモ、プレゼンター、画面)。
- 売れる固定要素 — キットで再現:
- 上部に固定された名前+価格の帯 →
faixa_fixa(最初の1秒で広告感を出さないため、フックの後に配置); - エクササイズ/ステップ上のカウンター(「12 reps」、「8 x lado」) →
rotulos; - 字幕スタイルと声の性別 → 検証済みと同じ
legendaとvoz。
- 上部に固定された名前+価格の帯 →
- 価格とオファーは検証済みと正確に同じ(それが売れているものだから)。別途指示がある場合を除く。
- 検証済みが低CTRで売れている場合: ボディは機能しており、冒頭が指を止めていない。ボディの構造を維持し、フックに注力: 緊張、テスト(「tenta encaixar a mão no chão…」)、数字/カウント(「117 exercícios por menos de R$ 10」)、信念の打破。0秒からフック帯、フック用の独自画像を
midias_gancho(コイン、骸骨、ジム)に、約1.8秒ごとにカット、Bロールが横型で全画面の場合encaixe: "desfoque"。
検証済みのバリエーション(ユーザーが元の動画を保持したい場合のみ): 既に売れているクリエイティブを文字起こしし、元のフックが終了する場所(最初の文の終わり、通常2~5秒)を見つけ、N個の新しいフックを作成します。各クリエイティブには hook のみ(body はなし)と "base": {"video": "08_validados/arquivo.mp4", "a_partir_de": <segundos>} を含めます。キットが新しいフックのナレーションと元のフック後の元の音声を結合して動画を組み立てます。
a_partir_deはフック後の最初の単語の直前(無音部分をスキップ — 例: フック終了3.56秒、次の単語4.16秒 → 4.05)。transcrever.pyで各単語のタイミングを取得します。- 元のナレーションと同じ性別の声を使用します(声が変わると継ぎ目が不自然)。検証済みに似た字幕がある場合は同じ字幕を使用。キットは新しいフックの音量を検証済みに自動調整します(LUFS)。
- 低CTRで売れている = ボディは売れており、冒頭が指を止めていない: 最初の3~6秒のみ交換(緊張/テスト/数字のフック、0秒からのフック帯、約1.3秒ごとのカット、
"ritmo": 1.3)。
5. スクリプトのロット
<oferta>/07_roteiros/lote_NN.json に保存(次の空き番号):
{
"modo": "novos",
"legenda": "variar",
"narracao": {"motor": "edge", "voz": "pt-BR-AntonioNeural", "velocidade": "+8%"},
"criativos": [
{
"id": "c01",
"angulo": "curiosidade",
"layout": "dividida",
"hook": "Ninguém acredita que essa vela foi feita em casa.",
"gancho_tela": "Ninguém acredita que foi feita em casa",
"body": "Eu comecei com uma panela comum e um pote de vidro...",
"cta_tela": "Link na bio",
"midias": ["02_brutos/x.mp4", "04_imagens/y.jpg"],
"midias_baixo": ["02_brutos/z.mp4"]
}
]
}
フィールド:
legenda:variar|caixa_roxa|palavra_amarela(クリエイティブごとにlegendaを指定することも可能)。narracao.motor:edge(無料) |eleven|existente(05_audios/<id>.mp3を読み込み文字起こし)。 Edge の声:pt-BR-AntonioNeural、pt-BR-FranciscaNeural、pt-BR-ThalitaMultilingualNeural、pt-PT-DuarteNeural、pt-PT-RaquelNeural。クリエイティブ間で男性/女性の声を交互に使用(クリエイティブに"voz"を指定)。layout:dividida(赤い線で分割画面、デフォルト) |cheia。midias/midias_baixo: オプション。指定しない場合、キットは02_brutos、04_imagens、03_apresentadoraからランダムに選択(上半分、下半分)。発話に合うメディアがある場合は手動で選択してください。ritmo: カット間の秒数(デフォルト 2.2)。sfx: false で効果音オフ。musica: false でBGMオフ。gancho_duracao: フック帯を画面に表示する時間を強制(デフォルト: フックが話し終わるまで)。midias_gancho(全画面): フック中のみ使用するメディア。ボディはmidiasのみ使用。フックのインパクト画像(コイン、骸骨など)が動画の途中で再表示されるのを防ぎます。キットは常にフック終了時にカットします。faixa_fixa:{"texto": "117 Exercícios de\nMobilidade e Estabilidade\nApenas R$ 9,90", "cor": "#F97316", "cor_texto": "#111111", "desde": "fim_hook", "y": 0.07, "tamanho": 66, "caixa_alta": false}— フック終了から終わりまで(またはfechamentoまで)表示される帯。\nで改行。textoのみ必須。rotulos:["12 reps", "8 x lado", "30 seg"]— フック後の各カット上に表示される小さなラベル、循環。encaixe:corte(デフォルト、中央を切り抜き) |desfoque— 全画面で、横型動画をぼかした背景の上に幅広の帯として表示、動きを失わない(エクササイズデモに有効)。
ID: 新規クリエイティブは c01…cNN、モデリングは m01…、バリエーションは v01… — オファー内で一意(05_audios/<id> と 01_prontos/<id>.mp4 が ID を使用するため)。新しいロットでは番号を継続。
ユーザーに短い表(id、角度、フック)を表示し、レンダリングに進みます(ただしユーザーが事前に確認を依頼した場合は除く)。
6. レンダリング
python "$KIT/montar.py" "<oferta>/07_roteiros/lote_NN.json"
ネットワーク: 無料音声(edge)と ElevenLabs はインターネット接続が必要です。シェルがサンドボックス内にあり、getaddrinfo failed / ClientConnectorDNSError でナレーションが失敗した場合は、コマンドをサンドボックス外で実行してください。無料音声は断続的に失敗します。キットはそのクリエイティブを諦める前に5回再試行します(他のクリエイティブは続行)。
まだナレーションがないものをナレーションし、すべてを 01_prontos/<id>.mp4(1080x1920、30fps、H.264 + AAC)に出力。さらに 01_prontos/lote_NN_resumo.csv を出力。大きなロットは時間がかかります(クリエイティブあたり約20~60秒): バックグラウンドで実行してください。--ids c03,c07 で一部のみ再実行、narrar.py --refazer --ids c03 で音声を再生成。
7. 確認と納品
2~3個のクリエイティブから1フレーム抽出し、Readで確認:
ffmpeg -ss 1.5 -i "01_prontos/c01.mp4" -frames:v 1 "_work/check_c01.jpg"
確認項目: フック帯が読めるか、字幕が同期して画面内に収まっているか、カットに黒画面がないか。
納品: 01_prontos フォルダ、数量、そして管理画面で広告に名前を付けるためのCSV。