Chỉ với một hình ảnh sản phẩm rõ ràng, Claude Code và AIHubMix API, bạn có thể tạo ảnh tham chiếu nhân vật bằng Seedream, đăng ký chúng làm tài sản người ảo, rồi dùng Seedance để tạo quảng cáo sản phẩm AI.
Hướng dẫn này dựa trên một chiến dịch xịt sương nha đam có thật, bao gồm cấu trúc dự án, cấu hình, lệnh và prompt video hoàn chỉnh. Đầu ra mục tiêu là quảng cáo dọc 20 giây, 720p, tỷ lệ 9:16 với người và bối cảnh do AI tạo ra.
Claude Code và AIHubMix vận hành toàn bộ quy trình. Claude Code đọc bản mô tả dự án, chỉnh sửa prompt và tổ chức việc thực thi. AIHubMix cung cấp một điểm truy cập mô hình duy nhất, nhờ đó việc tạo ảnh và video có thể diễn ra trong cùng một dự án.
ID mô hình, tham số và cách xử lý lỗi được lấy từ bản chụp dự án ngày 16 tháng 9 năm 2026. Hãy kiểm tra API hiện hành trước khi tái sử dụng. Các lệnh sử dụng flow.py đi kèm và phải được chạy từ thư mục gốc của dự án.Tải xuống bộ khởi đầu hoàn chỉnh
Tải xuống mã, prompt, cấu hình và ảnh mẫu:
https://drive.google.com/uc?export=download&id=1nXcj26Fq3daHeTd0SynS7_QEXgH8z4u_
Sau khi giải nén, hãy vào thư mục seedance-starter. Gói này gồm flow.py, hai bản chụp schema, năm tệp prompt, ảnh sản phẩm và ba ảnh tham chiếu. Script Python chỉ sử dụng thư viện chuẩn.
- Bắt đầu với giai đoạn video: sử dụng ba ảnh tham chiếu đi kèm, cấu hình khóa của bạn và bắt đầu từ Bước 4.
- Bắt đầu với sản phẩm của riêng bạn: thay ảnh sản phẩm và chi tiết prompt, chuyển các ảnh tham chiếu đi kèm ra khỏi
assets/, và bắt đầu từ Bước 3.
Sao chép .env.example thành .env và thêm khóa API của bạn. Tài khoản cần có quyền truy cập các mô hình liên quan, mọi quyền tác vụ bất đồng bộ cần thiết và đủ hạn mức. Việc tạo nội dung qua API sẽ phát sinh phí sử dụng.
1. Chuẩn bị ảnh sản phẩm và dự án
Sản phẩm mẫu là Nature Republic Aloe Vera Mist. Khi điều chỉnh quy trình, hãy cập nhật đồng thời ảnh, mô tả sản phẩm và hành động sử dụng.
| Tệp | Mục đích |
|---|---|
assets/product.png | Ảnh sản phẩm gốc |
prompts/prompt-a.txt | Prompt chân dung nhân vật chính |
prompts/prompt-b.txt | Prompt nhân vật cầm sản phẩm |
prompts/prompt-c.txt | Prompt sử dụng sản phẩm |
prompts/prompt-video.txt | Dòng thời gian video, góc máy và yêu cầu âm thanh |
prompts.json | Kích thước, thời lượng, phụ thuộc vào ảnh tham chiếu và đường dẫn prompt |
flow.py | Yêu cầu API, đăng ký tài sản, truy vấn trạng thái và tải xuống |
seedream.schema.json, seedance.schema.json | Bản chụp schema API được lưu đệm |
Claude Code giúp đọc bản mô tả dự án và chỉnh sửa cấu hình cùng prompt. flow.py gửi các yêu cầu thực tế qua AIHubMix.
Vì sao AIHubMix phù hợp với quy trình này
Quy trình quảng cáo sản phẩm AI thường cần nhiều hơn một mô hình. Mô hình tạo ảnh sinh ra nhân vật và ảnh tham chiếu sản phẩm; mô hình video tạo chuyển động và hành vi máy quay. AIHubMix hỗ trợ hầu hết các mô hình phổ biến, nên bạn có thể chọn mô hình theo từng tác vụ thông qua một dịch vụ API duy nhất, thay vì phải duy trì tài khoản, xác thực và điểm truy cập riêng cho từng nhà cung cấp.
AIHubMix cũng kết nối với nhiều nhà cung cấp và tự động chọn tuyến có độ trễ thấp đang khả dụng. Điều này có thể giảm tác động của sự không ổn định từ một nhà cung cấp lên quy trình phải hoàn thành lần lượt việc tạo ảnh, xử lý tài sản và tạo video. Tính khả dụng của mô hình, định tuyến và thời gian phản hồi vẫn phụ thuộc vào tình trạng dịch vụ tại thời điểm sử dụng.
Tạo .env trong thư mục gốc của dự án, hoặc khai báo cùng biến đó trong môi trường của bạn:
AIHUBMIX_API_KEY=replace_with_your_api_key
Dự án loại trừ .env thông qua .gitignore. Chỉ chia sẻ tên biến và ví dụ, tuyệt đối không chia sẻ khóa thật.

