mcpField
A
aliyun-vidu-video

aliyun-vidu-video

github.com/cinience创意与媒体39658 次安装11 周前更新
代码仓库

关于 aliyun-vidu-video

为需要生成视频的用户提供调用阿里云 Vidu 模型的技能,支持文本、图像、关键帧和参考素材生成,并通过异步任务获取结果。

主要功能

  1. 01文本生成视频
  2. 02单图生成视频
  3. 03首尾关键帧插值生成
  4. 04参考素材生成视频
  5. 05配置分辨率、时长和音轨

适用场景

  1. 01将文字描述转为视频
  2. 02让静态图片延展为视频
  3. 03根据首尾画面生成过渡视频
  4. 04将参考主体融入指定场景

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/cinience/alicloud-skills --skill aliyun-vidu-video

安装后在 Claude Code 中输入/aliyun-vidu-video确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
api_reference.md
sources.md
scripts/
generate_vidu_video.py

详细介绍

Vidu 视频生成

验证

mkdir -p output/aliyun-vidu-video
python -m py_compile skills/ai/video/aliyun-vidu-video/scripts/generate_vidu_video.py && echo "py_compile_ok" > output/aliyun-vidu-video/validate.txt

通过标准:命令以 0 退出,并生成 output/aliyun-vidu-video/validate.txt。

输出与证据

  • 将任务 ID、轮询响应和最终视频 URL 保存到 output/aliyun-vidu-video/。
  • 至少保留一份端到端运行日志,以便排查问题。

前置条件

  • 在环境中设置 DASHSCOPE_API_KEY(需要北京地域的密钥)。
  • 地域:仅限中国大陆(北京)。模型、Endpoint URL 和 API Key 必须属于同一地域。
  • 首次使用前,在 Alibaba Cloud Model Studio 控制台中启用 Vidu 模型。

关键模型名称

文本转视频
  • vidu/viduq3-pro_text2video
  • vidu/viduq3-turbo_text2video
  • vidu/viduq2_text2video
图像转视频(首帧)
  • vidu/viduq3-pro_img2video
  • vidu/viduq3-turbo_img2video
  • vidu/viduq2-pro_img2video
  • vidu/viduq2-turbo_img2video
关键帧转视频(首帧 + 尾帧)
  • vidu/viduq3-pro_start-end2video
  • vidu/viduq3-turbo_start-end2video
  • vidu/viduq2-pro_start-end2video
  • vidu/viduq2-turbo_start-end2video
参考图转视频
  • vidu/viduq2_reference2video
  • vidu/viduq2-pro_reference2video

功能

功能说明模型后缀必需输入
文本转视频仅根据文本提示词生成视频_text2videoprompt
图像转视频根据单张图像和可选提示词生成视频_img2videomedia[image]
关键帧转视频在首帧和尾帧图像之间插值生成视频_start-end2videomedia[image x2] + prompt
参考图转视频将参考主体融入提示词描述的场景_reference2videomedia[image 1-7] + prompt

API 端点(仅异步)

POST https://dashscope.aliyuncs.com/api/v1/services/aigc/video-generation/video-synthesis

必需请求头:

  • Authorization: Bearer $DASHSCOPE_API_KEY
  • Content-Type: application/json
  • X-DashScope-Async: enable

统一接口

请求
  • model(string,必需)——上文列出的模型名称之一
  • input.prompt(string)——最多 5000 个字符,用于描述所需的视频内容
    • 文本转视频、关键帧和参考图模式必需
    • 图像转视频模式可选
  • input.media(array)——包含 type 和 url 字段的媒体对象(文本转视频模式不使用)
    • type:image 或 video
    • url:公开 URL(HTTP/HTTPS)
  • parameters.resolution(string,可选)——540P、720P(默认)或 1080P
  • parameters.size(string,可选)——像素尺寸 width*height(例如 1280*720)。具体取值取决于分辨率档位。文本转视频和参考图转视频支持指定尺寸。
  • parameters.duration(integer,可选)——视频时长,单位为秒
    • Q3 模型:[1, 16],默认值为 5
    • Q2 模型:[1, 10],默认值为 5
  • parameters.audio(boolean,可选)——生成音轨(仅限 Q3 模型,默认值为 false)
  • parameters.watermark(boolean,可选)——添加“AI 生成”水印(默认值为 false)
  • parameters.seed(integer,可选)——范围为 [0, 2147483647]
