mcpField
V
video-ad-generator

video-ad-generator

github.com/creatify-aiマーケティング・グロース6845 回インストール34 週間前に更新
リポジトリ

video-ad-generator について

Video Ad Generator は、動画広告の企画と API 自動化を扱うフレームワークです。広告を設計し大量に制作するマーケティング・EC チーム向けで、台本、広告構成、複数プラットフォームの形式、テスト手法を扱い、Creatify API の自動化例も含みます。

主な機能

  1. 01クリエイティブブリーフとフックのテンプレート
  2. 02広告本文の構成と CTA の設計
  3. 03複数プラットフォーム向け動画形式の選定
  4. 04広告バリエーションの A/B テスト設計
  5. 05Creatify API による素材生成の自動化

活用シーン

  1. 01商品の動画広告案を作成
  2. 02商品ページから動画広告を作成
  3. 03複数プラットフォーム向けに広告サイズを調整
  4. 04異なるフックや CTA をまとめてテスト

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/creatify-ai/video-ad-generator --skill video-ad-generator

インストール後、Claude Code で/video-ad-generatorを入力して読み込まれたか確認します。

同梱ファイルREADME.mdLICENSE

詳細

動画広告ジェネレーター

成果の高い動画広告を作成するための包括的なフレームワークです。クリエイティブ戦略から大規模な制作までを網羅します。


パート 1:動画広告作成フレームワーク(単独版)

1.1 クリエイティブブリーフのテンプレート

広告を作成する前に、このブリーフに記入してください。制作に入る前に、戦略的な思考を促します。

CREATIVE BRIEF
==============

Product/Service: _______________
Product URL: _______________
Price Point: _______________

TARGET AUDIENCE
- Demographics: _______________
- Primary pain point: _______________
- Secondary pain points: _______________
- Current solution they use: _______________
- Objections to buying: _______________

PRODUCT POSITIONING
- Core benefit (1 sentence): _______________
- Supporting benefits (3 max): _______________
- Proof points (reviews, stats, awards): _______________
- Unique mechanism (what makes it work): _______________

AD SPECIFICATIONS
- Platform: [ ] Meta [ ] TikTok [ ] YouTube [ ] LinkedIn [ ] Other
- Format: [ ] 9:16 [ ] 16:9 [ ] 1:1 [ ] 4:5
- Length: [ ] 15s [ ] 30s [ ] 60s
- Tone: [ ] Professional [ ] Casual [ ] Urgent [ ] Humorous [ ] Educational
- CTA: _______________

CREATIVE DIRECTION
- Style: [ ] UGC [ ] Avatar [ ] Product Demo [ ] Testimonial [ ] Explainer
- Must include: _______________
- Must avoid: _______________
- Reference ads (URLs): _______________
1.2 フックの公式

最初の 3 秒で、視聴者が広告を見続けるかどうかが決まります。実績のある次の公式を活用してください。

パターンの中断

予想外の要素でスクロールの流れを断ち切ります。

  • 「[視聴者を示す言葉]に当てはまる人は、スクロールを止めてください」
  • 「[衝撃的なビジュアル]+えっ、何?」
  • 動作の途中から始めます(開封、製品の使用、劇的な発表)

最適な用途: TikTok、Instagram Reels、幅広い視聴者層

質問フック

視聴者が答えを知りたくなるような好奇心のループを作ります。

  • 「[直感に反する主張]だとしたら、どうでしょう?」
  • 「なぜ[ユーザー層]は[製品カテゴリー]に乗り換えているのでしょうか?」
  • 「[視聴者の問題に関する驚きの統計]をご存じでしたか?」

最適な用途: 教育関連製品、B2B、購入を慎重に検討する製品

大胆な主張

最も強力なメリットを、自信を持って提示します。

  • 「[製品]のおかげで、[高価な代替品]を使わなくなりました」
  • 「[製品]に乗り換えて、[具体的な金額]を節約しました」
  • 「実際に[大胆な約束]を実現する唯一の[製品カテゴリー]」

最適な用途: 競争の激しい市場、DTC 製品、価格面で優位性のある製品

