使用 Seedance 原始产物继续生成含人像视频

Seedance 2.5 和 Seedance 2.0 系列不接受未经授权、直接上传的真人人脸参考图或参考视频。对于已经通过素材审核生成的视频,可以保留火山原始产物 URL,再把它直接作为下一次 Seedance 任务的参考视频,实现含人像视频的跨模型续写。

本教程演示以下流程:

公网人像图片
  → 火山素材接口创建 AIGC 素材并等待 Active
  → asset://<asset-id> 调用 Seedance 2.0
  → origin 模式取得 15 秒火山原始视频 URL
  → 原始 URL 直接作为 Seedance 2.5 reference_video
  → extend 模式生成 30 秒视频

警告

使用真实人物照片前,必须取得必要授权,并满足适用的肖像权、隐私和内容合规要求。普通素人照片可以按本文使用 AIGC 虚拟人像素材流程;明星、公众人物或需要本人认证的形象应改用火山协议 · 真人人像素材管理

为什么必须使用 origin

创建视频任务时,请设置:

X-Qiniu-Video-API-Format: origin

该请求头会让创建接口返回 cgt-* 格式的任务 ID,并在任务成功后返回火山原始生成物 URL。省略该请求头时,接口返回 qvideo-* 任务 ID 和 Modelink 平台转存 URL。

火山对含人脸模型产物的信任有以下限制:

  • 输入必须是同一火山账号下受支持模型生成的原始产物;
  • 产物生成时间必须在近 30 天内;
  • 不支持跨平台、跨账号使用;
  • 下载后重新编码、剪辑、压缩或转发可能使信任失效;
  • 信任只用于放行符合条件的输入,输出仍需经过安全审核。

因此,不能先下载 2.0 视频再上传到其他对象存储,也不能把平台转存 URL 当作火山原始产物。应把 2.0 成功响应中的原始 URL 原样传给 2.5。

信息

为确保两次任务都只使用支持火山原始产物的渠道,本教程在 Seedance 2.0 和 Seedance 2.5 的创建请求中都设置 origin。查询任务时无需重复传入该请求头。

准备环境

export MODELINK_API_KEY="替换为你的 Modelink API Key"
export MODELINK_BASE_URL="https://api.qnaigc.com"
export TASKS_URL="$MODELINK_BASE_URL/v3/contents/generations/tasks"

海外接入点使用:

export MODELINK_BASE_URL="https://api.modelink.ai"
export TASKS_URL="$MODELINK_BASE_URL/v3/contents/generations/tasks"

命令示例使用 jq 读取 JSON。火山素材 Action 还需要 V4 签名;完整签名规则和素材请求示例见火山协议 · 虚拟人像素材管理