文本转视频各分辨率档位的尺寸
分辨率宽高比尺寸(width*height)
540P16:9960*528
540P9:16528*960
540P1:1720*720
540P4:3816*608
540P3:4608*816
720P16:91280*720
720P9:16720*1280
720P1:1960*960
720P4:31104*816
720P3:4816*1104
1080P16:91920*1080
1080P9:161080*1920
1080P1:11440*1440
1080P4:31674*1238
1080P3:41238*1674
各分辨率档位的尺寸(参考视频生成)
分辨率宽高比尺寸(宽*高)
540P16:9960*540
540P9:16540*960
540P1:1540*540
540P4:3720*540
540P3:4540*720
720P16:91280*720
720P9:16720*1280
720P1:1720*720
720P4:3960*720
720P3:4720*960
1080P16:91920*1080
1080P9:161080*1920
1080P1:11080*1080
1080P4:31440*1080
1080P3:41080*1440
媒体输入限制

图像(type=image):

  • 格式:JPG、PNG、WEBP
  • 宽高比:1:4 至 4:1
  • 最大尺寸:50MB

视频(type=video,仅限参考视频生成):

  • 格式:mp4、avi、mov
  • 分辨率:最低 128x128 像素
  • 宽高比:1:4 至 4:1
  • 时长:1-5s
  • 最大尺寸:50MB
响应(创建任务)
  • output.task_id(string)——用于轮询,有效期为 24 小时
  • output.task_status(string)——PENDING | RUNNING | SUCCEEDED | FAILED | CANCELED | UNKNOWN
  • request_id(string)
响应(任务结果)
  • output.video_url(string)——生成的视频 URL(MP4、H.264),有效期为 24 小时
  • output.orig_prompt(string)——原始提示词
  • usage.duration(integer)——计费视频时长,单位为秒
  • usage.output_video_duration(integer)——实际输出时长
  • usage.size(string)——输出分辨率
  • usage.fps(integer)——帧率(24)
  • usage.audio(boolean)——是否生成了音频
  • usage.SR(string)——分辨率档位

快速开始(Python + HTTP)

import os
import json
import time
import requests

API_KEY = os.getenv("DASHSCOPE_API_KEY")
BASE_URL = "https://dashscope.aliyuncs.com/api/v1"

def create_vidu_task(req: dict) -> str:
    """Create a Vidu video generation task and return task_id."""
    payload = {
        "model": req["model"],
        "input": {},
        "parameters": {
            "resolution": req.get("resolution", "720P"),
            "duration": req.get("duration", 5),
        },
    }
    if req.get("prompt"):
        payload["input"]["prompt"] = req["prompt"]
    if req.get("media"):
        payload["input"]["media"] = req["media"]
    if req.get("size"):
        payload["parameters"]["size"] = req["size"]
    if req.get("audio") is not None:
        payload["parameters"]["audio"] = req["audio"]
    if req.get("watermark") is not None:
        payload["parameters"]["watermark"] = req["watermark"]
    if req.get("seed") is not None:
        payload["parameters"]["seed"] = req["seed"]

    resp = requests.post(
        f"{BASE_URL}/services/aigc/video-generation/video-synthesis",
        headers={
            "Authorization": f"Bearer {API_KEY}",
            "Content-Type": "application/json",
            "X-DashScope-Async": "enable",
        },
        json=payload,
    )
    resp.raise_for_status()
    data = resp.json()
    return data["output"]["task_id"]