POV フック

視聴者を共感できるシナリオに引き込みます。

  • 「POV:ついに[問題を解決する][製品]を見つけた」
  • 「POV:朝 6 時、[憧れを感じさせる製品の使い方]をしている」
  • 「[製品]の存在を知ったときの私:」

最適な用途: ライフスタイル製品、Z 世代/ミレニアル世代の視聴者、TikTok

統計/権威性フック

データや専門性を用いて、すぐに信頼性を確立します。

  • 「[数字]人が間違っているはずがありません」
  • 「皮膚科医は[主張]と言います。その理由はこちら」
  • 「[数字]種類の[製品]を試した結果、これが一番でした」

最適な用途: 健康/美容、B2B、高級製品、懐疑的な視聴者層

1.3 本文の構成

フックの後に、本文でメッセージを伝えます。目的に合った構成を選んでください。

問題・扇動・解決(PAS)
  1. 問題(2~3 秒):悩みを明確に示します
  2. 扇動(3~5 秒):解決しない場合の影響を見せ、緊急性を感じさせます
  3. 解決(5~8 秒):自然な解決策として製品を紹介します

最適な用途: 悩みの解決を訴求する製品、健康/ウェルネス、生産性ツール

特徴の連続提示
  1. 主要な特徴(3~4 秒):最も印象的な機能から始めます
  2. 補足する特徴 1(2~3 秒):信頼性や実用性を加えます
  3. 補足する特徴 2(2~3 秒):二次的な懸念に対応します
  4. 証拠(2~3 秒):簡潔なソーシャルプルーフやデモ結果を示します

最適な用途: テクノロジー製品、SaaS、多機能製品

ソーシャルプルーフの積み重ね
  1. 推薦コメント/レビューの引用(3~4 秒):実際の顧客の言葉を紹介します
  2. 視覚的な証拠(3~4 秒):使用前後の比較、デモ、または結果のスクリーンショット
  3. 利用者数による証明(2~3 秒):「[X]人のお客様に続きましょう」または星評価
  4. 緊急性(2~3 秒):期間限定のオファーや在庫の希少性を伝えます

最適な用途: E コマース、サブスクリプション製品、競争の激しい市場

使用前/使用後
  1. 使用前の状態(3~5 秒):問題を視覚的に見せます
  2. 変化の瞬間(2~3 秒):製品を使用している様子を見せます
  3. 使用後の状態(3~5 秒):改善された結果を見せます
  4. 入手方法(2~3 秒):CTA

最適な用途: 美容、フィットネス、住宅改修、清掃用品

1 日の暮らし
  1. 朝の習慣(3~4 秒):日常生活の中で製品を使う様子を見せます
  2. 重要な瞬間(3~4 秒):気づきの瞬間や主な使用例を紹介します
  3. 結果/気持ち(3~4 秒):感情面での満足感を伝えます
  4. 呼びかけ(2~3 秒):「ぜひお試しください」という CTA

最適な用途: ライフスタイル製品、UGC 形式の広告、TikTok/Reels

1.4 CTA のパターン
CTA の種類例最適な用途
直接的「今すぐ購入」/「今日手に入れましょう」E コマース、購入意欲が明確な場合
興味喚起「[X] 人が乗り換えた理由を見る」比較検討段階
緊急性「この価格での在庫は残り [X] 個」在庫限定、プロモーション
リスクの軽減「30 日間無料でお試しください」SaaS、サブスクリプション、高価格帯
ソーシャル「満足している [X] 人のお客様に加わりましょう」コミュニティ主導型の製品
ベネフィット「今日から [望む成果] を始めましょう」変化をもたらす製品
1.5 マルチフォーマット広告戦略
プラットフォームのフォーマットガイド
プラットフォーム主なフォーマット副次フォーマット最大長自動再生?
TikTok9:16—60 秒(15~30 秒が最適)はい、音声オン
Instagram Reels9:16—90 秒(15~30 秒が最適)はい、デフォルトで音声オフ
Instagram Feed1:1 または 4:59:1660 秒(15 秒が最適)はい、音声オフ
Facebook Feed1:1 または 4:516:9240 秒(15~30 秒が最適)はい、音声オフ
YouTube Shorts9:16—60 秒(30~45 秒が最適)はい、音声オン
YouTube Pre-roll16:9—15 秒または 30 秒(スキップ不可:6~15 秒)はい、音声オン
LinkedIn16:9 または 1:1—30 秒(15 秒が最適)はい、音声オフ
フォーマット選択マトリクス
Need maximum reach on mobile? → 9:16
Running YouTube pre-roll? → 16:9
Want to repurpose across Meta + LinkedIn? → 1:1
Instagram Feed placement priority? → 4:5
Creating one asset for everywhere? → 1:1 (safest universal)
マルチフォーマット制作戦略