Toàn bộ quy trình bắt đầu từ một hình ảnh sản phẩm rõ ràng.
2. Đặt mục tiêu đầu ra và tách tham số ảnh khỏi tham số video
Phần liên quan của prompts.json trông như sau. Khi chỉnh sửa tệp thật, hãy giữ nguyên mảng stills và các trường khác.
{
"size": "1080x1920",
"aspect_ratio": "9:16",
"duration": 20,
"resolution": "720p",
"generate_audio": true,
"video_prompt_file": "prompts/prompt-video.txt"
}
size thuộc về việc tạo ảnh. aspect_ratio, duration, resolution và generate_audio thuộc về việc tạo video. Script tạo các yêu cầu riêng biệt thay vì gửi toàn bộ đối tượng cấu hình đến cả hai endpoint.
Dự án sử dụng các ID mô hình sau:
- Seedream:
doubao-seedream-5-0-pro-260628 - Seedance:
doubao-seedance-2-5-260628
Các bản chụp schema đi kèm cho thấy endpoint tạo ảnh chấp nhận size, còn endpoint video chấp nhận aspect_ratio. Nếu dùng lẫn lộn, yêu cầu sẽ bị từ chối. flow.py kiểm tra các thuộc tính schema được lưu đệm trước khi gửi yêu cầu, nhưng đây không phải là kiểm tra tham số đầy đủ.
3. Tạo ba ảnh tham chiếu nhân vật theo thứ tự
Mỗi ảnh có vai trò khác nhau, và các ảnh sau phụ thuộc vào các ảnh trước:
| Tham chiếu | Nội dung | Đầu vào |
|---|---|---|
| A: Chân dung nhân vật | Xác định khuôn mặt, tóc, trang phục, căn phòng và ánh sáng | Chỉ dùng prompt văn bản trong ví dụ này |
| B: Cầm sản phẩm | Cùng một người cầm chai với nhãn hướng về máy quay | Ảnh sản phẩm + A |
| C: Sử dụng sản phẩm | Cùng một người bấm vòi xịt | Ảnh sản phẩm + B |
Các prompt lặp lại chi tiết nhân vật và mô tả hình dạng, màu sắc, bố cục nhãn của sản phẩm cùng cách cầm nắm tự nhiên.
Chạy:
python3 flow.py stills
Kết quả được lưu thành assets/frame-01.jpg, frame-02.jpg và frame-03.jpg. Hãy kiểm tra độ nhất quán của nhân vật, độ trung thực của bao bì và tính chân thực của hành động sử dụng.
Script bỏ qua các tệp đã tồn tại. Nếu bạn thay đổi prompt, hãy sao lưu và chuyển đầu ra tương ứng đi trước khi chạy lại. Việc thay đổi A cũng có thể yêu cầu tạo lại B và C.

