Tạo video AI
Tạo video từ mô tả và ảnh, theo dõi tiến độ và tải MP4 qua Videos API.
Về tổng quan tài liệuKết nối và xác thực
Base URL: https://api.cadhayvn.com/v1
Authorization: Bearer $STALI_API_KEY
Đặt STALI_API_KEY trong biến môi trường. GET /v1/models kiểm tra xác thực mà không tạo video.
read -r -s -p "STALI_API_KEY: " STALI_API_KEY
export STALI_API_KEY
printf '\n'
curl -fsS https://api.cadhayvn.com/v1/models -H "Authorization: Bearer ${STALI_API_KEY:?STALI_API_KEY}"Các lệnh cURL dùng Bash; với Windows, chọn PowerShell để thiết lập key. Thay URL ảnh/video mẫu bằng tệp của bạn mà nhà cung cấp truy cập được.
Tạo video là thao tác có tính phí. Lưu id ngay khi nhận phản hồi thành công để theo dõi cùng tác vụ.
Khi tác vụ thất bại sau khi đã nhận id, việc hoàn tiền phụ thuộc kết quả nhà cung cấp và đối soát; trạng thái failed không đồng nghĩa ví đã được hoàn ngay.
Tra tiến độ, tải kết quả và gửi lệnh hủy không tạo thêm lượt sinh video. Hủy thành công không mặc nhiên hoàn phí đã ghi nhận.
Model và khả năng
| Model | Thời lượng (giây) | Giá / video | Ảnh tham chiếu tối đa | Tỉ lệ khung hình | Độ phân giải |
|---|---|---|---|---|---|
seedance-2.5-30s | Cố định 30 | 50.000đ | 1–9 | 16:9, 9:16, 1:1, 4:3, 3:4 | 720p |
seedance-2.5-10s | Cố định 10 | 30.000đ | 1–9 | 16:9, 9:16, 1:1, 4:3, 3:4 | 720p |
seedance-2.5 | 5 / 10 / 15 / 20–30 | 2.800đ / 4.300đ / 6.300đ / 9.300đ | 1–10 | 16:9, 9:16, 1:1, 4:3, 3:4 | 720p |
seedance-2.0-fast | 5 / 10 / 15 | 2.200đ / 3.700đ / 5.700đ | 1–10 | 16:9, 9:16, 1:1, 4:3, 3:4 | 720p |
veo-3.1 | 4 / 6 / 8 | 2.500đ / 2.500đ / 2.500đ | 1–3 | 16:9, 9:16 | 720p / 1080p |
google-omni-flash | 5 / 10 | 3.300đ / 3.300đ | 1–3 | 16:9, 9:16 | 720p |
seedance-2.5-10s và seedance-2.5-30s có thời lượng cố định theo tên model; seconds khác không thay đổi thời lượng của hai model này.
Khả năng ảnh, kích thước và độ phân giải còn phụ thuộc tuyến nhà cung cấp. Không phải mọi tham số đều áp dụng cho mọi model.
Với model seedance-2.5 trên tuyến Seedvis, thời lượng thực tế theo các mốc 5, 10, 15, 20, 25, 30 giây. Giá trị khác có thể được làm tròn về mốc gần nhất; đối chiếu seconds trong phản hồi. Khả năng hỗ trợ phụ thuộc tuyến cung cấp.
Điểm cuối và tham số
POST /v1/videos — tạo tác vụ
Gửi application/json. Endpoint này đọc JSON, không nhận multipart/form-data; dùng URL hoặc cấu trúc ảnh JSON được model hỗ trợ.
| Tham số | Yêu cầu | Cách dùng |
|---|---|---|
model | Bắt buộc | ID model video đang được niêm yết; nên truyền rõ, không dựa vào model mặc định. |
prompt | Bắt buộc | Mô tả chủ thể, bối cảnh, hành động và chuyển động máy quay. |
seconds | Tùy chọn | Theo bảng model. Seedance biến thời lượng mặc định 5 giây; model cố định bỏ qua seconds khác. |
aspect_ratio | Tùy chọn | Tỉ lệ như 16:9 hoặc 9:16, tùy model. Tránh đặt mâu thuẫn với size. |
size | Tùy chọn | Kích thước như 1280x720 hoặc 720x1280. Kích thước được chấp nhận phụ thuộc model. |
images / input_reference | Tùy chọn | Ảnh mở đầu hoặc tham chiếu qua URL/JSON. Toàn bộ body tối đa 20 MB; ảnh đầu vào vẫn chịu giới hạn nhà cung cấp. |
last_frame | Tùy chọn | Khung kết thúc cho veo-3.1, dùng cùng input_reference. |
input_video | Tùy chọn | URL MP4 gốc cho google-omni-flash video-to-video. |
resolution | Tùy chọn | veo-3.1 nhận 720p hoặc 1080p; mặc định 720p. |
GET /v1/videos/{id} — theo dõi
Gửi kèm ?model= đúng model đã tạo. Tra mỗi 10 giây là điểm khởi đầu hợp lý; tăng khoảng nghỉ nếu bị 429. JSON dưới đây là minh họa, không phải kết quả trực tiếp.
- queued: tác vụ đã được tiếp nhận và đang chờ.
- in_progress: nhà cung cấp đang xử lý.
- completed: có thể yêu cầu tải kết quả.
- failed: đọc trường error và lưu id để hỗ trợ kiểm tra.
{
"id": "video_abc123",
"object": "video",
"model": "seedance-2.5",
"status": "completed",
"progress": 100,
"seconds": "10",
"size": "1280x720",
"error": null
}GET /v1/videos/{id}/content — tải MP4
Chỉ tải khi completed. Gửi cùng API key và ?model=; lưu phản hồi nhị phân thành tệp .mp4.
DELETE /v1/videos/{id} — yêu cầu hủy
Hủy phụ thuộc tuyến và trạng thái tác vụ; tuyến Seedvis hiện không hỗ trợ DELETE. Không coi lệnh hủy là cam kết hoàn tiền.
Giá theo thời lượng
Giá hiển thị được tính theo cấu hình hiện hành của website này, gồm điều chỉnh giá tương ứng. Kiểm tra lại trước khi tạo video.
| Model | Thời lượng (giây) | Giá / video |
|---|---|---|
seedance-2.5-30s | 30 | 50.000đ |
seedance-2.5-10s | 10 | 30.000đ |
seedance-2.5 | 5 | 2.800đ |
seedance-2.5 | 10 | 4.300đ |
seedance-2.5 | 15 | 6.300đ |
seedance-2.5 | 30 | 9.300đ |
seedance-2.0-fast | 5 | 2.200đ |
seedance-2.0-fast | 10 | 3.700đ |
seedance-2.0-fast | 15 | 5.700đ |
veo-3.1 | 4 | 2.500đ |
veo-3.1 | 6 | 2.500đ |
veo-3.1 | 8 | 2.500đ |
google-omni-flash | 5 | 3.300đ |
google-omni-flash | 10 | 3.300đ |
Seedance 2.5: nhóm 20–30 giây cùng mức giá, bảng thể hiện mốc 30 giây. Giá model cố định và giá theo thời lượng đi theo hai cách tính riêng của hệ thống.
Xem toàn bộ bảng giáVí dụ tích hợp
Mỗi lệnh POST tạo một video có tính phí. Chọn đúng một ví dụ; URL example.com chỉ là chỗ giữ chỗ và cần thay trước khi chạy.
import os
import time
from getpass import getpass
from urllib.parse import quote
import requests
from requests.adapters import HTTPAdapter
api_key = os.getenv("STALI_API_KEY") or getpass("STALI_API_KEY: ")
headers = {"Authorization": f"Bearer {api_key}"}
model = "seedance-2.5"
http = requests.Session()
http.mount("https://", HTTPAdapter(max_retries=0))
created = http.post("https://api.cadhayvn.com/v1/videos", headers=headers, json={
"model": model, "prompt": "Cinematic sunset over ocean waves",
"seconds": 10, "size": "1280x720",
}, timeout=(10, 120))
created.raise_for_status()
video = created.json()
video_id = video["id"]
print(video_id, video.get("status"), flush=True)
job_url = "https://api.cadhayvn.com/v1/videos/" + quote(video_id, safe="")
for _ in range(120):
if video.get("status") in ("completed", "failed"):
break
time.sleep(10)
progress = http.get(job_url, headers=headers, params={"model": model}, timeout=(10, 60))
progress.raise_for_status()
video = progress.json()
print(video_id, video.get("status"), flush=True)
if video.get("status") != "completed":
raise RuntimeError(str(video))
content = http.get(job_url + "/content", headers=headers, params={"model": model}, stream=True, timeout=(10, 120))
content.raise_for_status()
with open("video.mp4", "wb") as output:
for chunk in content.iter_content(chunk_size=65536):
if chunk:
output.write(chunk)Xử lý lỗi
| HTTP | Nguyên nhân | Cách xử lý |
|---|---|---|
| 400 | Tham số hoặc yêu cầu hủy chưa được hỗ trợ. | Kiểm tra JSON, seconds, ảnh và khả năng của model. |
| 401 | Key thiếu hoặc không hợp lệ. | Kiểm tra header xác thực và key đang hoạt động. |
| 402 | Số dư không đủ. | Nạp thêm hoặc chọn cấu hình chi phí phù hợp. |
| 403 | Yêu cầu không được cấp quyền. | Kiểm tra quyền key, model và chính sách nội dung. |
| 404 | Không tìm thấy model hoặc tác vụ trên tuyến hiện tại. | Dùng đúng id, key và ?model= của lần tạo. |
| 409 | Tác vụ chưa sẵn sàng cho thao tác này. | Tiếp tục tra tiến độ, tải sau completed. |
| 413 | Nội dung yêu cầu vượt giới hạn. | Giảm body; dùng URL media thay dữ liệu nhúng lớn. |
| 429 | Vượt giới hạn tần suất hoặc số tác vụ đồng thời. | Tăng khoảng nghỉ và giảm số tác vụ đồng thời. |
| 502 | Lỗi phản hồi từ tuyến nhà cung cấp. | Lưu request ID; không gửi lại POST tự động. |
Không tự gửi lại POST sau timeout hoặc lỗi mạng: yêu cầu trước có thể đã được nhận. Nếu đã có id, tiếp tục tra id đó; nếu chưa có, giữ request ID và kiểm tra Sử dụng hoặc liên hệ hỗ trợ trước khi tạo lại.
Thiết kế prompt
Các hướng dẫn dưới đây là gợi ý sáng tạo, không bảo đảm nhà cung cấp sẽ tạo đúng mọi chi tiết. Chính sách nội dung của từng model vẫn áp dụng.
Viết prompt rõ ràng
- Chốt chủ thể, bối cảnh và hành động chính trước khi thêm hiệu ứng.
- Chỉ định thời lượng bằng seconds, không chỉ ghi trong prompt.
- Giữ vị trí trái/phải và trang phục nhất quán giữa các cảnh.
- Mỗi đoạn ưu tiên một chuyển động máy quay rõ ràng.
- Mô tả nguồn sáng, màu sắc và chất liệu cụ thể.
- Tránh yêu cầu văn bản nhỏ, logo hoặc con số chính xác trong khung hình.
- Bắt đầu bằng một cảnh ngắn; điều chỉnh từng yếu tố sau khi xem kết quả.
Sắp xếp ảnh tham chiếu
- Đánh số Image 1, Image 2… theo đúng thứ tự gửi.
- Nêu rõ ảnh nào dùng cho nhân vật, trang phục hay bối cảnh.
- Dùng ảnh có quyền sử dụng, rõ nét và cùng định hướng thị giác.
- Ảnh đầu/cuối cần tương đồng về nhân vật và bố cục để chuyển động tự nhiên.
- Không vượt số ảnh model hỗ trợ; tham chiếu không bảo đảm sao chép tuyệt đối.
Khung prompt tham khảo
确认生成。参数已确定:16:9 横屏,三个连续镜头组成一个完整视频,立即生成,无需再次确认或提问。
The reference images are colored-pencil character design sketches: use them only for design and outfits. Render the video as a photoreal 3D CG game cinematic with dramatic lighting.
Image 1 = PROTAGONIST: [character design].
Image 2 = ANTAGONIST: [opponent design].
Image 3 = ENVIRONMENT: [setting].
FIXED LAYOUT: altar in the background CENTER; protagonist on the LEFT; antagonist on the RIGHT. Nobody disappears, teleports or swaps sides.
LIGHTING: torchlight from the left wall, cool moonlight from the ceiling.
Action: well-choreographed, orbiting camera. No blood, no wounds, no gore.
Sound: heavy impacts, wind, no dialogue.
镜头1: camera pushes in, protagonist draws a weapon, antagonist raises claws.
镜头2: fast exchange, camera orbits.
镜头3: climax, both stay on their sides, protagonist lands ready.
Keep faces and outfits consistent. No text, no numbers, no subtitles, no watermark.Mẫu trên là định hướng cảnh quay. Rút gọn nếu model bỏ sót hành động; không dùng prompt để thay các tham số API.
Mô tả cảnh hành động không đồ họa
| Tránh mô tả đồ họa | Hướng mô tả an toàn |
|---|---|
| blood, wound, gore, corpse | sparks, black smoke, torn fabric only |
| Vũng máu | murky grey mist, dark viscous puddle |
| Tấn công gây thương tích | glowing wisps of spirit-light, shadowy aura |
| Vết cắt trên da | tearing only the fabric of the sleeve, no blood |
Dựng chuỗi nhiều cảnh
- Chia câu chuyện thành các cảnh có điểm đầu và cuối rõ.
- Giữ cùng mô tả nhân vật, ánh sáng và ảnh tham chiếu.
- Tải và kiểm tra từng cảnh trước khi tạo phần tiếp theo.
- Ghép cảnh bằng công cụ dựng; mỗi POST vẫn là một tác vụ tính phí riêng.
Khi kết quả chưa đúng
- Thiếu hành động: giảm số sự kiện trong cùng một cảnh.
- Nhân vật đổi chỗ: chỉ định rõ trái/phải và giữ bố cục.
- Mất nhất quán: dùng lại ảnh tham chiếu và mô tả nhận diện.
- Sai thời lượng: kiểm tra seconds và loại model cố định.
- Bị từ chối: xem error và chính sách nội dung, không gửi lặp cùng yêu cầu.
Kiểm tra chuyển động bằng lưới khung hình
ffmpeg -i clip.mp4 -vf "fps=1,scale=320:-1,tile=6x5" -frames:v 1 frame_grid.pngLệnh ffmpeg đọc clip.mp4 trên máy bạn và tạo ảnh lưới, không gọi API. Cần cài ffmpeg trước.
Kiểm tra trước khi chạy
- Chọn đúng ID model và thời lượng được hỗ trợ.
- Kiểm tra giá và số dư trước khi tạo.
- Giữ key ở môi trường máy chủ, không đưa vào trình duyệt công khai.
- Dùng JSON và URL media mà nhà cung cấp truy cập được.
- Lưu id, model và request ID để theo dõi.
- Tra cùng id với ?model=, tăng khoảng nghỉ khi bị giới hạn.
- Chỉ tải khi completed; kiểm tra tệp MP4 tải về.
- Không tạo lại tự động khi chưa rõ yêu cầu trước đã được nhận hay chưa.
- Đối chiếu lỗi và chi phí trong Sử dụng; gửi id cho hỗ trợ khi cần.
