完整工作流教程
把多个模型串联成一条流水线:先生成人像,再生成旁白,最后用两者驱动一个会说话的数字人。
核心思路是:每个任务的输出都是一个 URL,这些 URL 可以直接作为下一个任务的输入,中间不需要下载再上传。
前置条件
- 一个已充值的 Get3W 账户
- 从 get3w.com/api-keys 获取的 API Key
- Python 3.9+ 以及
requests
bash
pip install requests
export GET3W_API_KEY="sk_your-api-key"辅助函数
两个小函数覆盖两种调用方式 —— 快任务用同步,慢任务用提交加轮询:
python
import os
import time
import requests
BASE = "https://api.get3w.com/v1"
HEADERS = {
"Authorization": f"Bearer {os.environ['GET3W_API_KEY']}",
"Content-Type": "application/json",
}
def run_sync(slug: str, payload: dict) -> dict:
"""For fast tasks: block until the result comes back."""
response = requests.post(
f"{BASE}/{slug}", headers=HEADERS, params={"sync": "true"}, json=payload
)
response.raise_for_status()
return response.json()
def run_async(slug: str, payload: dict, interval: int = 10) -> dict:
"""For slow tasks: submit, then poll until terminal."""
task = requests.post(f"{BASE}/{slug}", headers=HEADERS, json=payload)
task.raise_for_status()
request_id = task.json()["id"]
while True:
result = requests.get(
f"{BASE}/requests/{request_id}", headers=HEADERS
).json()
if result["status"] in ("completed", "failed"):
return result
time.sleep(interval)
def first_output(result: dict) -> str:
if result["status"] != "completed":
raise RuntimeError(f"Task {result['id']} failed "
f"({result.get('code')}): {result.get('error')}")
return result["outputs"][0]第一步:生成人像
python
image = run_sync("google/nano-banana-pro/text-to-image", {
"prompt": "Professional headshot of a friendly business woman, "
"studio lighting, plain white background",
"aspect_ratio": "1:1",
"resolution": "1k",
"output_format": "png",
"channel": "stable",
})
image_url = first_output(image)第二步:生成旁白
python
speech = run_sync("elevenlabs/eleven-3/text-to-speech", {
"text": "Hello! Welcome to Get3W. Let me show you how easy it is "
"to create AI-powered content.",
})
audio_url = first_output(speech)第三步:制作会说话的数字人
数字人任务需要几分钟,所以这一步走 run_async:
python
video = run_async("bytedance/omnihuman-1.5/digital-human", {
"image_url": image_url,
"audio_url": audio_url,
})
video_url = first_output(video)完整脚本
python
print("Step 1: generating portrait...")
image_url = first_output(run_sync("google/nano-banana-pro/text-to-image", {
"prompt": "Professional headshot of a friendly business woman, "
"studio lighting, plain white background",
"aspect_ratio": "1:1",
"resolution": "1k",
"output_format": "png",
"channel": "stable",
}))
print(f" {image_url}")
print("Step 2: generating narration...")
audio_url = first_output(run_sync("elevenlabs/eleven-3/text-to-speech", {
"text": "Hello! Welcome to Get3W. Let me show you how easy it is "
"to create AI-powered content.",
}))
print(f" {audio_url}")
print("Step 3: creating talking avatar (this takes a few minutes)...")
video_url = first_output(run_async("bytedance/omnihuman-1.5/digital-human", {
"image_url": image_url,
"audio_url": audio_url,
}))
print(f" {video_url}")
print("Done.")生产环境注意事项
- 规模化运行时用 webhook 替代轮询。提交时传入
?webhook=<your-url>,结果到达时再处理 —— 详见 Webhook 模式。 - 长时间运行前先确认余额。 每个任务在执行前都会计价,余额不足会直接返回
402,批量任务可能中途停下。 - 需要保留的输出请及时下载。 存放在 Get3W 上的文件仅保留当月和上一个月。
- 逐步骤处理失败。 失败的任务返回 HTTP 200 并带
status: "failed";code能告诉你是否值得重试。5000、5003 和 5004 属于临时性错误;1200 和 1401 不是。
成本
成本取决于你选择的模型、通道、分辨率和时长,以及账户等级对应的折扣。图像和语音步骤很便宜,数字人步骤占了总成本的大头。网页端会在运行前给出预估,各模型页面也列出了自身的价格。
下一步
- 如何降低成本 —— 优化开销
- 如何使用 Webhook —— 生产级异步方案
- API 参考 —— 完整接口参考