Các ảnh tham chiếu thiết lập danh tính nhân vật, cách trình bày sản phẩm và cách sử dụng sản phẩm.
4. Lưu trữ ảnh và đăng ký tài sản chân dung ảo
Bộ khởi đầu không chứa ID tài sản nào từ tài khoản của tác giả. Hãy đăng ký các ảnh tham chiếu trong tài khoản của bạn.
Dự án này dùng URL ảnh công khai để đăng ký. Quy trình gốc sử dụng URL raw của GitHub được ghim theo commit SHA, nhưng bất kỳ dịch vụ lưu trữ nào trả về ảnh trực tiếp mà không cần xác thực đều có thể dùng được.
URL /blob/ của GitHub trả về một trang HTML và không thể dùng làm URL ảnh.
Thay thế máy chủ giữ chỗ này bằng vị trí thực tế của các tệp bạn đã tải lên:
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 xác minh HTTP 200 và Content-Type là ảnh. assets tạo mới hoặc tái sử dụng một nhóm tài sản virtual_portrait, đăng ký từng ảnh, chờ cho đến khi trạng thái thành active, và ghi các ID tài sản vào state.json.
Bước này xuất phát từ một lỗi thực tế trong dự án: khi truyền trực tiếp URL nhân vật chân thực vào endpoint video, hệ thống trả về doubao_real_person_required. Người trong chiến dịch này do AI tạo ra, vì vậy virtual_portrait là cách phân loại đúng. Ảnh chân dung của người thật phải tuân theo quy trình xác minh tương ứng và không được gắn nhãn là ảo.
Tất cả tài sản dùng trong một yêu cầu video nên thuộc cùng một nhóm.