def poll_task(task_id: str, interval: int = 15) -> dict:
    """Poll until task completes. Returns final response."""
    while True:
        resp = requests.get(
            f"{BASE_URL}/tasks/{task_id}",
            headers={"Authorization": f"Bearer {API_KEY}"},
        )
        resp.raise_for_status()
        data = resp.json()
        status = data["output"]["task_status"]
        if status in ("SUCCEEDED", "FAILED", "CANCELED"):
            return data
        time.sleep(interval)

特定模式示例

# Text-to-video
task_id = create_vidu_task({
    "model": "vidu/viduq3-turbo_text2video",
    "prompt": "A cat running under moonlight",
    "resolution": "540P",
    "size": "960*528",
    "duration": 5,
})

# Image-to-video (first frame)
task_id = create_vidu_task({
    "model": "vidu/viduq3-pro_img2video",
    "prompt": "Camera slowly pans upward",
    "media": [{"type": "image", "url": "https://example.com/image.jpg"}],
    "resolution": "720P",
    "duration": 5,
})

# Keyframe-to-video (first + last frame)
task_id = create_vidu_task({
    "model": "vidu/viduq3-turbo_start-end2video",
    "prompt": "A cat jumps from windowsill to sofa",
    "media": [
        {"type": "image", "url": "https://example.com/first.png"},
        {"type": "image", "url": "https://example.com/last.png"},
    ],
    "resolution": "540P",
    "duration": 5,
})

# Reference-to-video
task_id = create_vidu_task({
    "model": "vidu/viduq2_reference2video",
    "prompt": "Man playing guitar in a cafe",
    "media": [
        {"type": "image", "url": "https://example.com/ref1.jpg"},
        {"type": "image", "url": "https://example.com/ref2.jpg"},
    ],
    "resolution": "720P",
    "size": "1280*720",
    "duration": 5,
})

错误处理

错误可能原因操作
401/403缺少或无效的 DASHSCOPE_API_KEY检查环境变量;确保使用北京区域的密钥
400 InvalidParameter不支持的分辨率/尺寸组合、时长无效或缺少媒体根据尺寸表验证参数
"does not support synchronous calls"缺少 X-DashScope-Async: enable 标头添加必需的标头
429速率限制或配额问题采用退避策略重试
跨区域错误模型和 API Key 来自不同区域确保所有内容均使用北京区域

输出位置

  • 默认输出:output/aliyun-vidu-video/videos/
  • 使用 OUTPUT_DIR 覆盖基础目录。

反面做法

  • 不要使用上文“关键模型名称”中未列出的模型名称。
  • 不要同步调用此 API——必须使用异步标头。
  • 使用参考视频生成时,不要省略 size——此模式必需此参数。
  • 不要在 Q2 模型中传入 audio=true——只有 Q3 模型支持音频生成。
  • 视频 URL 会在 24 小时后过期;请立即下载并持久化。
  • 图生视频时,恰好提供 1 张图像。关键帧模式下,恰好提供 2 张图像(先首帧,再尾帧)。
  • 使用 viduq2_reference2video 进行参考视频生成时,仅接受图像(1-7 张)。使用 viduq2-pro_reference2video 时,接受图像(1-4 张)以及可选的视频(1-2 个)。
  • 关键帧模式:首帧与尾帧的像素数之比必须在 0.8 到 1.25 之间。

工作流

  1. 确认用户意图:文生视频、图生视频、关键帧或参考视频生成。
  2. 根据功能和质量档位(Q3 pro/turbo 或 Q2)选择适当的模型名称。
  3. 准备输入:提示词和/或媒体数组,并确保类型正确且 URL 有效、可公开访问。
  4. 设置分辨率、尺寸和时长参数。
  5. 创建异步任务并轮询结果(建议间隔 15s)。
  6. 在 URL 过期前下载并保存生成的视频(24 小时)。

参考资料

  • 完整的 HTTP API 详情请参阅 references/api_reference.md。
  • 来源链接请参阅 references/sources.md。

评论

支持 Markdown