はじめに
広告クリエイティブを大量に用意するとき、一番地味に効いてくるのがアスペクト比とファイル命名の設計です。生成そのものより、後工程(入稿)で事故るケースが多いからです。
この記事では、1枚の商品写真から各SNS向けの広告素材を機械的に量産するときに、実務で踏んだ落とし穴とその回避策をまとめます。筆者は Ravvi という AI 広告生成ツールを個人で開発しており、そこで得た知見がベースです。
1. アスペクト比は「配信面」単位で持つ
媒体単位(Instagram / TikTok / Meta)で比率を持つと、同じ媒体の中で面ごとに要求が違うため必ず破綻します。実際に必要なのは配信面単位です。
| 配信面 | 比率 | 実寸の目安 |
|---|---|---|
| フィード(正方形) | 1:1 | 1080 × 1080 |
| フィード(縦長) | 4:5 | 1080 × 1350 |
| ストーリーズ / Reels / TikTok | 9:16 | 1080 × 1920 |
| 横長(YouTube 等) | 16:9 | 1920 × 1080 |
4:5 を落とすと Meta のフィードで両端に余白が入り、CTR が目に見えて落ちます。1:1 があるから大丈夫、とはなりません。
2. セーフエリアは比率ごとに別テーブルで持つ
9:16 は上下に UI が重なります。上 14% / 下 20% を占有される前提で、テキストは中央 66% に収める必要があります。
SAFE_AREA = {
"9:16": {"top": 0.14, "bottom": 0.20},
"4:5": {"top": 0.06, "bottom": 0.10},
"1:1": {"top": 0.05, "bottom": 0.05},
"16:9": {"top": 0.05, "bottom": 0.05},
}
def text_box(ratio, h):
s = SAFE_AREA[ratio]
return int(h * s["top"]), int(h * (1 - s["bottom"]))
比率ごとに別テキストレイアウトを持つのが結局いちばん安く済みます。1つのレイアウトを共通化して比率だけ変える設計は、9:16 で必ず破綻します。
3. ファイル名に意味を持たせる
入稿担当(あるいは未来の自分)が中身を開かずに判別できる名前にします。
{product}_{concept}_{ratio}_{variant}.{ext}
例: hydroflask_ugc-testimonial_9x16_v03.mp4
比率は 9:16 ではなく 9x16 にします。コロンは一部の管理画面やストレージでエスケープが必要になり、後で必ず面倒になります。
4. manifest を必ず一緒に吐く
素材だけ渡すと、どれがどの訴求軸なのかが1週間で分からなくなります。JSON を1枚同梱するだけで運用が別物になります。
{
"generated_at": "2026-08-28T12:00:00Z",
"source_image": "hydroflask_01.jpg",
"assets": [
{
"file": "hydroflask_ugc-testimonial_9x16_v03.mp4",
"concept": "ugc-testimonial",
"ratio": "9x16",
"duration_sec": 12,
"placements": ["reels", "tiktok", "stories"]
}
]
}
計測結果を後から突き合わせるとき、この concept フィールドがあるかどうかで分析の解像度が変わります。
5. 「1本の名作」より「20本の比較対象」
これは実装の話ではなく設計思想ですが、重要度は一番高いです。1本の完成度を上げるより、訴求軸を変えた20本を同時に出して配信データに判定させたほうが、結果的に当たります。
そのため生成パイプラインは「1枚入れて1枚出す」ではなく、「1枚入れてN本出す」を前提に組みます。並列度とレート制限の設計が最初から必要になるということです。
おわりに
生成AIの品質そのものより、比率・セーフエリア・命名・manifest といった地味な部分が実運用の成否を分けます。
この辺りを丸ごと自動化したくて作ったのが Ravvi です。商品写真を1枚入れると、上記の比率展開・命名・manifest まで含めて広告素材一式が出てきます。同じような課題を踏んでいる方の参考になれば幸いです。