如何使用 Claude Code 和 AIHubMix 製作 AI 產品廣告

推理時代閱讀約 9 分鐘
如何使用 Claude Code 和 AIHubMix 製作 AI 產品廣告

只要準備一張清晰的產品圖片、Claude Code 和 AIHubMix API,就能在 Seedream 中生成角色參考圖,將其註冊為虛擬人物資產,再使用 Seedance 製作 AI 產品廣告。

本教學以一項實際的蘆薈噴霧廣告企劃為例,包含專案結構、設定、指令和完整的影片提示詞。目標輸出為一支 20 秒、720p、9:16 直式廣告,並使用 AI 生成的人物與場景。

Claude Code 和 AIHubMix 負責整個工作流程。Claude Code 會讀取專案簡報、修改提示詞並整理執行流程。AIHubMix 提供統一的模型入口,讓圖片和影片生成能在同一個專案中進行。

模型 ID、參數和錯誤處理資訊來自 2026 年 9 月 16 日的專案快照。重新使用前請先確認目前的 API。指令會使用隨附的 flow.py ,且必須在專案根目錄執行。

下載完整入門套件

下載程式碼、提示詞、設定檔和範例圖片:

https://drive.google.com/uc?export=download&id=1nXcj26Fq3daHeTd0SynS7_QEXgH8z4u_

解壓縮後,進入 seedance-starter 目錄。套件包含 flow.py、兩份結構描述快照、五個提示詞檔案、產品圖片和三張參考圖片。Python 指令碼僅使用標準函式庫。

  • 從影片階段開始: 使用隨附的三張參考圖,設定 API 金鑰,並從步驟 4 開始。
  • 使用自己的產品開始: 替換產品圖片和提示詞細節,並將隨附的參考圖片移出 assets/,再從步驟 3 開始。

將 .env.example 複製為 .env,並加入自己的 API 金鑰。你的帳戶必須能使用相關模型、具備任何必要的非同步任務權限,且有足夠的額度。API 生成會產生使用費用。

1. 準備產品圖片與專案

範例產品是 Nature Republic Aloe Vera Mist。調整這套工作流程時,請一併更新圖片、產品描述和使用動作。

檔案用途
assets/product.png原始產品圖片
prompts/prompt-a.txt主要角色肖像提示詞
prompts/prompt-b.txt手持產品的角色提示詞
prompts/prompt-c.txt產品使用情境提示詞
prompts/prompt-video.txt影片時間軸、攝影機與音訊需求
prompts.json尺寸、片長、參考圖依賴項和提示詞路徑
flow.pyAPI 請求、資產註冊、輪詢和下載
seedream.schema.json, seedance.schema.json快取的 API 結構描述快照

Claude Code 可協助讀取專案簡報,以及修改設定和提示詞。 flow.py 則透過 AIHubMix 傳送實際請求。

為什麼 AIHubMix 適合這套工作流程

AI 產品廣告工作流程通常不只需要一個模型。圖片模型用來建立人物和產品參考圖;影片模型則用來生成動作和攝影機運鏡。AIHubMix 涵蓋多數主流模型,因此你可以透過一項 API 服務,依照任務選擇模型,不必為每個供應商分別管理帳戶、驗證資訊和請求入口。

AIHubMix 也連接多家供應商,並自動選擇可用且延遲較低的路由。對於必須依序完成圖片生成、資產處理和影片生成的工作流程,這有助於降低單一供應商不穩定所造成的影響。不過,模型可用性、路由和回應時間仍取決於當下的服務狀況。

在專案根目錄建立 .env,或在環境中提供相同的變數:

AIHUBMIX_API_KEY=replace_with_your_api_key

專案透過 .env 排除 .gitignore。只分享變數名稱和範例,切勿分享實際金鑰。

整個工作流程從一張清晰的產品圖片開始。

2. 設定輸出目標,並區分圖片與影片參數

 prompts.json 中相關的部分如下。編輯實際檔案時,請保留現有的 stills 陣列和其他欄位。

{
  "size": "1080x1920",
  "aspect_ratio": "9:16",
  "duration": 20,
  "resolution": "720p",
  "generate_audio": true,
  "video_prompt_file": "prompts/prompt-video.txt"
}

size 用於圖片生成。 aspect_ratio、 duration、 resolution和 generate_audio 則用於影片生成。指令碼會建立不同的請求,而非將整個設定物件傳送至兩個端點。

專案使用以下模型 ID:

  • Seedream: doubao-seedream-5-0-pro-260628
  • Seedance: doubao-seedance-2-5-260628