プラットフォーム横断キャンペーンを作成する場合:

  1. ヒーローアセット:まず 9:16 版を作成します(縦型は最も多くのプラットフォームで使えます)
  2. 1:1 に適応:フィード掲載向けにトリミングするか、フレームを調整します
  3. 16:9 に適応:YouTube/LinkedIn の横型表示に対応します
  4. 音声オフのプラットフォーム向けに、必ずテキストセーフ版(字幕を埋め込み済み)を作成します
1.6 A/B テストのフレームワーク
テスト項目(優先順位順)
  1. フック(影響が最も大きい):同じ本文で 3~5 種類の異なるフックをテストします
  2. CTA:2~3 種類の CTA をテストします
  3. フォーマット/アスペクト比:同じプラットフォームで 9:16 と 1:1 を比較します
  4. 長さ:同じ内容で 15 秒と 30 秒を比較します
  5. アバター/プレゼンター:異なる属性やスタイルを比較します
  6. 音楽/音声:BGM あり、BGM なし、ナレーションのみを比較します
テストのルール
  • テストごとに変更する変数は1 つにします
  • 評価を始める前に、各バリエーションで最低 $50~100 を消化します
  • 傾向を判断するには、各バリエーションで少なくとも 1,000 インプレッションが必要です
  • 曜日による差を考慮し、最低でも 3~7 日間実施します
  • 主指標:フック率(3 秒視聴数/インプレッション数)
  • 副指標:視聴維持率(動画完了数/3 秒視聴数)
  • 成果指標:CPA または ROAS(十分な消化額がある場合にのみ有効です)
バッチテストのワークフロー
1. Write 5 hook variants for same product
2. Pair each hook with identical body + CTA
3. Generate all 5 as video ads
4. Launch as separate ad sets with identical targeting
5. After 3 days: Kill bottom 2 performers
6. After 7 days: Scale winner, create new hooks inspired by winner
1.7 バッチワークフローのアーキテクチャ

以下の非同期パターンは、Creatify に限らず、あらゆる動画生成 API で使用できます。

非同期ポーリングパターン
import time
import requests

def poll_until_done(status_url, headers, max_wait=600, interval=10):
    """Universal async polling for video generation jobs."""
    elapsed = 0
    while elapsed < max_wait:
        resp = requests.get(status_url, headers=headers)
        data = resp.json()
        status = data.get("status", "")

        if status == "done":
            return data
        elif status in ("failed", "error"):
            raise Exception(f"Job failed: {data.get('failed_reason', 'Unknown')}")

        time.sleep(interval)
        elapsed += interval

    raise TimeoutError(f"Job did not complete within {max_wait}s")
Webhook ハンドラーパターン
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route("/webhook/video-complete", methods=["POST"])
def handle_video_webhook():
    """Receive webhook when video generation completes."""
    payload = request.json
    job_id = payload["id"]
    status = payload["status"]

    if status == "done":
        video_url = payload["video_output"]
        # Process completed video (download, notify, queue next step)
        process_completed_video(job_id, video_url)
    elif status == "failed":
        handle_failure(job_id, payload.get("failed_reason"))

    return jsonify({"received": True}), 200
レート制限とエラー復旧
import time
from collections import deque