Các ảnh tham chiếu đã được tạo và cả ba tài sản đều ở trạng thái active; tác vụ video vẫn đang chạy khi ảnh chụp màn hình này được ghi lại.
5. Viết prompt video dưới dạng dòng thời gian kèm giới hạn máy quay
Prompt dự án cuối cùng chia một cảnh quay liên tục 20 giây thành bốn giai đoạn:
| Thời gian | Hành động của nhân vật | Vị trí sản phẩm |
|---|---|---|
| 0–5 giây | Nhìn vào máy quay và giới thiệu chai sản phẩm | Bên cạnh khuôn mặt, nhãn hướng về máy quay |
| 5–10 giây | Nâng chai lên và bấm vòi xịt | Nằm trong khung hình |
| 10–15 giây | Nhắm mắt và cảm nhận làn sương lắng xuống | Phần ba dưới của khung hình |
| 15–20 giây | Mở mắt và giới thiệu lại sản phẩm | Trở lại bên cạnh khuôn mặt, nhãn hướng về máy quay |
Một kết quả trước đó đã đẩy máy quay quá gần và làm mất sản phẩm. Vì vậy, prompt cuối cùng giới hạn chuyển động ở cảnh cận trung bình, yêu cầu sản phẩm luôn hiển thị và yêu cầu nhãn đọc rõ trong ba giây đầu và ba giây cuối.
Đây là toàn bộ nội dung prompts/prompt-video.txt. Với sản phẩm khác, hãy cập nhật thương hiệu, mô tả bao bì và hành động sử dụng. Các hướng dẫn này là mục tiêu tạo nội dung và vẫn cần được kiểm tra đầu ra.
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.
Tính năng tạo âm thanh đã được bật, nhưng prompt chỉ yêu cầu tiếng không gian phòng, một tiếng xịt và tiếng thở nhẹ, không có nhạc hay lời thuyết minh.
6. Tạo và lưu video
Sau khi đăng ký tài sản, hãy gửi các tham chiếu asset://. Lệnh này đọc các ID đã lưu và truyền từng ID như một đối số riêng biệt:
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
Dùng danh sách đối số cũng tránh được một lỗi zsh trong dự án gốc, nơi nhiều ID được lưu trong một chuỗi thường có thể được truyền vào script như một đối số không hợp lệ.
Script lưu ID tác vụ video, truy vấn trạng thái cho đến khi completed, rồi tải đầu ra về out/video.mp4. Lần tải khác có thể ghi đè đường dẫn này, nên hãy sao lưu các phiên bản bạn muốn so sánh.
Tiếp tục một tác vụ hiện có hoặc tải lại kết quả bằng lệnh:
python3 flow.py status
Nếu phản hồi tạo tác vụ bị mất, hãy liệt kê các tác vụ gần đây và tiếp tục với ID tương ứng:
python3 flow.py tasks
python3 flow.py status VIDEO_TASK_ID
Tìm tác vụ hiện có trước khi tạo tác vụ mới sẽ tránh việc tạo trùng lặp ngoài ý muốn.
7. Kiểm tra đầu ra và lặp lại
Dự án gốc giữ lại video-v1-10s.mp4 và video.mp4 cuối cùng. Phiên bản đầu chỉ dài 10 giây và chưa thể hiện đủ việc sử dụng sản phẩm, nên quy trình đã trải qua lần lặp prompt thứ hai.
Kiểm tra mọi kết quả theo danh sách sau:
- [ ] Thời lượng, độ phân giải và tỷ lệ khung hình khớp với mục tiêu.
- [ ] Khuôn mặt, trang phục và bối cảnh của nhân vật vẫn nhất quán.
- [ ] Sản phẩm luôn hiển thị và nhãn có thể đọc được ở đầu và cuối video.
- [ ] Các thao tác cầm nắm và xịt khớp với cách dùng thực tế của sản phẩm.
- [ ] Hình dạng chai, bao bì và chữ không thay đổi đáng kể.
- [ ] Máy quay không tiến quá gần, và âm thanh khớp với yêu cầu.
Nếu thời lượng không đúng, hãy kiểm tra cả cấu hình lẫn yêu cầu thực tế được gửi đi. Nếu sản phẩm đi ra khỏi khung hình, hãy siết chặt giới hạn chuyển động camera. Nếu hành động sử dụng quá ngắn, hãy phân bổ thời gian và hành vi một cách rõ ràng hơn. Chỉ chỉnh sửa prompts/prompt-video.txt thì không cần tạo lại ảnh tham chiếu; chỉ tạo lại và đăng ký chúng khi các tham chiếu hình ảnh thực sự cần thay đổi.
Câu hỏi thường gặp
Vì sao một tên mô hình trông có vẻ đúng nhưng lại trả về 404?
Tên Seedream rút gọn đã trả về model_not_found trong dự án gốc. Hãy sử dụng ID mô hình API đầy đủ được endpoint hiện tại chấp nhận, thay vì giả định rằng tên hiển thị trong tiếp thị cũng chính là định danh API.
Vì sao tôi có thể mở ảnh trên trình duyệt nhưng vẫn không đăng ký được?
Hãy xác nhận rằng URL trả về chính tệp ảnh chứ không phải HTML, trang chia sẻ hoặc trang đăng nhập. Hãy dùng python3 flow.py check URL... trước khi đăng ký.
Vì sao thay đổi prompt nhưng ảnh tham chiếu không thay đổi?
stills bỏ qua các tệp đã tồn tại. Hãy sao lưu và di chuyển mọi ảnh cần tạo lại, sau đó kiểm tra xem các tham chiếu phụ thuộc phía sau có cần được tạo lại hay không.
HTTP 200 có nghĩa là video đã hoàn thành chưa?
Chưa. Script phân nhánh dựa trên status của tác vụ và chỉ tải xuống sau khi tác vụ đạt completed.
Bắt đầu phiên bản đầu tiên của bạn
Chuẩn bị một ảnh sản phẩm, cấu hình quyền truy cập AIHubMix và chọn mô hình ảnh cùng mô hình video. Sau đó, để Claude Code điều chỉnh mô tả sản phẩm và prompt. Tạo ba ảnh tham chiếu, xem xét và đăng ký chúng, tạo video, rồi dùng danh sách kiểm tra để quyết định vòng lặp tiếp theo.
Khi một dự án trong tương lai cần mô hình khác, hãy giữ nguyên cấu trúc tệp và quy trình làm việc, sau đó cập nhật lựa chọn mô hình AIHubMix và các tham số riêng của từng mô hình. Đó chính là giá trị thực tế của một dịch vụ API thống nhất đối với nhóm nội dung sử dụng nhiều mô hình AI: mô hình có thể thay đổi theo từng tác vụ trong khi quy trình vẫn có thể tái sử dụng.