隨附的結構描述快照顯示,圖片端點接受 size,影片端點則接受 aspect_ratio。混用會導致請求遭拒。 flow.py 會在送出請求前檢查快取的結構描述屬性,但這並非完整的參數驗證。

3. 依序生成三張角色參考圖

每張圖片的用途都不同,後續圖片也會依賴前面的圖片:

參考圖內容輸入
A:角色肖像確立臉部、髮型、服裝、房間和光線此範例僅使用文字提示詞
手持產品同一人物手持瓶子,標籤朝向鏡頭產品圖片 + A
使用產品同一人物按下噴頭產品圖片 + B

提示詞會重複描述角色細節,並說明產品的形狀、顏色、標籤配置和自然的拿取方式。

執行:

python3 flow.py stills

結果會儲存為 assets/frame-01.jpg、 frame-02.jpg和 frame-03.jpg。請檢查角色一致性、包裝還原度,以及使用動作是否逼真。

指令碼會略過已存在的檔案。 如果修改提示詞,請先備份並移走對應的輸出檔,再重新執行。修改 A 後,也可能需要重新生成 B 和 C。

參考圖確立了角色身分、產品呈現方式和產品使用情境。

4. 託管圖片並註冊虛擬肖像資產

入門套件不包含作者帳戶的資產 ID。請在自己的帳戶中註冊參考圖。

本專案使用公開圖片 URL 進行註冊。原始工作流程使用固定在 commit SHA 的 GitHub raw URL,但任何不需驗證且能直接傳回圖片的託管服務都可以使用。

GitHub 的 /blob/ URL 會傳回 HTML 頁面,不能作為圖片 URL 使用。

請將這個佔位主機替換為上傳檔案的實際位置:

IMAGE_BASE='https://your-public-image-host.example/campaign'
python3 flow.py check "$IMAGE_BASE/frame-01.jpg" "$IMAGE_BASE/frame-02.jpg" "$IMAGE_BASE/frame-03.jpg"
python3 flow.py assets "$IMAGE_BASE/frame-01.jpg" "$IMAGE_BASE/frame-02.jpg" "$IMAGE_BASE/frame-03.jpg"

check 會驗證 HTTP 200 狀態碼和 image Content-Type。 assets 會建立或沿用一個 virtual_portrait 資產群組,註冊每張圖片,等待其狀態變為 active,並將資產 ID 寫入 state.json。

這個步驟源自專案中一次實際失敗的經驗:直接將寫實風格的角色 URL 傳給影片端點時,系統回傳了 doubao_real_person_required。本廣告企劃中的人物是 AI 生成的,因此應正確分類為 virtual_portrait。真人照片必須遵循相應的驗證流程,不能標記為虛擬人物。

同一個影片請求使用的所有資產都應屬於同一個群組。

參考圖已生成,三項資產也都已啟用;拍攝這張截圖時,影片任務仍在執行中。

5. 將影片提示詞寫成時間軸,並限制攝影機運鏡

專案的最終提示詞將一個連續的 20 秒鏡頭分成四個階段:

時間角色動作產品位置
0–5 秒看著鏡頭並展示瓶子在臉旁,標籤朝向鏡頭
5–10 秒舉起瓶子並按下噴頭保持在畫面內
10–15 秒閉上眼睛,感受噴霧落下畫面下三分之一處
15–20 秒睜開眼睛,再次展示產品回到臉旁,標籤朝向鏡頭

先前的結果讓攝影機靠得太近,導致產品從畫面中消失。因此,最終提示詞將鏡頭限制在中近景,要求產品保持可見,並要求前後各三秒都能看清標籤。

以下是完整的 prompts/prompt-video.txt。如果要改用其他產品,請更新品牌、包裝描述和使用動作。這些指示是生成目標,仍須檢查輸出結果。

One continuous 20-second vertical beauty commercial take, no cuts, in a sunlit minimalist vanity corner.

0-5s: the same 24-year-old East Asian woman in an oversized sage-green linen shirt over a white ribbed tank top stands at the vanity holding the translucent light-green Nature Republic Aloe Vera 92% Soothing Gel Mist beside her cheek, the label facing camera and fully legible. She looks to camera with a warm, easy smile and turns the bottle slightly so the label catches the morning light.

5-10s: she lifts the bottle just above eye level and presses the fine-mist pump. A soft cone of aloe mist sprays across her face and catches the light as a faint sparkle of micro-droplets.

10-15s: her eyes close and her chin lifts into a small contented smile as the mist settles, tiny droplets resting on her cheekbone and brow. The bottle stays visible in the lower third of the frame throughout this beat.

15-20s: she opens her eyes, brings the bottle back up beside her cheek with the label square to camera, and holds a final calm look at the lens.