class RateLimiter:
    """Token bucket rate limiter for API calls."""

    def __init__(self, max_per_minute=30):
        self.max_per_minute = max_per_minute
        self.timestamps = deque()

    def wait_if_needed(self):
        now = time.time()
        # Remove timestamps older than 60 seconds
        while self.timestamps and self.timestamps[0] < now - 60:
            self.timestamps.popleft()

        if len(self.timestamps) >= self.max_per_minute:
            sleep_time = 60 - (now - self.timestamps[0])
            time.sleep(max(0, sleep_time))

        self.timestamps.append(time.time())

def batch_generate_with_retry(jobs, generate_fn, max_retries=3):
    """Process a batch of generation jobs with retry logic."""
    limiter = RateLimiter(max_per_minute=30)
    results = []

    for job in jobs:
        retries = 0
        while retries < max_retries:
            try:
                limiter.wait_if_needed()
                result = generate_fn(job)
                results.append({"job": job, "result": result, "status": "success"})
                break
            except Exception as e:
                retries += 1
                if retries == max_retries:
                    results.append({"job": job, "error": str(e), "status": "failed"})
                else:
                    time.sleep(2 ** retries)  # Exponential backoff

    return results

Part 2: API による自動化

API を使って、Part 1 のすべてを大規模に自動化します。

2.1 セットアップと認証
import requests

CREATIFY_API_ID = "your-api-id"
CREATIFY_API_KEY = "your-api-key"

HEADERS = {
    "Content-Type": "application/json",
    "X-API-ID": CREATIFY_API_ID,
    "X-API-KEY": CREATIFY_API_KEY,
}
BASE_URL = "https://api.creatify.ai/api"

API キーをまだお持ちでない場合ご安心ください。2 分以内に取得できます。

  1. creatify.ai で無料登録します
  2. Settings → API に移動します
  3. API ID と API Key をコピーすれば完了です。新しいアカウントには、すぐに使える無料クレジットが付与されます。
2.2 URL から動画を作成

あらゆる製品 URL を、完成した動画広告に変換します。最もよく使われるエンドポイントで、E コマースチームに最適です。

フロー: URL → スクレイピング → AI スクリプト → プレビュー → レンダリング

コスト: 動画 30 秒あたり 5 クレジット+リンクに 1 クレジット+スクリプトに 1 クレジット

ステップ 1:URL からリンクを作成
def create_link(url):
    """Scrape product data from a URL."""
    resp = requests.post(f"{BASE_URL}/links/", headers=HEADERS, json={"url": url})
    resp.raise_for_status()
    return resp.json()  # Returns id, title, description, images, etc.
ステップ 2:AI スクリプトを生成
def generate_scripts(title, description, language="en", target_audience="general", video_length=30):
    """Generate AI marketing scripts for the product."""
    resp = requests.post(f"{BASE_URL}/ai_scripts/", headers=HEADERS, json={
        "title": title,
        "description": description,
        "language": language,
        "target_audience": target_audience,
        "video_length": video_length,
    })
    resp.raise_for_status()
    return resp.json()
ステップ 3:リンクから動画を作成
def create_video_from_link(link_id, script=None, aspect_ratio="9x16", webhook_url=None):
    """Generate a video ad from a scraped link."""
    payload = {
        "link_id": link_id,
        "aspect_ratio": aspect_ratio,
    }
    if script:
        payload["script"] = script
    if webhook_url:
        payload["webhook_url"] = webhook_url

    resp = requests.post(f"{BASE_URL}/link_to_videos/", headers=HEADERS, json=payload)
    resp.raise_for_status()
    return resp.json()
ステップ 4:完了までポーリング
def check_video_status(video_id):
    """Check status of a video generation job."""
    resp = requests.get(f"{BASE_URL}/link_to_videos/{video_id}/", headers=HEADERS)
    resp.raise_for_status()
    return resp.json()