完整操作流程

  1. 创建并审核人像素材

    先调用 GET /v1/asset-projects,选择 supported_asset_types 包含 aigcProjectName。然后通过火山兼容 Action 依次调用:

    1. CreateAssetGroup 创建 GroupType=AIGC 的素材组;
    2. CreateAsset 上传公网可访问的人像图片;
    3. GetAsset 轮询处理状态。

    只有素材达到 Status=Active 后才可以继续。保存 CreateAsset 返回的 Result.Id

    export ASSET_ID="asset-20260818120000-example"

    后续视频请求使用 asset://<asset-id> 格式,例如 asset://asset-20260818120000-example。不要使用 GetAsset 返回的临时下载 URL 替代素材 ID。

  2. 使用 Seedance 2.0 生成 15 秒原始视频

    创建任务时同时传入 asset:// 素材引用和 origin 请求头:

    SOURCE_CREATE_RESPONSE="$(
      curl -sS "$TASKS_URL" \
        -X POST \
        -H "Authorization: Bearer $MODELINK_API_KEY" \
        -H "Content-Type: application/json" \
        -H "X-Qiniu-Video-API-Format: origin" \
        -d "$(jq -n --arg asset_id "$ASSET_ID" '{
          model: "bytedance/doubao-seedance-2-0-260128",
          content: [
            {
              type: "text",
              text: "图片1中的人物在明亮的现代画廊中自然行走,镜头平稳跟随,保持人物外貌和真实摄影风格,无字幕。"
            },
            {
              type: "image_url",
              image_url: {url: ("asset://" + $asset_id)},
              role: "reference_image"
            }
          ],
          generate_audio: false,
          resolution: "720p",
          ratio: "adaptive",
          duration: 15,
          watermark: false
        }')"
    )"
    
    export SOURCE_TASK_ID="$(jq -r '.id' <<<"$SOURCE_CREATE_RESPONSE")"
    echo "$SOURCE_TASK_ID"

    创建成功后应得到 cgt-* 格式的任务 ID。如果仍返回 qvideo-*,请检查请求头名称和值是否正确。

  3. 查询 2.0 任务并保存原始 URL

    查询任务时无需重复传入 X-Qiniu-Video-API-Format

    curl -sS "$TASKS_URL/$SOURCE_TASK_ID" \
      -H "Authorization: Bearer $MODELINK_API_KEY"

    持续轮询,直到 status 进入终态:

    status处理方式
    queued等待后继续查询
    running正在生成,继续查询
    succeeded保存 content.video_url,进入下一步
    failed查看 error.codeerror.message

    成功后直接读取原始 URL:

    SOURCE_RESULT="$(
      curl -sS "$TASKS_URL/$SOURCE_TASK_ID" \
        -H "Authorization: Bearer $MODELINK_API_KEY"
    )"
    
    export SOURCE_VIDEO_URL="$(jq -r '.content.video_url' <<<"$SOURCE_RESULT")"

    原始 URL 通常是火山 TOS 的限时签名地址。请立即用于下一步,不要下载、转码或转存。

  4. 将 2.0 原始视频交给 Seedance 2.5 延长至 30 秒

    $SOURCE_VIDEO_URL 直接放入 reference_video。视频延长任务需要:

    • omni_reference_task_type 设置为 extend
    • ratio 设置为 adaptive
    • 提示词明确包含“向前延长”“向后延长”“延续”或“续写”等意图;
    • duration 设置为希望得到的完整输出时长,本例为 30 秒。
    EXTEND_CREATE_RESPONSE="$(
      curl -sS "$TASKS_URL" \
        -X POST \
        -H "Authorization: Bearer $MODELINK_API_KEY" \
        -H "Content-Type: application/json" \
        -H "X-Qiniu-Video-API-Format: origin" \
        -d "$(jq -n --arg video_url "$SOURCE_VIDEO_URL" '{
          model: "bytedance/doubao-seedance-2-5-260628",
          content: [
            {
              type: "text",
              text: "向后延长视频1:保持同一人物、外貌、服装和真实摄影风格,人物继续走入画廊并在抽象画前回头微笑,镜头平稳跟随,无字幕。"
            },
            {
              type: "video_url",
              video_url: {url: $video_url},
              role: "reference_video"
            }
          ],
          omni_reference_task_type: "extend",
          generate_audio: false,
          resolution: "720p",
          ratio: "adaptive",
          duration: 30,
          watermark: false
        }')"
    )"
    
    export EXTEND_TASK_ID="$(jq -r '.id' <<<"$EXTEND_CREATE_RESPONSE")"
    echo "$EXTEND_TASK_ID"
  5. 查询 2.5 任务结果

    与 2.0 相同,查询请求只需要 Bearer 鉴权:

    curl -sS "$TASKS_URL/$EXTEND_TASK_ID" \
      -H "Authorization: Bearer $MODELINK_API_KEY"

    任务成功后,响应中的 duration 应为 30content.video_url 为 Seedance 2.5 的火山原始视频地址。

正确与错误链路对比

参考视频来源含人像输入能否受信说明
同一火山账号下 Seedance 2.0 返回的原始 URL可以保留供应商原始产物身份,满足近 30 天且未经加工等条件
省略 origin 后得到的 Modelink 平台转存 URL不可以已不是火山原始产物,含真人时可能触发输入审核
下载、剪辑、转码或重新上传后的文件不保证文件处理可能破坏原始产物信任
其他平台或其他火山账号生成的视频不可以不满足同一火山账号条件

平台转存 URL 作为参考视频时,常见异步失败为:

InputVideoSensitiveContentDetected.PrivacyInformation
The request failed because the input video may contain real person.

该错误不是 reference_video 字段格式错误,而是输入未命中火山的含人像原始产物信任。

故障排查

创建请求返回 qvideo-* 而不是 cgt-*

检查是否在创建任务时准确传入:

X-Qiniu-Video-API-Format: origin

唯一支持的非空值是 origin。其他值会返回 HTTP 400。

任务失败并提示 no_original_vendor_output_url_channel

当前模型没有可返回供应商原始 URL 的可用渠道。请联系 Modelink 支持确认 Seedance 原始产物渠道配置;不要改用平台转存 URL 绕过,因为后续含人像参考仍可能被拦截。

原始 URL 仍触发真人输入审核

依次确认:

  1. 素材已达到 Status=Active
  2. 2.0 请求使用 asset:// 引用,并在创建时启用 origin
  3. 传给 2.5 的 URL 就是 2.0 成功响应中的原始 URL,未经过下载或转存;
  4. 2.5 创建请求也启用了 origin
  5. 两次调用使用同一个 Modelink API Key,且后端渠道映射到同一火山账号;
  6. 原始产物生成时间未超过 30 天,签名 URL 尚未过期。

2.5 提示任务类型或参数不匹配

视频延长必须使用 omni_reference_task_type=extendratio=adaptive,并在提示词中明确表达延长或续写意图。duration 支持 [4, 30]-1;本教程设置为 30

相关文档