Camera: one slow, smooth push-in from a chest-up framing to a mid-close framing ONLY. Do not push past a mid-close shot. The product must stay inside the frame for the entire take, and the label must be clearly legible in both the first three seconds and the last three seconds.

Look: soft diffused morning sunlight from camera left, photorealistic skin texture with real moisture on the skin, mist rendered as genuinely photographed spray rather than digital particles, premium K-beauty advertising. Keep the product packaging, colours, materials, label layout and label text exactly as in the reference images; do not redesign or re-letter the product. No text overlays, no captions, no watermarks.

Audio: a quiet bright room, one soft short pump-spray hiss, a gentle breath. No music, no voiceover.

已啟用音訊生成,但提示詞只要求環境音、一聲噴霧聲和輕柔的呼吸聲,不要音樂或旁白。

6. 生成並儲存影片

註冊資產後,送出 asset:// 參考資料。這個指令會讀取已儲存的 ID,並將每個 ID 分別作為獨立引數傳入:

python3 - <<'PYCODE'
import json
import subprocess
import sys
from pathlib import Path

state = json.loads(Path("state.json").read_text())
refs = ["asset://" + asset_id for asset_id in state["asset_ids"]]
subprocess.run([sys.executable, "flow.py", "video", *refs], check=True)
PYCODE

使用引數清單也能避免原始專案遇到的 zsh 問題:多個 ID 若儲存在同一個一般字串中,傳給指令碼時可能會被當成一個無效引數。

指令碼會儲存影片任務 ID,持續輪詢直到狀態變為 completed,再將輸出下載至 out/video.mp4。再次下載可能會覆寫該路徑的檔案,因此請備份想要比較的版本。

使用以下指令繼續執行現有任務,或重新下載結果:

python3 flow.py status

如果建立任務的回應遺失,請列出近期任務,並繼續執行相關 ID:

python3 flow.py tasks
python3 flow.py status VIDEO_TASK_ID

先確認是否已有現成的任務,再建立新任務,可避免意外重複生成。

7. 檢查輸出並反覆調整

原始專案保留了 video-v1-10s.mp4 和最終版本 video.mp4。第一版只有 10 秒,產品使用情境也不夠明確,因此工作流程進行了第二輪提示詞調整。

請依照以下清單檢查每個輸出結果:

  • [ ] 片長、解析度和長寬比符合目標。
  • [ ] 角色的臉部、服裝和場景保持一致。
  • [ ] 產品一直清楚可見,且開頭和結尾都能讀清楚標籤。
  • [ ] 拿取和噴灑動作符合產品的實際使用方式。
  • [ ] 瓶身形狀、包裝和文字沒有明顯變化。
  • [ ] 攝影機沒有靠得太近,音訊也符合要求。

如果影片長度不正確,請檢查設定和實際請求內容。如果產品離開畫面,請加強相機移動限制。如果使用產品的動作太短,請更明確地分配時間和動作。只編輯 prompts/prompt-video.txt 不需要重新產生參考圖片;只有在視覺參考需要變更時,才重新產生並登錄。

常見問題

為什麼看起來正確的模型名稱會回傳 404?

在來源專案中,縮寫版的 Seedream 名稱回傳了 model_not_found。請使用目前端點接受的完整 API 模型 ID,不要假設行銷顯示名稱也就是 API 識別碼。

為什麼我能在瀏覽器中開啟圖片,卻仍無法登錄?

確認 URL 回傳的是圖片本身,而不是 HTML、分享頁面或登入頁面。登錄前,請先使用 python3 flow.py check URL...。

為什麼變更提示詞後,參考圖片沒有改變?

stills 會略過現有檔案。請先備份並移出任何需要重新產生的圖片,再確認是否也需要重新產生下游參考內容。

HTTP 200 是否代表影片已完成?

不是。指令碼會根據任務的 status 分支處理,並且只會在任務狀態變成 completed 後下載影片。

開始製作第一個版本

準備一張產品圖片、設定 AIHubMix 存取權限,並選擇圖片和影片模型。接著讓 Claude Code 調整產品描述和提示詞。產生三張參考圖片,檢查並登錄後建立影片,最後使用檢查清單決定下一輪的調整方向。

未來的專案若需要使用其他模型,保留相同的檔案結構和工作流程,再更新 AIHubMix 的模型選擇和模型專屬參數。這就是統一 API 服務對使用多種 AI 模型的內容團隊的實際價值:可依任務切換模型,同時重複使用原有工作流程。

一個閘道接入多家 AI 服務商, 為正式環境而生。

前往推理時代官網