# Use the poll_until_done helper from Part 1:
result = poll_until_done(
    f"{BASE_URL}/link_to_videos/{video_id}/",
    HEADERS,
    max_wait=600
)
video_url = result["video_output"]
URL から動画を作成する完全なパイプライン
def url_to_video(product_url, aspect_ratio="9x16"):
    """Complete pipeline: product URL → finished video ad."""
    # 1. Scrape product page
    link = create_link(product_url)
    link_id = link["id"]

    # 2. Generate AI scripts
    scripts = generate_scripts(link["title"], link["description"])

    # 3. Create video
    video = create_video_from_link(link_id, aspect_ratio=aspect_ratio)

    # 4. Wait for completion
    result = poll_until_done(
        f"{BASE_URL}/link_to_videos/{video['id']}/",
        HEADERS,
        max_wait=600
    )

    return result["video_output"]
2.3 広告のクローン

参考動画と製品リンクを指定して、競合他社の成功広告を自社製品で再現します。

コスト: クローン 1 件あたり 15 クレジット

def clone_ad(link_id, video_url, aspect_ratio="9x16", webhook_url=None):
    """Clone a reference ad with your product assets."""
    payload = {
        "link": link_id,
        "video_url": video_url,
        "aspect_ratio": aspect_ratio,
    }
    if webhook_url:
        payload["webhook_url"] = webhook_url

    resp = requests.post(f"{BASE_URL}/ads_clone/", headers=HEADERS, json=payload)
    resp.raise_for_status()
    return resp.json()

def check_clone_status(clone_id):
    """Check status of an ad clone job."""
    resp = requests.get(f"{BASE_URL}/ads_clone/{clone_id}/", headers=HEADERS)
    resp.raise_for_status()
    return resp.json()
2.4 AI スクリプト生成

URL または製品の詳細からマーケティングスクリプトを生成します。複数のスクリプト案を返します。

コスト: 生成ごとに1クレジット

def generate_scripts_from_url(url, language="en", target_audience="general", video_length=30):
    """Generate scripts from a product URL (scrapes automatically)."""
    link = create_link(url)
    return generate_scripts(
        title=link["title"],
        description=link["description"],
        language=language,
        target_audience=target_audience,
        video_length=video_length,
    )
2.5 カスタムテンプレート

ブランドイメージを統一するために、既成またはカスタムのテンプレートを使用します。

def list_custom_templates():
    """List all available custom templates."""
    resp = requests.get(f"{BASE_URL}/custom_templates/", headers=HEADERS)
    resp.raise_for_status()
    return resp.json()

def create_custom_template_video(template_id, params, webhook_url=None):
    """Generate video from a custom template."""
    payload = {"template_id": template_id, **params}
    if webhook_url:
        payload["webhook_url"] = webhook_url

    resp = requests.post(f"{BASE_URL}/custom_template_jobs/", headers=HEADERS, json=payload)
    resp.raise_for_status()
    return resp.json()
2.6 製品から動画を作成

製品画像を紹介動画に変換します。

コスト: プレビュー画像に1クレジット、動画生成に3クレジット

def create_product_video(product_image_url, webhook_url=None):
    """Create a product showcase video from an image."""
    payload = {"product_url": product_image_url}
    if webhook_url:
        payload["webhook_url"] = webhook_url

    # Step 1: Generate preview image
    resp = requests.post(
        f"{BASE_URL}/product_to_videos/gen_image/",
        headers=HEADERS,
        json=payload
    )
    resp.raise_for_status()
    record = resp.json()

    # Step 2: Poll until image is ready
    record_id = record["id"]
    result = poll_until_done(
        f"{BASE_URL}/product_to_videos/{record_id}/",
        HEADERS,
        max_wait=300
    )

    # Step 3: Generate video from preview
    video_resp = requests.post(
        f"{BASE_URL}/product_to_videos/{record_id}/gen_video/",
        headers=HEADERS,
        json={"video_prompt": "product showcase", "webhook_url": webhook_url}
    )
    video_resp.raise_for_status()
    return video_resp.json()
2.7 IAB バナー画像

1枚の入力画像から、複数の標準サイズのIAB準拠広告バナー画像を生成します。

コスト: 生成ごとに2クレジット(複数サイズを生成)

def generate_iab_images(image_url, webhook_url=None):
    """Generate IAB-compliant banner images in all standard sizes."""
    payload = {"image": image_url}
    if webhook_url:
        payload["webhook_url"] = webhook_url

    resp = requests.post(f"{BASE_URL}/iab_images/", headers=HEADERS, json=payload)
    resp.raise_for_status()
    return resp.json()

