Skip to main content

视频生成接口

NUWA 提供统一的视频生成接口,兼容 OpenAI SDK。支持以下多种主流模型:

OpenAI Sora 系列

  • sora-2
  • sora-2-pro

Gemini Veo 系列

  • veo3.1
  • veo3.1-pro
  • veo3.1-components

Sora 视频生成

from openai import OpenAI
import requests
from io import BytesIO
from PIL import Image

client = OpenAI(
base_url="https://api.nuwaapi.com/v1/",
api_key="API_KEY"
)

def prepare_image(image_url, save_path="input_ref.png"):
"""下载参考图片(可选)"""
if not image_url:
return None
resp = requests.get(image_url)
img = Image.open(BytesIO(resp.content)).convert("RGB")
img.save(save_path)
return save_path

def test_sora_model(prompt="测试视频:日落海边,一位画家在沙滩上作画,镜头从远景推进到近景"):
video_params = {
"model": "sora-2",
"prompt": prompt,
"seconds": "4", # 4/8/12 可选
"size": "720x1280", # 720x1280 或 1280x720
}

# 可选参考图,留空则不带参考图
image_url = "https://example.com/your_image.png"
ref_path = prepare_image(image_url) if image_url else None
if ref_path:
video_params["input_reference"] = open(ref_path, "rb")

video = client.videos.create(**video_params)
print("任务 ID:", video.id)

# 轮询状态
import time
while True:
info = client.videos.retrieve(video.id)
print("状态:", info.status)
if info.status in ("completed", "failed", "canceled"):
break
time.sleep(5)

if info.status == "completed":
filename = "sora_test_video.mp4"
resp = client.videos.download_content(video_id=video.id)
with open(filename, "wb") as f:
f.write(resp.read())
print(f"✅ 视频生成完成: {filename}")
else:
print(f"❌ 视频生成失败,状态: {info.status}")

if __name__ == "__main__":
test_sora_model()

Veo 视频生成

from openai import OpenAI
import re
import requests

client = OpenAI(
base_url="https://api.nuwaapi.com/v1/",
api_key="API_KEY"
)

prompt_text = "生成一个10秒的治愈风格小猫追蝴蝶的视频"
duration = "10s"
resolution = "1920x1080"
style = "治愈, 甜美"
fps = 30
video_format = "mp4"

completion = client.chat.completions.create(
model="veo3.1",
messages=[
{
"role": "system",
"content": (
"You are a video assistant. "
"You only respond with video generation task info. "
"Include prompt, duration, resolution, style, fps, format, and video URL when available."
)
},
{
"role": "user",
"content": (
f"生成视频:\n"
f"prompt: {prompt_text}\n"
f"duration: {duration}\n"
f"resolution: {resolution}\n"
f"style: {style}\n"
f"fps: {fps}\n"
f"format: {video_format}"
)
}
],
max_tokens=12800
)

response_text = completion.choices[0].message.content
print("Chat 输出:", response_text)

match = re.search(r'\\[▶️ 在线观看\\]\\((.*?)\\)', response_text or "")
video_url = match.group(1) if match else None
print("视频 URL:", video_url if video_url else "未找到视频 URL")

if video_url:
r = requests.get(video_url)
filename = f"output.{video_format}"
with open(filename, "wb") as f:
f.write(r.content)
print(f"视频已保存为 {filename}")