TL;DR: 若要透過 AI API 生成影片,只需將文字提示 POST 至影片模型的端點,取得工作 ID,接著輪詢該工作,直到完成的 MP4 檔案準備就緒——Python 大約只需十行程式碼。GPTProto 的統一 API 讓五款影片模型共用一把金鑰與同一個餘額:Seedance 2.0、ViduQ3-pro、Kling v3.0 std、Hailuo 2.3 Pro,以及 Veo 3.1。只要變更 URL 中的一個字串,就能在模型之間切換——驗證方式、請求格式與輪詢流程完全相同。計費採預付隨用隨付,每秒影片起價約為 $0.04。
過去,要呼叫五種不同的影片模型,通常意味著要建立五個帳戶、使用五套 SDK,還要管理五個計費儀表板。想使用 ByteDance 的 Seedance 2.0?你需要 BytePlus(Volcano Engine)帳戶,以及一項大多數中國以外使用者無法在一個下午內完成的身分驗證。想使用 Google 的 Veo?那是不同的主控台與不同的金鑰。想用相同提示對兩個模型進行 A/B 測試?現在你得維護兩套彼此毫無共通之處的整合。
本指南將略過上述所有繁瑣流程。你將使用大約十行 Python 程式碼完成第一次文字轉影片 API 呼叫,輪詢取得完成的 MP4,接著只要變更 URL 中的一個字串,就能使用另外四款模型——同一把金鑰、同一套程式碼、同一個餘額。
完整揭露:我為 GPTProto 撰寫這些整合指南,因此我對你使用哪個端點確實有既得利益。不過,我仍盡力如實呈現數據,包括下方其中一款模型,透過我們呼叫的成本比直接呼叫更高。遇到這種情況,我會明確說明。
AI 影片生成 API 實際上是什麼
它不是一個免寫程式碼的按鈕,而是一項非同步工作:你 POST 一段提示,API 回傳一組 ID,模型可能需要三十秒到數分鐘進行算圖,接著你輪詢第二個端點,直到影片準備完成。這段算圖延遲正是採用兩步驟設計的原因——影片處理時間太長,無法一直保持 HTTP 連線開啟,因此 API 會先回傳工作票證,而不是檔案。
幾乎所有你會建立的功能,都能由三種請求格式涵蓋:
- 文字轉影片 ——將提示轉換成影片片段。
- 圖片轉影片 ——讓靜態畫面動態化。
- 參考圖轉影片 ——使用一張或多張參考圖片,讓角色或物件在不同鏡頭間保持一致。
以下所有內容都使用相同的基礎 URL、https://gptproto.com/api/v3,以及相同的標頭。現在就取得金鑰並完成第一次呼叫。
取得 API 金鑰
前往 gptproto.com 註冊,開啟儀表板中的 API Keys 區段,然後建立金鑰。金鑰格式看起來會像 sk-...。這裡沒有固定的免費方案——計費採預付隨用隨付,因此你需要先為餘額加值,每次呼叫從第一次請求開始就會扣款。測試時準備幾美元即可;幾段短影片的費用不會超過這個金額。
安裝唯一需要的相依套件:
pip install requests
第一次呼叫前,有一點務必注意,因為這很容易讓人困惑:在原生的 /api/v3/ 介面上,Authorization 標頭應填入你的原始金鑰,且不加上 Bearer 前綴。GPT Proto 也提供與 OpenAI 相容的 /v1/ 介面,而該介面則使用 Bearer。混淆兩者是我最常看到的 401 錯誤原因。本教學全程使用原生介面,因此金鑰應直接填入。
你的第一次呼叫:Seedance 2.0,文字轉影片
Seedance 2.0 是 ByteDance 的第二代影片模型。它可以生成 4 至 15 秒、最高 1080p、具備原生同步音訊的影片片段,適合用於鏡頭切換但主體保持一致的多鏡頭場景。以下是完整的文字轉影片提交範例:
import requests
import time
API_KEY = "sk-your-key-here" # raw, no "Bearer" prefix
BASE = "https://gptproto.com/api/v3"
headers = {
"Authorization": API_KEY,
"Content-Type": "application/json",
}
def submit_seedance(prompt):
url = f"{BASE}/bytedance/dreamina-seedance-2-0-260128/text-to-video"
payload = {
"prompt": prompt,
"duration": 5, # 4-15 seconds
"aspect_ratio": "16:9",
"resolution": "1080p",
"generate_audio": True,
"camera_fixed": False,
"seed": -1, # -1 = random
}
resp = requests.post(url, headers=headers, json=payload)
resp.raise_for_status()
return resp.json()["data"]["id"]
prompt = (
"A lighthouse keeper climbs a narrow spiral staircase at dawn. "
"Cut to a wide shot of the lamp room as the light sweeps across "
"grey water. Waves crash below. Ambient wind and distant gulls."
)
job_id = submit_seedance(prompt)
print("submitted:", job_id)
如果你想查看線上傳輸格式,以下是相同請求的 cURL 版本:
curl -X POST "https://gptproto.com/api/v3/bytedance/dreamina-seedance-2-0-260128/text-to-video" \
-H "Authorization: sk-your-key-here" \
-H "Content-Type: application/json" \
-d '{
"prompt": "A lighthouse keeper climbs a spiral staircase at dawn, then the lamp sweeps across grey water.",
"duration": 5,
"aspect_ratio": "16:9",
"resolution": "1080p",
"generate_audio": true,
"camera_fixed": false,
"seed": -1
}'
回應中不會包含影片,而是包含一項工作:
{
"data": {
"id": "cgt-20260709xxxxxx-abc",
"status": "created",
"outputs": [],
"urls": { "get": "https://gptproto.com/api/v3/predictions/cgt-20260709xxxxxx-abc/result" }
},
"message": "success",
"code": 200
}
data.id 就是你的票證。data.urls.get 是現成的輪詢 URL,其中已經包含 ID。簡單來說:你提交了工作、取得了 ID,但目前尚未算出任何內容。
輪詢結果
現在持續呼叫結果端點,直到 status 變成 completed,接著從 outputs 讀取影片 URL。平台上的每個模型都使用相同的輪詢端點與相同的回應格式,這正是後面「只替換一個字串」技巧可行的原因:
def wait_for_video(job_id, every=5, timeout=600):
url = f"{BASE}/predictions/{job_id}/result"
waited = 0
while waited < timeout:
resp = requests.get(url, headers=headers)
resp.raise_for_status()
data = resp.json()["data"]
status = data["status"]
if status == "completed":
return data["outputs"][0] # the MP4 URL
if data.get("error"):
raise RuntimeError(data["error"])
print(f" {status}... {waited}s")
time.sleep(every)
waited += every
raise TimeoutError(f"timed out after {timeout}s (last status: {status})")
video_url = wait_for_video(job_id)
print("done:", video_url)
這就是一個完整可運作的生成流程。兩個函式、一段提示、一個 MP4。5 秒影片通常會在一到兩分鐘內完成,不過帶音訊的 15 秒 1080p 影片可能需要更久——每隔幾秒輪詢一次即可,不要頻繁發送請求。
補充說明一下這個迴圈:我會在 error 出現時拋出錯誤,並將任何既不是 completed、也不是錯誤的狀態視為「繼續等待」。這是刻意的設計。不同模型回報中間狀態的方式各不相同,因此,與其硬編碼一份可能變動的狀態清單,不如等待所有非致命錯誤狀態。
只替換一個字串,就能切換引擎:ViduQ3-pro
重點來了。若要使用 ViduQ3-pro 而不是 Seedance 生成相同提示,只需變更路徑——其他部分完全不變。金鑰、標頭與 wait_for_video() 都維持原樣:
def submit_vidu(prompt):
url = f"{BASE}/vidu/viduq3-pro/text-to-video"
payload = {
"prompt": prompt,
"duration": 5, # ViduQ3 goes up to 16s
"aspect_ratio": "16:9",
"resolution": "1080p",
"audio": True, # note: ViduQ3 uses `audio`, not `generate_audio`
"seed": -1,
}
resp = requests.post(url, headers=headers, json=payload)
resp.raise_for_status()
return resp.json()["data"]["id"]
job_id = submit_vidu(prompt)
video_url = wait_for_video(job_id) # same poller, unchanged
ViduQ3-pro 可將影片片段延長至 16 秒——是 Seedance 實用範圍的兩倍——而且在這些模型中每秒價格最低。不同模型的參數名稱會略有差異(ViduQ3 使用 audio 控制聲音;Seedance 使用 generate_audio),因此請查看模型頁面以確認確切欄位,但請求/提交/輪詢的流程永遠不變。
保持角色一致。 這兩款主力模型不只支援文字轉影片。你可以將 ViduQ3 指向 /vidu/viduq3-pro/image-to-video,並提供 image 欄位來讓靜態圖片動起來;也可以使用 Seedance 的參考圖轉影片模式,讓同一張臉在不同鏡頭中保持一致。流程仍然是提交並輪詢——你只是增加圖片輸入,不需要學習全新的 API。正式整合前,請先在各模型頁面確認參考圖片欄位名稱。
該使用哪一款?
五款模型共用一把金鑰。它們不是數字越大就一定越好的分級模型,而是各自適合不同工作。請依影片需求選擇:
| 模型 |
路徑({provider}/{model}) |
原生音訊 |
最長時長 |
價格 |
適用情境 |
| Seedance 2.0 |
bytedance/dreamina-seedance-2-0-260128 |
是 |
約 15 秒 |
每次執行 $0.2957 起 |
具同步音效的多鏡頭場景 |
| ViduQ3-pro |
vidu/viduq3-pro |
是 |
16 秒 |
每秒 $0.04 起 |
需要更長影片與最低價格 |
| Kling v3.0 std |
kling/kling-v3.0-std |
是 |
約 10 秒 |
每次執行 $0.2016 起 |
便宜且可靠的圖片轉影片 |
| Hailuo 2.3 Pro |
minimax/hailuo-2.3-pro |
否 |
約 10 秒 |
$0.441/次 |
需要自行後製音訊時,提供清晰的 1080p 畫面 |
| Veo 3.1 |
google/veo3.1 |
是 |
— |
每次執行 $0.5 起 |
需要 4K 輸出 |
在做出決定前,有兩點值得注意。Hailuo 2.3 Pro 回傳的是無聲影片——畫面品質出色,但你需要在後製階段自行配樂。而 Veo 3.1 的每個輸出都會帶有無法關閉的嵌入式 SynthID 浮水印;如果客戶不希望影片內含來源標記,這一點就相當重要。
由於平台在後台透過同一套提交/輪詢合約統一所有模型,因此在不同模型間反覆測試只需要查詢字典,而不是重寫程式:
MODELS = {
"seedance": "bytedance/dreamina-seedance-2-0-260128",
"vidu": "vidu/viduq3-pro",
"kling": "kling/kling-v3.0-std",
"hailuo": "minimax/hailuo-2.3-pro",
"veo": "google/veo3.1",
}
def submit(model_key, scene, payload):
url = f"{BASE}/{MODELS[model_key]}/{scene}"
resp = requests.post(url, headers=headers, json=payload)
resp.raise_for_status()
return resp.json()["data"]["id"]
# same wait_for_video() retrieves any of them
job_id = submit("kling", "image-to-video", {"prompt": prompt, "image": image_url})
各模型的請求內容不同——這是你需要調整的部分——但模型探索、驗證與結果取得流程都不變。
實際成本
影片計價方式為每秒或每次執行,並且會隨解析度、時長,以及是否生成音訊而大幅增加。模型頁面上的醒目價格只是最低價,不代表實際預估成本。舉例來說,一段 Seedance 720p/16:9/5 秒、包含音訊的影片約為 $0.605——遠高於 $0.2957 的基準價——因為你同時提高了所有成本因素。請依儀表板的估算,使用實際設定計算價格,而不是只看標示價格。
以下是與直接呼叫各供應商相比的實際比較:
- ViduQ3-pro ——每秒 $0.04 起,比約 $0.05/秒的市場參考價低約 20%。
- Kling v3.0 std ——每次執行 $0.2016 起,比約 $0.252 的參考價低約 20%。
- Hailuo 2.3 Pro ——每次執行 $0.441,相較 MiniMax 的約 $0.49 便宜約 10%。
- Seedance 2.0 ——每次執行 $0.2957 起,這比直接在 ByteDance 自家的 Dreamina 上生成相同影片高約 10%。我不會假裝不是這樣。透過 API 呼叫它的理由不是價格更低,而是穩定的程式化存取、共用一個餘額,以及不需要通過 BytePlus 身分驗證。如果你只在意 Seedance 的成本,直接使用會比較便宜。
- Veo 3.1 ——每次執行 $0.5 起;頁面上沒有清楚的市場參考價,因此應將它視為便利性選擇,而不是折扣方案。沒有免費方案,也沒有月費訂閱——從第一次請求起就按次付費。若要查詢特定模型的價格,
模型目錄會顯示目前依每秒與解析度區分的價格表。
錯誤與注意事項
以下是常見問題的簡短指南:
- 401 未授權 ——幾乎總是
Bearer 使用錯誤。原生 /api/v3/ 介面需要原始金鑰。
- 403 禁止存取 ——通常是餘額為零,而不是權限問題。請加值。
- 429 ——你受到速率限制;請降低頻率並重試。
- 400,含內容訊息 ——提示觸發了內容審核。回應也會包含值得在處理流程中檢查的
has_nsfw_contents 旗標。
- 輪詢始終未完成 ——長時間算圖確實存在;這就是
wait_for_video() 設定逾時,而不是無限迴圈的原因。
- 音訊參數錯誤 ——Seedance 使用
generate_audio,ViduQ3 使用 audio。傳送錯誤參數時不會報錯,而是靜默地不產生任何效果,情況反而更糟。請依模型確認欄位名稱。
從這裡開始
最快的方法是:取得金鑰,執行上方的 Seedance 與 ViduQ3 程式片段,接著替換模型字串來測試其他模型。選擇模型所需的一切資訊——目前價格、支援模式、解析度表——都位於目錄中的各模型頁面。一把金鑰、一個餘額、五個影片引擎。