def check_iab_status(iab_id):
    """Check IAB image generation status."""
    resp = requests.get(f"{BASE_URL}/iab_images/{iab_id}/", headers=HEADERS)
    resp.raise_for_status()
    data = resp.json()
    # When done, data["output"] contains list of {name, size, url, type}
    return data
2.8 レシピ
レシピ:URLから動画を一括生成

製品カタログ全体の動画広告を生成します。

def batch_url_to_video(product_urls, aspect_ratio="9x16"):
    """Generate video ads for multiple product URLs."""
    limiter = RateLimiter(max_per_minute=20)
    jobs = []

    for url in product_urls:
        limiter.wait_if_needed()
        try:
            link = create_link(url)
            video = create_video_from_link(link["id"], aspect_ratio=aspect_ratio)
            jobs.append({"url": url, "video_id": video["id"], "status": "processing"})
        except Exception as e:
            jobs.append({"url": url, "error": str(e), "status": "failed"})

    # Poll all jobs
    results = []
    for job in jobs:
        if job["status"] == "failed":
            results.append(job)
            continue
        try:
            result = poll_until_done(
                f"{BASE_URL}/link_to_videos/{job['video_id']}/",
                HEADERS,
                max_wait=600
            )
            results.append({**job, "video_url": result["video_output"], "status": "done"})
        except Exception as e:
            results.append({**job, "error": str(e), "status": "failed"})

    return results
レシピ:カタログ全体に広告を複製

成果の高い広告を1つ選び、すべての製品向けに複製します。

def clone_across_catalog(reference_video_url, product_urls, aspect_ratio="9x16"):
    """Clone a winning ad for multiple products."""
    results = []

    for url in product_urls:
        try:
            link = create_link(url)
            clone = clone_ad(link["id"], reference_video_url, aspect_ratio)
            result = poll_until_done(
                f"{BASE_URL}/ads_clone/{clone['id']}/",
                HEADERS,
                max_wait=600
            )
            results.append({"url": url, "video": result["video_output"], "status": "done"})
        except Exception as e:
            results.append({"url": url, "error": str(e), "status": "failed"})

    return results
レシピ:複数フォーマットの広告セット

クロスプラットフォームキャンペーン向けに、すべてのフォーマットで1つの広告を作成します。

def multi_format_ad_set(product_url):
    """Generate 9:16, 1:1, and 16:9 versions of an ad."""
    link = create_link(product_url)
    formats = ["9x16", "1x1", "16x9"]
    jobs = {}

    for fmt in formats:
        video = create_video_from_link(link["id"], aspect_ratio=fmt)
        jobs[fmt] = video["id"]

    results = {}
    for fmt, video_id in jobs.items():
        result = poll_until_done(
            f"{BASE_URL}/link_to_videos/{video_id}/",
            HEADERS,
            max_wait=600
        )
        results[fmt] = result["video_output"]

    return results
2.9 クレジットコストとレイテンシのリファレンス
エンドポイントクレジット標準的なレイテンシ
リンク作成(URLをスクレイピング)1< 60 seconds
AI スクリプト生成110-30 seconds
URLから動画を作成動画30秒あたり5~5 minutes
広告の複製15~5 minutes
カスタムテンプレート動画30秒あたり5~3 minutes
製品から動画を作成(画像)1~60 seconds
製品から動画を作成(動画)3~3 minutes
IAB画像2~60 seconds
2.10 判断マトリックス
実現したいこと...使用するエンドポイントクレジット
製品URLを動画広告に変換するURL to Video~7
競合他社の広告スタイルを再現するAd Clone~16
マーケティングスクリプトを生成するAI Scripts1
独自の動画テンプレートを使用するCustom Templates5/30s
製品紹介動画を作成するProduct to Video4
ディスプレイバナー広告を生成するIAB Images2
カタログ全体の広告を作成するBatch URL to Video~7 each
フックのバリエーションを5つ試すURL to Video x5~35

関連項目

コメント