Skip to content

Doubao Seedance 2.5 教程

Doubao Seedance 2.5(下文简称 Seedance 2.5)是新一代视频创作模型,在长叙事能力、多模态参考能力和编辑能力上全面提升。单次生成时长提升至 30 秒并支持多轮延长,单次参考多模态素材上限提升至 50 个,提供基于时间戳的精准编辑控制。画面质感全面优化,成片更接近实拍的影视质感。本文介绍 Seedance 2.5 模型的特色能力与使用方法,帮助您快速实现 创建视频生成任务 API 调用。

使用前必读

警告

Seedance 2.5 模型在视频编辑、首帧/首尾帧、视频延长任务下存在特殊限制,如不遵循将触发 异步报错

请务必在调用模型前仔细阅读下文,确保正确设置任务类型和配置参数。

各任务限制说明

Seedance 2.5 会根据参数 content.role 取值和提示词意图,将请求判定为 文生视频、参考生视频、视频编辑、视频延长、首帧/首尾帧生视频这5种任务类型

  • 若任务类型为 视频编辑、视频延长、首帧/首尾帧生视频 ,模型对宽高比和时长参数有特殊限制, 违反限制将触发异步报错 。请对照下方各任务的触发条件和特殊限制来设置参数。

  • 若任务类型为 文生视频、参考生视频 ,模型对宽高比和时长参数无特殊限制; 但需避免在参考生视频任务的提示词中出现与视频编辑、延长相关的词语,防止模型误判触发报错

视频编辑

视频编辑任务任务触发条件(两级判定)特殊限制
对原视频的画面或音频进行编辑操作(如替换视频主体、视频中对象增删改、局部画面重绘/修复等)1. 参数 content.role 需设置为 reference_image / reference_video / reference_audio

2. 提示词触发关键词,包含其一即可: 编辑视频、增加/加上、删除/去掉、修改/替换/改成

> @video1 中加一些小动物;把 @video1 的人物修改为 @image1;删掉 @video1 的背景音乐
* 宽高比 ,仅支持配置参数 ratioadaptive,即模型自动保持输出视频和待编辑视频(由模型判定)的宽高比一致,不支持另行设置

* 时长 ,仅支持配置参数 duration-1,即模型自动保持输出视频和待编辑视频的时长基本一致, 不支持自定义

视频延长

视频延长任务任务触发条件(两级判定)特殊限制
对原视频进行向前/向后延长1. 参数 content.role 需设置为 reference_image / reference_video / reference_audio

2. 提示词触发关键词,包含其一即可: 向前/向后延长、延续、续写

> 向后延长 @video1,@image1 的角色从天而降…;续写 @video1 前 5s,@video2 女人入画说…
* 宽高比 ,仅支持配置参数 ratioadaptive,即模型自动保持输出视频和待延长视频(由模型判定)的宽高比一致, 不支持自定义

首帧/首尾帧生视频

首帧/首尾帧生视频任务任务触发条件特殊限制
输入 1 张图作为首帧生成视频,或输入 2 张图分别作为首帧和尾帧生成视频参数 content.role 需设置为 first_frame / last_frame* 宽高比 ,仅支持配置参数 ratioadaptive,即模型自动保持输出视频和输入首帧图的宽高比一致, 不支持自定义

非法传参报错机制

当模型判定任务类型为 视频编辑、视频延长、首帧/首尾帧生视频 任务时,若宽高比(ratio)和时长(duration)参数配置不合法,将产生异步报错:

异步报错

当参数content.role配置为reference_image / reference_video / reference_audio时,模型需要根据提示词意图判定具体的子任务类型(参考生视频、视频编辑、视频延长),进而校验对应子任务下输入参数的合法性(如编辑任务中 ratio 必须为 adaptive),因此该情况下 相关报错信息需排队等待任务启动、模型完成判定后异步返回。

说明

  • 当多个参数同时违规时,报错信息将一次性列出所有违规项。
  • 因任务类型导致的参数不兼容报错,其错误码为 InvalidParameter.TaskTypeConstraint,详见 错误码

最新能力

生成视频时长翻倍

  • 生成视频时长上限由 15 秒延长至 30 秒。

参考素材数量增加

  • 参考图数量上限由 9 张增至 30 张,

  • 参考音/视频数量上限由 3 个增至 10 个

  • 参考音/视频总时长由 15 秒增至 30 秒

更智能的宽高比/时长控制

  • 视频编辑任务,自动保持输出视频的宽高比、时长和输入视频一致。

  • 视频延长、首帧/首尾帧任务,自动保持输出视频的宽高比和输入视频一致。

新增 mov 输出格式

  • 输出视频新增 mov 格式(H.264 视频编码 + yuv444p 色度采样 + PCM 音频编码),提升视频编辑和视频延长场景下的色彩保真度与声画一致性。

原生多语言

  • 支持中文、英语、西班牙语、印度尼西亚语、马来语、泰语、阿拉伯语、葡萄牙语、越南语、日语、韩语等 11 种语言。

能力概述

模型名称Seedance 2.5Seedance 2.0Seedance 2.0 fastSeedance 2.0 mini
Model IDdoubao-seedance-2-5-260628doubao-seedance-2-0-260128doubao-seedance-2-0-fast-260128doubao-seedance-2-0-mini-260615
文生视频
首帧生视频
首尾帧生视频
多模态参考图片参考
视频参考
音频参考✗(需搭配图片/视频)✗(需搭配图片/视频)✗(需搭配图片/视频)
组合参考


* 图片 + 音频

* 图片 + 视频

* 视频 + 音频

* 图片 + 视频 + 音频
编辑视频
延长视频
生成有声视频
参考素材数量上限50(30张图+10个视频+10个音频)15(9张图+3个视频+3个音频)15(9张图+3个视频+3个音频)15(9张图+3个视频+3个音频)
联网搜索工具
样片模式
返回尾帧
输出视频规格输出分辨率480p, 720p480p, 720p, 1080p, 4k480p, 720p480p, 720p
输出宽高比21:9, 16:9, 4:3,

1:1, 3:4, 9:16, adaptive
21:9, 16:9, 4:3,

1:1, 3:4, 9:16, adaptive
21:9, 16:9, 4:3,

1:1, 3:4, 9:16, adaptive
21:9, 16:9, 4:3,

1:1, 3:4, 9:16, adaptive
输出时长4~30 秒;-1(在有效时长内由模型自动选择最佳时长)4~15 秒;-1(在有效时长内由模型自动选择最佳时长)4~15 秒;-1(在有效时长内由模型自动选择最佳时长)4~15 秒;-1(在有效时长内由模型自动选择最佳时长)
输出视频格式mp4, movmp4mp4mp4
离线推理

特色能力

30 秒视频连贯直出

Seedance 2.5 视频生成时长上限由 Seedance 2.0 系列的 15 秒延长至 30 秒,支持一次性生成长达 30 秒的连贯视频,无需多段拼接即可呈现完整故事。

输入:文本 + 图片输出
图片

> 提示词:一段高级、极具电影感的30秒3D动态图形序列,采用精致的蒸汽朋克与复古微缩景观风格…(详见下方代码示例中的完整提示词)
瑙嗛绀轰緥
curl -X POST https://art-api.yuyuflow.com/api/v3/contents/generations/tasks \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $ARK_API_KEY" \
  -d '{
    "model": "doubao-seedance-2-5-260628",
    "content": [
        {
            "type": "text",
            "text": "一段高级、极具电影感的30秒3D动态图形序列,采用精致的蒸汽朋克与复古微缩景观风格,配合连续流畅的环绕与穿透运镜。 [0-10秒]: 古董黄铜钟面微距特写,奇迹般层层展开为相互啮合的旋转齿轮环与体积雾。镜头向下穿透齿轮,一架机械扑翼机(Ornithopter),正从由做旧古籍堆叠而成的微缩峡谷中盘旋升空。 [10-20秒]: 镜头跟随扑翼机的轨迹向前滑行,无缝穿透入一个高速旋转的华丽黄铜幻影箱(Zoetrope),内部投射出飞驰的机械骏马动态光影。光影跃出箱体,场景瞬间化为一辆黄铜质感悬浮缆车,正沿着微光铜轨穿梭于机械齿轮森林,沐浴着电影级的黄金时刻光线。 [20-30秒]: 镜头优雅向下平移,缆车下方出现一艘精美的发条木制机械帆船,在深蓝色玻璃材质的起伏海浪中破浪前行。海浪尽头无缝演变为一轮发光巨月,一群举着摇曳提灯的探险者剪影,正沿着星空下的水晶矿脉山脊艰难跋涉。镜头平滑螺旋拉远,穿过空灵云朵,回到滴答作响的宏大黄铜钟面。最后一秒出现 logo,参考@图像1。 技术规格: 超写实机械纹理,丰富黄铜与金色调,电影级浅景深。平滑连贯的无缝穿梭运镜,极强的史诗感与奇幻冒险氛围。"
        },
        {
            "type": "image_url",
            "image_url": {
                "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_input.png"
            },
            "role": "reference_image"
        }
    ],
    "generate_audio": true,
    "ratio": "16:9",
    "duration": 30,
}'
import os
import time
# Install SDK:  pip install 'volcengine-python-sdk[ark]'
from volcenginesdkarkruntime import Ark

client = Ark(
    # The base URL for model invocation
    base_url='https://art-api.yuyuflow.com/api/v3',
    # Get API Key:https://art-api.yuyuflow.com/dashboard/overview
    api_key=os.environ.get("ARK_API_KEY"),
)

if __name__ == "__main__":
    print("----- create request -----")
    create_result = client.content_generation.tasks.create(
        model="doubao-seedance-2-5-260628", # Replace with Model ID
        content=[
            {
                "type": "text",
                "text": "一段高级、极具电影感的30秒3D动态图形序列,采用精致的蒸汽朋克与复古微缩景观风格,配合连续流畅的环绕与穿透运镜。 [0-10秒]: 古董黄铜钟面微距特写,奇迹般层层展开为相互啮合的旋转齿轮环与体积雾。镜头向下穿透齿轮,一架机械扑翼机(Ornithopter),正从由做旧古籍堆叠而成的微缩峡谷中盘旋升空。 [10-20秒]: 镜头跟随扑翼机的轨迹向前滑行,无缝穿透入一个高速旋转的华丽黄铜幻影箱(Zoetrope),内部投射出飞驰的机械骏马动态光影。光影跃出箱体,场景瞬间化为一辆黄铜质感悬浮缆车,正沿着微光铜轨穿梭于机械齿轮森林,沐浴着电影级的黄金时刻光线。 [20-30秒]: 镜头优雅向下平移,缆车下方出现一艘精美的发条木制机械帆船,在深蓝色玻璃材质的起伏海浪中破浪前行。海浪尽头无缝演变为一轮发光巨月,一群举着摇曳提灯的探险者剪影,正沿着星空下的水晶矿脉山脊艰难跋涉。镜头平滑螺旋拉远,穿过空灵云朵,回到滴答作响的宏大黄铜钟面。最后一秒出现 logo,参考@图像1。 技术规格: 超写实机械纹理,丰富黄铜与金色调,电影级浅景深。平滑连贯的无缝穿梭运镜,极强的史诗感与奇幻冒险氛围。",
            },
            {
                "type": "image_url",
                "image_url": {
                    "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_input.png"
                },
                "role": "reference_image",
            },
        ],
        generate_audio=True,
        ratio="16:9",
        duration=30,
    )
    print(create_result)

    # Polling query section
    print("----- polling task status -----")
    task_id = create_result.id
    while True:
        get_result = client.content_generation.tasks.get(task_id=task_id)
        status = get_result.status
        if status == "succeeded":
            print("----- task succeeded -----")
            print(get_result)
            break
        elif status == "failed":
            print("----- task failed -----")
            print(f"Error: {get_result.error}")
            break
        else:
            print(f"Current status: {status}, Retrying after 30 seconds...")
            time.sleep(30)
package com.ark.sample;

import com.volcengine.ark.runtime.model.content.generation.*;
import com.volcengine.ark.runtime.model.content.generation.CreateContentGenerationTaskRequest.Content;
import com.volcengine.ark.runtime.service.ArkService;
import okhttp3.ConnectionPool;
import okhttp3.Dispatcher;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class ContentGenerationTaskExample {

    // Client initialization
    static String apiKey = System.getenv("ARK_API_KEY");
    static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS);
    static Dispatcher dispatcher = new Dispatcher();
    static ArkService service = ArkService.builder()
           .baseUrl("https://art-api.yuyuflow.com/api/v3") // The base URL for model invocation
           .dispatcher(dispatcher)
           .connectionPool(connectionPool)
           .apiKey(apiKey)
           .build();

    public static void main(String[] args) {

        // Model ID
        final String modelId = "doubao-seedance-2-5-260628";
        // Text prompt
        final String prompt = "一段高级、极具电影感的30秒3D动态图形序列,采用精致的蒸汽朋克与复古微缩景观风格,配合连续流畅的环绕与穿透运镜。 [0-10秒]: 古董黄铜钟面微距特写,奇迹般层层展开为相互啮合的旋转齿轮环与体积雾。镜头向下穿透齿轮,一架机械扑翼机(Ornithopter),正从由做旧古籍堆叠而成的微缩峡谷中盘旋升空。 [10-20秒]: 镜头跟随扑翼机的轨迹向前滑行,无缝穿透入一个高速旋转的华丽黄铜幻影箱(Zoetrope),内部投射出飞驰的机械骏马动态光影。光影跃出箱体,场景瞬间化为一辆黄铜质感悬浮缆车,正沿着微光铜轨穿梭于机械齿轮森林,沐浴着电影级的黄金时刻光线。 [20-30秒]: 镜头优雅向下平移,缆车下方出现一艘精美的发条木制机械帆船,在深蓝色玻璃材质的起伏海浪中破浪前行。海浪尽头无缝演变为一轮发光巨月,一群举着摇曳提灯的探险者剪影,正沿着星空下的水晶矿脉山脊艰难跋涉。镜头平滑螺旋拉远,穿过空灵云朵,回到滴答作响的宏大黄铜钟面。最后一秒出现 logo,参考@图像1。 技术规格: 超写实机械纹理,丰富黄铜与金色调,电影级浅景深。平滑连贯的无缝穿梭运镜,极强的史诗感与奇幻冒险氛围。";

        // Example resource URLs
        final String refImage1 = "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_input.png";

        // Output video parameters
        final boolean generateAudio = true;
        final String videoRatio = "16:9";
        final long videoDuration = 30L;

        System.out.println("----- create request -----");
        // Build request content
        List contents = new ArrayList<>();

        // 1. Text prompt
        contents.add(Content.builder()
                .type("text")
                .text(prompt)
                .build());

        // 2. Reference image
        contents.add(Content.builder()
                .type("image_url")
                .imageUrl(CreateContentGenerationTaskRequest.ImageUrl.builder()
                        .url(refImage1)
                        .build())
                .role("reference_image")
                .build());

        // Create video generation task
        CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
                .generateAudio(generateAudio)
                .model(modelId)
                .content(contents)
                .ratio(videoRatio)
                .duration(videoDuration)
                .build();

        CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
        System.out.println("Task Created: " + createResult);

        // Get task details and poll status
        String taskId = createResult.getId();
        pollTaskStatus(taskId);
    }

    /**
     * Poll task status
     * @param taskId Task ID
     */

    private static void pollTaskStatus(String taskId) {
        GetContentGenerationTaskRequest getRequest = GetContentGenerationTaskRequest.builder()
                .taskId(taskId)
                .build();

        System.out.println("----- polling task status -----");
        try {
            while (true) {
                GetContentGenerationTaskResponse getResponse = service.getContentGenerationTask(getRequest);
                String status = getResponse.getStatus();

                if ("succeeded".equalsIgnoreCase(status)) {
                    System.out.println("----- task succeeded -----");
                    System.out.println(getResponse);
                    break;
                } else if ("failed".equalsIgnoreCase(status)) {
                    System.out.println("----- task failed -----");
                    if (getResponse.getError() != null) {
                        System.out.println("Error: " + getResponse.getError().getMessage());
                    }
                    break;
                } else {
                    System.out.printf("Current status: %s, Retrying in 10 seconds...%n", status);
                    TimeUnit.SECONDS.sleep(10);
                }
            }
        } catch (InterruptedException ie) {
            Thread.currentThread().interrupt();
            System.err.println("Polling interrupted");
        } catch (Exception e) {
            System.err.println("Error occurred: " + e.getMessage());
        } finally {
            service.shutdownExecutor();
        }
    }
}
package main

import (
    "context"
    "fmt"
    "os"
    "time"

    "github.com/volcengine/volcengine-go-sdk/service/arkruntime"
    "github.com/volcengine/volcengine-go-sdk/service/arkruntime/model"
    "github.com/volcengine/volcengine-go-sdk/volcengine"
)

func main() {
    // Initialize Ark client
    client := arkruntime.NewClientWithApiKey(
        os.Getenv("ARK_API_KEY"),
        // The base URL for model invocation
        arkruntime.WithBaseUrl("https://art-api.yuyuflow.com/api/v3"),
    )
    ctx := context.Background()

    // Model ID
    modelID := "doubao-seedance-2-5-260628"
    // Text prompt
    prompt := "一段高级、极具电影感的30秒3D动态图形序列,采用精致的蒸汽朋克与复古微缩景观风格,配合连续流畅的环绕与穿透运镜。 [0-10秒]: 古董黄铜钟面微距特写,奇迹般层层展开为相互啮合的旋转齿轮环与体积雾。镜头向下穿透齿轮,一架机械扑翼机(Ornithopter),正从由做旧古籍堆叠而成的微缩峡谷中盘旋升空。 [10-20秒]: 镜头跟随扑翼机的轨迹向前滑行,无缝穿透入一个高速旋转的华丽黄铜幻影箱(Zoetrope),内部投射出飞驰的机械骏马动态光影。光影跃出箱体,场景瞬间化为一辆黄铜质感悬浮缆车,正沿着微光铜轨穿梭于机械齿轮森林,沐浴着电影级的黄金时刻光线。 [20-30秒]: 镜头优雅向下平移,缆车下方出现一艘精美的发条木制机械帆船,在深蓝色玻璃材质的起伏海浪中破浪前行。海浪尽头无缝演变为一轮发光巨月,一群举着摇曳提灯的探险者剪影,正沿着星空下的水晶矿脉山脊艰难跋涉。镜头平滑螺旋拉远,穿过空灵云朵,回到滴答作响的宏大黄铜钟面。最后一秒出现 logo,参考@图像1。 技术规格: 超写实机械纹理,丰富黄铜与金色调,电影级浅景深。平滑连贯的无缝穿梭运镜,极强的史诗感与奇幻冒险氛围。"

    // Example resource URLs
    refImage1 := "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_input.png"

    // Output video parameters
    generateAudio := true
    videoRatio := "16:9"
    videoDuration := int64(30)

    // 1. Create video generation task
    fmt.Println("----- create request -----")
    createReq := model.CreateContentGenerationTaskRequest{
        Model:         modelID,
        GenerateAudio: volcengine.Bool(generateAudio),
        Ratio:         volcengine.String(videoRatio),
        Duration:      volcengine.Int64(videoDuration),
        Content: []*model.CreateContentGenerationContentItem{
            {
                Type: model.ContentGenerationContentItemTypeText,
                Text: volcengine.String(prompt),
            },
            {
                Type: model.ContentGenerationContentItemType("image_url"),
                ImageURL: &model.ImageURL{
                    URL: refImage1,
                },
                Role: volcengine.String("reference_image"),
            },
        },
    }

    createResp, err := client.CreateContentGenerationTask(ctx, createReq)
    if err != nil {
        fmt.Printf("create content generation error: %v\n", err)
        return
    }

    taskID := createResp.ID
    fmt.Printf("Task Created with ID: %s\n", taskID)

    // 2. Poll task status
    pollTaskStatus(ctx, client, taskID)
}

// poll task status
func pollTaskStatus(ctx context.Context, client *arkruntime.Client, taskID string) {
    fmt.Println("----- polling task status -----")
    for {
        getReq := model.GetContentGenerationTaskRequest{ID: taskID}
        getResp, err := client.GetContentGenerationTask(ctx, getReq)
        if err != nil {
            fmt.Printf("get content generation task error: %v\n", err)
            return
        }

        status := getResp.Status
        if status == "succeeded" {
            fmt.Println("----- task succeeded -----")
            fmt.Printf("Task ID: %s \n", getResp.ID)
            fmt.Printf("Model: %s \n", getResp.Model)
            fmt.Printf("Video URL: %s \n", getResp.Content.VideoURL)
            fmt.Printf("Completion Tokens: %d \n", getResp.Usage.CompletionTokens)
            fmt.Printf("Created At: %d, Updated At: %d\n", getResp.CreatedAt, getResp.UpdatedAt)
            return
        } else if status == "failed" {
            fmt.Println("----- task failed -----")
            if getResp.Error != nil {
                fmt.Printf("Error Code: %s, Message: %s\n", getResp.Error.Code, getResp.Error.Message)
            }
            return
        } else {
            fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status)
            time.Sleep(10 * time.Second)
        }
    }
}

50 个多模态参考素材输入

Seedance 2.5 单次输入素材上限提升至 50 个(30 张图片 + 10 段视频 + 10 段音频),可自由组合图片、视频、音频等多模态素材,实现更丰富的创意表达。同时,Seedance 2.5 新增支持纯音频参考生成视频,无需搭配图片或视频素材。

输入:文本 + 1 张图片 + 6 段视频输出
图片

> 提示词:明亮多彩的广告片风格,果味饼干为主角…(详见下方代码示例中的完整提示词)
瑙嗛绀轰緥




瑙嗛绀轰緥




瑙嗛绀轰緥
瑙嗛绀轰緥




瑙嗛绀轰緥




瑙嗛绀轰緥
瑙嗛绀轰緥
curl -X POST https://art-api.yuyuflow.com/api/v3/contents/generations/tasks \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $ARK_API_KEY" \
  -d '{
    "model": "doubao-seedance-2-5-260628",
    "content": [
        {
            "type": "text",
            "text": "明亮多彩的广告片风格,果味饼干为主角,包含草莓、苹果、葡萄、橙子四种口味,草莓味参考@图像1,饼干与对应水果以强秩序感的几何阵列排布,整体画面干净、高级、节奏强。开场水果快速建立视觉聚焦,参考@视频1的构图,音乐重拍切入。随后不同口味饼干整齐排列,切特写,参考@视频2的动态和运镜。高潮段一块饼干被折断,瞬间进入慢动作,果味夹心爆开,碎屑飞溅,果汁感与颗粒冲击被放大展示,参考@视频3的冲击感。横向阵列,形成节奏抛物感,参考@视频4的运动,突出秩序美感与产品丰富度。随后迅速回到快节奏剪辑。结尾英文文字 One bite of crispness, a heart full of delight 快速分词切换入画,配合强节奏文字运动与产品定格,参考@视频5,最终品牌感收束,饼干和水果向四周发散,参考@视频6画面充满年轻、活力、好吃、想分享的广告氛围。"
        },
        {
            "type": "image_url",
            "image_url": {
                "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_reference1.png"
            },
            "role": "reference_image"
        },
        {
            "type": "video_url",
            "video_url": {
                "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference2.mp4"
            },
            "role": "reference_video"
        },
        {
            "type": "video_url",
            "video_url": {
                "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference3.mp4"
            },
            "role": "reference_video"
        },
        {
            "type": "video_url",
            "video_url": {
                "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference4.mp4"
            },
            "role": "reference_video"
        },
        {
            "type": "video_url",
            "video_url": {
                "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference5.mp4"
            },
            "role": "reference_video"
        },
        {
            "type": "video_url",
            "video_url": {
                "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference6.mp4"
            },
            "role": "reference_video"
        },
        {
            "type": "video_url",
            "video_url": {
                "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference7.mp4"
            },
            "role": "reference_video"
        }
    ],
    "generate_audio": true,
    "ratio": "16:9",
    "duration": 15
}'
import os
import time
# Install SDK:  pip install 'volcengine-python-sdk[ark]'
from volcenginesdkarkruntime import Ark

client = Ark(
    # The base URL for model invocation
    base_url='https://art-api.yuyuflow.com/api/v3',
    # Get API Key:https://art-api.yuyuflow.com/dashboard/overview
    api_key=os.environ.get("ARK_API_KEY"),
)

if __name__ == "__main__":
    print("----- create request -----")
    create_result = client.content_generation.tasks.create(
        model="doubao-seedance-2-5-260628", # Replace with Model ID
        content=[
            {
                "type": "text",
                "text": "明亮多彩的广告片风格,果味饼干为主角,包含草莓、苹果、葡萄、橙子四种口味,草莓味参考@图像1,饼干与对应水果以强秩序感的几何阵列排布,整体画面干净、高级、节奏强。开场水果快速建立视觉聚焦,参考@视频1的构图,音乐重拍切入。随后不同口味饼干整齐排列,切特写,参考@视频2的动态和运镜。高潮段一块饼干被折断,瞬间进入慢动作,果味夹心爆开,碎屑飞溅,果汁感与颗粒冲击被放大展示,参考@视频3的冲击感。横向阵列,形成节奏抛物感,参考@视频4的运动,突出秩序美感与产品丰富度。随后迅速回到快节奏剪辑。结尾英文文字 One bite of crispness, a heart full of delight 快速分词切换入画,配合强节奏文字运动与产品定格,参考@视频5,最终品牌感收束,饼干和水果向四周发散,参考@视频6画面充满年轻、活力、好吃、想分享的广告氛围。",
            },
            {
                "type": "image_url",
                "image_url": {
                    "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_reference1.png"
                },
                "role": "reference_image",
            },
            {
                "type": "video_url",
                "video_url": {
                    "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference2.mp4"
                },
                "role": "reference_video",
            },
            {
                "type": "video_url",
                "video_url": {
                    "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference3.mp4"
                },
                "role": "reference_video",
            },
            {
                "type": "video_url",
                "video_url": {
                    "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference4.mp4"
                },
                "role": "reference_video",
            },
            {
                "type": "video_url",
                "video_url": {
                    "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference5.mp4"
                },
                "role": "reference_video",
            },
            {
                "type": "video_url",
                "video_url": {
                    "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference6.mp4"
                },
                "role": "reference_video",
            },
            {
                "type": "video_url",
                "video_url": {
                    "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference7.mp4"
                },
                "role": "reference_video",
            },
        ],
        generate_audio=True,
        ratio="16:9",
        duration=15,
    )
    print(create_result)

    # Polling query section
    print("----- polling task status -----")
    task_id = create_result.id
    while True:
        get_result = client.content_generation.tasks.get(task_id=task_id)
        status = get_result.status
        if status == "succeeded":
            print("----- task succeeded -----")
            print(get_result)
            break
        elif status == "failed":
            print("----- task failed -----")
            print(f"Error: {get_result.error}")
            break
        else:
            print(f"Current status: {status}, Retrying after 10 seconds...")
            time.sleep(10)
package com.ark.sample;

import com.volcengine.ark.runtime.model.content.generation.*;
import com.volcengine.ark.runtime.model.content.generation.CreateContentGenerationTaskRequest.Content;
import com.volcengine.ark.runtime.service.ArkService;
import okhttp3.ConnectionPool;
import okhttp3.Dispatcher;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class ContentGenerationTaskExample {

    // Client initialization
    static String apiKey = System.getenv("ARK_API_KEY");
    static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS);
    static Dispatcher dispatcher = new Dispatcher();
    static ArkService service = ArkService.builder()
           .baseUrl("https://art-api.yuyuflow.com/api/v3") // The base URL for model invocation
           .dispatcher(dispatcher)
           .connectionPool(connectionPool)
           .apiKey(apiKey)
           .build();

    public static void main(String[] args) {

        // Model ID
        final String modelId = "doubao-seedance-2-5-260628";
        // Text prompt
        final String prompt = "明亮多彩的广告片风格,果味饼干为主角,包含草莓、苹果、葡萄、橙子四种口味,草莓味参考@图像1,饼干与对应水果以强秩序感的几何阵列排布,整体画面干净、高级、节奏强。开场水果快速建立视觉聚焦,参考@视频1的构图,音乐重拍切入。随后不同口味饼干整齐排列,切特写,参考@视频2的动态和运镜。高潮段一块饼干被折断,瞬间进入慢动作,果味夹心爆开,碎屑飞溅,果汁感与颗粒冲击被放大展示,参考@视频3的冲击感。横向阵列,形成节奏抛物感,参考@视频4的运动,突出秩序美感与产品丰富度。随后迅速回到快节奏剪辑。结尾英文文字 One bite of crispness, a heart full of delight 快速分词切换入画,配合强节奏文字运动与产品定格,参考@视频5,最终品牌感收束,饼干和水果向四周发散,参考@视频6画面充满年轻、活力、好吃、想分享的广告氛围。";

        // Example resource URLs
        final String refImage1 = "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_reference1.png";
        final String refVideo1 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference2.mp4";
        final String refVideo2 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference3.mp4";
        final String refVideo3 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference4.mp4";
        final String refVideo4 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference5.mp4";
        final String refVideo5 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference6.mp4";
        final String refVideo6 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference7.mp4";

        // Output video parameters
        final boolean generateAudio = true;
        final String videoRatio = "16:9";
        final long videoDuration = 15L;

        System.out.println("----- create request -----");
        // Build request content
        List contents = new ArrayList<>();

        // 1. Text prompt
        contents.add(Content.builder()
                .type("text")
                .text(prompt)
                .build());

        // 2. Reference image 1
        contents.add(Content.builder()
                .type("image_url")
                .imageUrl(CreateContentGenerationTaskRequest.ImageUrl.builder()
                        .url(refImage1)
                        .build())
                .role("reference_image")
                .build());

        // 3. Reference video 1
        contents.add(Content.builder()
                .type("video_url")
                .videoUrl(CreateContentGenerationTaskRequest.VideoUrl.builder()
                        .url(refVideo1)
                        .build())
                .role("reference_video")
                .build());

        // 4. Reference video 2
        contents.add(Content.builder()
                .type("video_url")
                .videoUrl(CreateContentGenerationTaskRequest.VideoUrl.builder()
                        .url(refVideo2)
                        .build())
                .role("reference_video")
                .build());

        // 5. Reference video 3
        contents.add(Content.builder()
                .type("video_url")
                .videoUrl(CreateContentGenerationTaskRequest.VideoUrl.builder()
                        .url(refVideo3)
                        .build())
                .role("reference_video")
                .build());

        // 6. Reference video 4
        contents.add(Content.builder()
                .type("video_url")
                .videoUrl(CreateContentGenerationTaskRequest.VideoUrl.builder()
                        .url(refVideo4)
                        .build())
                .role("reference_video")
                .build());

        // 7. Reference video 5
        contents.add(Content.builder()
                .type("video_url")
                .videoUrl(CreateContentGenerationTaskRequest.VideoUrl.builder()
                        .url(refVideo5)
                        .build())
                .role("reference_video")
                .build());

        // 8. Reference video 6
        contents.add(Content.builder()
                .type("video_url")
                .videoUrl(CreateContentGenerationTaskRequest.VideoUrl.builder()
                        .url(refVideo6)
                        .build())
                .role("reference_video")
                .build());

        // Create video generation task
        CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
                .generateAudio(generateAudio)
                .model(modelId)
                .content(contents)
                .ratio(videoRatio)
                .duration(videoDuration)
                .build();

        CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
        System.out.println("Task Created: " + createResult);

        // Get task details and poll status
        String taskId = createResult.getId();
        pollTaskStatus(taskId);
    }

    /**
     * Poll task status
     * @param taskId Task ID
     */

    private static void pollTaskStatus(String taskId) {
        GetContentGenerationTaskRequest getRequest = GetContentGenerationTaskRequest.builder()
                .taskId(taskId)
                .build();

        System.out.println("----- polling task status -----");
        try {
            while (true) {
                GetContentGenerationTaskResponse getResponse = service.getContentGenerationTask(getRequest);
                String status = getResponse.getStatus();

                if ("succeeded".equalsIgnoreCase(status)) {
                    System.out.println("----- task succeeded -----");
                    System.out.println(getResponse);
                    break;
                } else if ("failed".equalsIgnoreCase(status)) {
                    System.out.println("----- task failed -----");
                    if (getResponse.getError() != null) {
                        System.out.println("Error: " + getResponse.getError().getMessage());
                    }
                    break;
                } else {
                    System.out.printf("Current status: %s, Retrying in 10 seconds...%n", status);
                    TimeUnit.SECONDS.sleep(10);
                }
            }
        } catch (InterruptedException ie) {
            Thread.currentThread().interrupt();
            System.err.println("Polling interrupted");
        } catch (Exception e) {
            System.err.println("Error occurred: " + e.getMessage());
        } finally {
            service.shutdownExecutor();
        }
    }
}
package main

import (
    "context"
    "fmt"
    "os"
    "time"

    "github.com/volcengine/volcengine-go-sdk/service/arkruntime"
    "github.com/volcengine/volcengine-go-sdk/service/arkruntime/model"
    "github.com/volcengine/volcengine-go-sdk/volcengine"
)

func main() {
    // Initialize Ark client
    client := arkruntime.NewClientWithApiKey(
        os.Getenv("ARK_API_KEY"),
        // The base URL for model invocation
        arkruntime.WithBaseUrl("https://art-api.yuyuflow.com/api/v3"),
    )
    ctx := context.Background()

    // Model ID
    modelID := "doubao-seedance-2-5-260628"
    // Text prompt
    prompt := "明亮多彩的广告片风格,果味饼干为主角,包含草莓、苹果、葡萄、橙子四种口味,草莓味参考@图像1,饼干与对应水果以强秩序感的几何阵列排布,整体画面干净、高级、节奏强。开场水果快速建立视觉聚焦,参考@视频1的构图,音乐重拍切入。随后不同口味饼干整齐排列,切特写,参考@视频2的动态和运镜。高潮段一块饼干被折断,瞬间进入慢动作,果味夹心爆开,碎屑飞溅,果汁感与颗粒冲击被放大展示,参考@视频3的冲击感。横向阵列,形成节奏抛物感,参考@视频4的运动,突出秩序美感与产品丰富度。随后迅速回到快节奏剪辑。结尾英文文字 One bite of crispness, a heart full of delight 快速分词切换入画,配合强节奏文字运动与产品定格,参考@视频5,最终品牌感收束,饼干和水果向四周发散,参考@视频6画面充满年轻、活力、好吃、想分享的广告氛围。"

    // Example resource URLs
    refImage1 := "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_reference1.png"
    refVideo1 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference2.mp4"
    refVideo2 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference3.mp4"
    refVideo3 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference4.mp4"
    refVideo4 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference5.mp4"
    refVideo5 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference6.mp4"
    refVideo6 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference7.mp4"

    // Output video parameters
    generateAudio := true
    videoRatio := "16:9"
    videoDuration := int64(15)

    // 1. Create video generation task
    fmt.Println("----- create request -----")
    createReq := model.CreateContentGenerationTaskRequest{
        Model:         modelID,
        GenerateAudio: volcengine.Bool(generateAudio),
        Ratio:         volcengine.String(videoRatio),
        Duration:      volcengine.Int64(videoDuration),
        Content: []*model.CreateContentGenerationContentItem{
            {
                Type: model.ContentGenerationContentItemTypeText,
                Text: volcengine.String(prompt),
            },
            {
                Type: model.ContentGenerationContentItemType("image_url"),
                ImageURL: &model.ImageURL{
                    URL: refImage1,
                },
                Role: volcengine.String("reference_image"),
            },
            {
                Type: model.ContentGenerationContentItemType("video_url"),
                VideoURL: &model.VideoUrl{
                    Url: refVideo1,
                },
                Role: volcengine.String("reference_video"),
            },
            {
                Type: model.ContentGenerationContentItemType("video_url"),
                VideoURL: &model.VideoUrl{
                    Url: refVideo2,
                },
                Role: volcengine.String("reference_video"),
            },
            {
                Type: model.ContentGenerationContentItemType("video_url"),
                VideoURL: &model.VideoUrl{
                    Url: refVideo3,
                },
                Role: volcengine.String("reference_video"),
            },
            {
                Type: model.ContentGenerationContentItemType("video_url"),
                VideoURL: &model.VideoUrl{
                    Url: refVideo4,
                },
                Role: volcengine.String("reference_video"),
            },
            {
                Type: model.ContentGenerationContentItemType("video_url"),
                VideoURL: &model.VideoUrl{
                    Url: refVideo5,
                },
                Role: volcengine.String("reference_video"),
            },
            {
                Type: model.ContentGenerationContentItemType("video_url"),
                VideoURL: &model.VideoUrl{
                    Url: refVideo6,
                },
                Role: volcengine.String("reference_video"),
            },
        },
    }

    createResp, err := client.CreateContentGenerationTask(ctx, createReq)
    if err != nil {
        fmt.Printf("create content generation error: %v\n", err)
        return
    }

    taskID := createResp.ID
    fmt.Printf("Task Created with ID: %s\n", taskID)

    // 2. Poll task status
    pollTaskStatus(ctx, client, taskID)
}

// poll task status
func pollTaskStatus(ctx context.Context, client *arkruntime.Client, taskID string) {
    fmt.Println("----- polling task status -----")
    for {
        getReq := model.GetContentGenerationTaskRequest{ID: taskID}
        getResp, err := client.GetContentGenerationTask(ctx, getReq)
        if err != nil {
            fmt.Printf("get content generation task error: %v\n", err)
            return
        }

        status := getResp.Status
        if status == "succeeded" {
            fmt.Println("----- task succeeded -----")
            fmt.Printf("Task ID: %s \n", getResp.ID)
            fmt.Printf("Model: %s \n", getResp.Model)
            fmt.Printf("Video URL: %s \n", getResp.Content.VideoURL)
            fmt.Printf("Completion Tokens: %d \n", getResp.Usage.CompletionTokens)
            fmt.Printf("Created At: %d, Updated At: %d\n", getResp.CreatedAt, getResp.UpdatedAt)
            return
        } else if status == "failed" {
            fmt.Println("----- task failed -----")
            if getResp.Error != nil {
                fmt.Printf("Error Code: %s, Message: %s\n", getResp.Error.Code, getResp.Error.Message)
            }
            return
        } else {
            fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status)
            time.Sleep(10 * time.Second)
        }
    }
}

更智能的时长和宽高比控制

Seedance 2.5 模型支持通过配置ratioadaptiveduration-1以智能控制输出视频的宽高比和时长;但在 视频编辑、视频延长、首帧或首尾帧生视频 任务中,具有特殊的控制行为,详情参考以下示例。

使用示例-视频编辑

在视频编辑任务中,Seedance 2.5 输出视频宽高比将自动和输入视频的宽高比保持一致(参数 ratio 默认且仅支持配置为 adaptive),输出视频时长自动和输入视频时长基本保持一致(参数 duration 默认且仅支持配置为 -1)。上述两项均不支持另行设置。

注意

受输入帧处理影响,输出时长可能略短于输入视频(误差不超过 0.4 秒)。

输入:文本 + 视频(宽高比 5:4,时长 16 秒)输出(宽高比 5:4,时长 16 秒)
瑙嗛绀轰緥


> 提示词:视频编辑:删除 @视频1中的所有人,除了主角。
瑙嗛绀轰緥


> 输出视频宽高比自动和待编辑视频的 5:4 保持一致;输出视频时长和待编辑视频的 16 秒基本一致
curl -X POST https://art-api.yuyuflow.com/api/v3/contents/generations/tasks \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $ARK_API_KEY" \
  -d '{
    "model": "doubao-seedance-2-5-260628",
    "content": [
        {
            "type": "text",
            "text": "视频编辑:删除 @视频1中的所有人,除了主角。"
        },
        {
            "type": "video_url",
            "video_url": {
                "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_edit_input.mov"
            },
            "role": "reference_video"
        }
    ],
    "generate_audio": true,
    "ratio": "adaptive",
    "duration": -1,
    "output_format": "mov"
}'
import os
import time
# Install SDK:  pip install 'volcengine-python-sdk[ark]'
from volcenginesdkarkruntime import Ark

client = Ark(
    # The base URL for model invocation
    base_url='https://art-api.yuyuflow.com/api/v3',
    # Get API Key:https://art-api.yuyuflow.com/dashboard/overview
    api_key=os.environ.get("ARK_API_KEY"),
)

if __name__ == "__main__":
    print("----- create request -----")
    create_result = client.content_generation.tasks.create(
        model="doubao-seedance-2-5-260628", # Replace with Model ID
        content=[
            {
                "type": "text",
                "text": "视频编辑:删除 @视频1中的所有人,除了主角。",
            },
            {
                "type": "video_url",
                "video_url": {
                    "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_edit_input.mov"
                },
                "role": "reference_video",
            },
        ],
        generate_audio=True,
        ratio="adaptive",
        duration=-1,
        output_format="mov",
    )
    print(create_result)

    # Polling query section
    print("----- polling task status -----")
    task_id = create_result.id
    while True:
        get_result = client.content_generation.tasks.get(task_id=task_id)
        status = get_result.status
        if status == "succeeded":
            print("----- task succeeded -----")
            print(get_result)
            break
        elif status == "failed":
            print("----- task failed -----")
            print(f"Error: {get_result.error}")
            break
        else:
            print(f"Current status: {status}, Retrying after 10 seconds...")
            time.sleep(10)
package com.ark.sample;

import com.volcengine.ark.runtime.model.content.generation.*;
import com.volcengine.ark.runtime.model.content.generation.CreateContentGenerationTaskRequest.Content;
import com.volcengine.ark.runtime.service.ArkService;
import okhttp3.ConnectionPool;
import okhttp3.Dispatcher;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class ContentGenerationTaskExample {

    // Client initialization
    static String apiKey = System.getenv("ARK_API_KEY");
    static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS);
    static Dispatcher dispatcher = new Dispatcher();
    static ArkService service = ArkService.builder()
           .baseUrl("https://art-api.yuyuflow.com/api/v3") // The base URL for model invocation
           .dispatcher(dispatcher)
           .connectionPool(connectionPool)
           .apiKey(apiKey)
           .build();

    public static void main(String[] args) {

        // Model ID
        final String modelId = "doubao-seedance-2-5-260628";
        // Text prompt
        final String prompt = "视频编辑:删除 @视频1中的所有人,除了主角。";

        // Example resource URLs
        final String refVideo = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_edit_input.mov";

        // Output video parameters
        final boolean generateAudio = true;
        final String videoRatio = "adaptive";
        final long videoDuration = -1L;
        final String outputFormat = "mov";

        System.out.println("----- create request -----");
        // Build request content
        List contents = new ArrayList<>();

        // 1. Text prompt
        contents.add(Content.builder()
                .type("text")
                .text(prompt)
                .build());

        // 2. Reference video
        contents.add(Content.builder()
                .type("video_url")
                .videoUrl(CreateContentGenerationTaskRequest.VideoUrl.builder()
                        .url(refVideo)
                        .build())
                .role("reference_video")
                .build());

        // Create video generation task
        CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
                .generateAudio(generateAudio)
                .model(modelId)
                .content(contents)
                .ratio(videoRatio)
                .duration(videoDuration)
                .outputFormat(outputFormat)
                .build();

        CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
        System.out.println("Task Created: " + createResult);

        // Get task details and poll status
        String taskId = createResult.getId();
        pollTaskStatus(taskId);
    }

    /**
     * Poll task status
     * @param taskId Task ID
     */

    private static void pollTaskStatus(String taskId) {
        GetContentGenerationTaskRequest getRequest = GetContentGenerationTaskRequest.builder()
                .taskId(taskId)
                .build();

        System.out.println("----- polling task status -----");
        try {
            while (true) {
                GetContentGenerationTaskResponse getResponse = service.getContentGenerationTask(getRequest);
                String status = getResponse.getStatus();

                if ("succeeded".equalsIgnoreCase(status)) {
                    System.out.println("----- task succeeded -----");
                    System.out.println(getResponse);
                    break;
                } else if ("failed".equalsIgnoreCase(status)) {
                    System.out.println("----- task failed -----");
                    if (getResponse.getError() != null) {
                        System.out.println("Error: " + getResponse.getError().getMessage());
                    }
                    break;
                } else {
                    System.out.printf("Current status: %s, Retrying in 10 seconds...%n", status);
                    TimeUnit.SECONDS.sleep(10);
                }
            }
        } catch (InterruptedException ie) {
            Thread.currentThread().interrupt();
            System.err.println("Polling interrupted");
        } catch (Exception e) {
            System.err.println("Error occurred: " + e.getMessage());
        } finally {
            service.shutdownExecutor();
        }
    }
}
package main

import (
    "context"
    "fmt"
    "os"
    "time"

    "github.com/volcengine/volcengine-go-sdk/service/arkruntime"
    "github.com/volcengine/volcengine-go-sdk/service/arkruntime/model"
    "github.com/volcengine/volcengine-go-sdk/volcengine"
)

func main() {
    // Initialize Ark client
    client := arkruntime.NewClientWithApiKey(
        os.Getenv("ARK_API_KEY"),
        // The base URL for model invocation
        arkruntime.WithBaseUrl("https://art-api.yuyuflow.com/api/v3"),
    )
    ctx := context.Background()

    // Model ID
    modelID := "doubao-seedance-2-5-260628"
    // Text prompt
    prompt := "视频编辑:删除 @视频1中的所有人,除了主角。"

    // Example resource URLs
    refVideo := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_edit_input.mov"

    // Output video parameters
    generateAudio := true
    videoRatio := "adaptive"
    videoDuration := int64(-1)
    outputFormat := "mov"

    // 1. Create video generation task
    fmt.Println("----- create request -----")
    createReq := model.CreateContentGenerationTaskRequest{
        Model:         modelID,
        GenerateAudio: volcengine.Bool(generateAudio),
        Ratio:         volcengine.String(videoRatio),
        Duration:      volcengine.Int64(videoDuration),
        OutputFormat:  volcengine.String(outputFormat),
        Content: []*model.CreateContentGenerationContentItem{
            {
                Type: model.ContentGenerationContentItemTypeText,
                Text: volcengine.String(prompt),
            },
            {
                Type: model.ContentGenerationContentItemType("video_url"),
                VideoURL: &model.VideoUrl{
                    Url: refVideo,
                },
                Role: volcengine.String("reference_video"),
            },
        },
    }

    createResp, err := client.CreateContentGenerationTask(ctx, createReq)
    if err != nil {
        fmt.Printf("create content generation error: %v\n", err)
        return
    }

    taskID := createResp.ID
    fmt.Printf("Task Created with ID: %s\n", taskID)

    // 2. Poll task status
    pollTaskStatus(ctx, client, taskID)
}

// poll task status
func pollTaskStatus(ctx context.Context, client *arkruntime.Client, taskID string) {
    fmt.Println("----- polling task status -----")
    for {
        getReq := model.GetContentGenerationTaskRequest{ID: taskID}
        getResp, err := client.GetContentGenerationTask(ctx, getReq)
        if err != nil {
            fmt.Printf("get content generation task error: %v\n", err)
            return
        }

        status := getResp.Status
        if status == "succeeded" {
            fmt.Println("----- task succeeded -----")
            fmt.Printf("Task ID: %s \n", getResp.ID)
            fmt.Printf("Model: %s \n", getResp.Model)
            fmt.Printf("Video URL: %s \n", getResp.Content.VideoURL)
            fmt.Printf("Completion Tokens: %d \n", getResp.Usage.CompletionTokens)
            fmt.Printf("Created At: %d, Updated At: %d\n", getResp.CreatedAt, getResp.UpdatedAt)
            return
        } else if status == "failed" {
            fmt.Println("----- task failed -----")
            if getResp.Error != nil {
                fmt.Printf("Error Code: %s, Message: %s\n", getResp.Error.Code, getResp.Error.Message)
            }
            return
        } else {
            fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status)
            time.Sleep(10 * time.Second)
        }
    }
}

使用示例-视频延长

在视频延长任务中,Seedance 2.5 输出视频宽高比将自动和输入视频的宽高比保持一致(参数 ratio 默认且仅支持配置为 adaptive),视频输出时长可以自行设置或由模型智能判断(参数 duration 支持配置为 [4, 30]-1)。

输入:文本 + 视频(视频1宽高比 7:5,视频2、视频3宽高比 16:9)输出(宽高比 7:5)
瑙嗛绀轰緥


> 提示词:延长@视频1,窗户打开后进入@视频2的美术馆室内,最后镜头进入@视频3的画内
瑙嗛绀轰緥


瑙嗛绀轰緥
瑙嗛绀轰緥


> 输出视频宽高比自动和待延长视频的 7:5 保持一致
curl -X POST https://art-api.yuyuflow.com/api/v3/contents/generations/tasks \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $ARK_API_KEY" \
  -d '{
    "model": "doubao-seedance-2-5-260628",
    "content": [
        {
            "type": "text",
            "text": "延长@视频1,窗户打开后进入@视频2的美术馆室内,最后镜头进入@视频3的画内"
        },
        {
            "type": "video_url",
            "video_url": {
                "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video1_75.mov"
            },
            "role": "reference_video"
        },
        {
            "type": "video_url",
            "video_url": {
                "url": "https://ark-project.tos-cn-beijing.volces.com/doc_video/r2v_extend_video2.mp4"
            },
            "role": "reference_video"
        },
        {
            "type": "video_url",
            "video_url": {
                "url": "https://ark-project.tos-cn-beijing.volces.com/doc_video/r2v_extend_video3.mp4"
            },
            "role": "reference_video"
        }
    ],
    "generate_audio": true,
    "ratio": "adaptive",
    "duration": 11,
    "output_format": "mov"
}'
import os
import time
# Install SDK:  pip install 'volcengine-python-sdk[ark]'
from volcenginesdkarkruntime import Ark

client = Ark(
    # The base URL for model invocation
    base_url='https://art-api.yuyuflow.com/api/v3',
    # Get API Key:https://art-api.yuyuflow.com/dashboard/overview
    api_key=os.environ.get("ARK_API_KEY"),
)

if __name__ == "__main__":
    print("----- create request -----")
    create_result = client.content_generation.tasks.create(
        model="doubao-seedance-2-5-260628", # Replace with Model ID
        content=[
            {
                "type": "text",
                "text": "延长@视频1,窗户打开后进入@视频2的美术馆室内,最后镜头进入@视频3的画内",
            },
            {
                "type": "video_url",
                "video_url": {
                    "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video1_75.mov"
                },
                "role": "reference_video",
            },
            {
                "type": "video_url",
                "video_url": {
                    "url": "https://ark-project.tos-cn-beijing.volces.com/doc_video/r2v_extend_video2.mp4"
                },
                "role": "reference_video",
            },
            {
                "type": "video_url",
                "video_url": {
                    "url": "https://ark-project.tos-cn-beijing.volces.com/doc_video/r2v_extend_video3.mp4"
                },
                "role": "reference_video",
            },
        ],
        generate_audio=True,
        ratio="adaptive",
        duration=11,
        output_format="mov",
    )
    print(create_result)

    # Polling query section
    print("----- polling task status -----")
    task_id = create_result.id
    while True:
        get_result = client.content_generation.tasks.get(task_id=task_id)
        status = get_result.status
        if status == "succeeded":
            print("----- task succeeded -----")
            print(get_result)
            break
        elif status == "failed":
            print("----- task failed -----")
            print(f"Error: {get_result.error}")
            break
        else:
            print(f"Current status: {status}, Retrying after 10 seconds...")
            time.sleep(10)
package com.ark.sample;

import com.volcengine.ark.runtime.model.content.generation.*;
import com.volcengine.ark.runtime.model.content.generation.CreateContentGenerationTaskRequest.Content;
import com.volcengine.ark.runtime.service.ArkService;
import okhttp3.ConnectionPool;
import okhttp3.Dispatcher;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class ContentGenerationTaskExample {

    // Client initialization
    static String apiKey = System.getenv("ARK_API_KEY");
    static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS);
    static Dispatcher dispatcher = new Dispatcher();
    static ArkService service = ArkService.builder()
           .baseUrl("https://art-api.yuyuflow.com/api/v3") // The base URL for model invocation
           .dispatcher(dispatcher)
           .connectionPool(connectionPool)
           .apiKey(apiKey)
           .build();

    public static void main(String[] args) {

        // Model ID
        final String modelId = "doubao-seedance-2-5-260628";
        // Text prompt
        final String prompt = "延长@视频1,窗户打开后进入@视频2的美术馆室内,最后镜头进入@视频3的画内";

        // Example resource URLs
        final String refVideo1 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video1_75.mov";
        final String refVideo2 = "https://ark-project.tos-cn-beijing.volces.com/doc_video/r2v_extend_video2.mp4";
        final String refVideo3 = "https://ark-project.tos-cn-beijing.volces.com/doc_video/r2v_extend_video3.mp4";

        // Output video parameters
        final boolean generateAudio = true;
        final String videoRatio = "adaptive";
        final long videoDuration = 11L;
        final String outputFormat = "mov";

        System.out.println("----- create request -----");
        // Build request content
        List contents = new ArrayList<>();

        // 1. Text prompt
        contents.add(Content.builder()
                .type("text")
                .text(prompt)
                .build());

        // 2. Reference video 1
        contents.add(Content.builder()
                .type("video_url")
                .videoUrl(CreateContentGenerationTaskRequest.VideoUrl.builder()
                        .url(refVideo1)
                        .build())
                .role("reference_video")
                .build());

        // 3. Reference video 2
        contents.add(Content.builder()
                .type("video_url")
                .videoUrl(CreateContentGenerationTaskRequest.VideoUrl.builder()
                        .url(refVideo2)
                        .build())
                .role("reference_video")
                .build());

        // 4. Reference video 3
        contents.add(Content.builder()
                .type("video_url")
                .videoUrl(CreateContentGenerationTaskRequest.VideoUrl.builder()
                        .url(refVideo3)
                        .build())
                .role("reference_video")
                .build());

        // Create video generation task
        CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
                .generateAudio(generateAudio)
                .model(modelId)
                .content(contents)
                .ratio(videoRatio)
                .duration(videoDuration)
                .outputFormat(outputFormat)
                .build();

        CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
        System.out.println("Task Created: " + createResult);

        // Get task details and poll status
        String taskId = createResult.getId();
        pollTaskStatus(taskId);
    }

    /**
     * Poll task status
     * @param taskId Task ID
     */

    private static void pollTaskStatus(String taskId) {
        GetContentGenerationTaskRequest getRequest = GetContentGenerationTaskRequest.builder()
                .taskId(taskId)
                .build();

        System.out.println("----- polling task status -----");
        try {
            while (true) {
                GetContentGenerationTaskResponse getResponse = service.getContentGenerationTask(getRequest);
                String status = getResponse.getStatus();

                if ("succeeded".equalsIgnoreCase(status)) {
                    System.out.println("----- task succeeded -----");
                    System.out.println(getResponse);
                    break;
                } else if ("failed".equalsIgnoreCase(status)) {
                    System.out.println("----- task failed -----");
                    if (getResponse.getError() != null) {
                        System.out.println("Error: " + getResponse.getError().getMessage());
                    }
                    break;
                } else {
                    System.out.printf("Current status: %s, Retrying in 10 seconds...%n", status);
                    TimeUnit.SECONDS.sleep(10);
                }
            }
        } catch (InterruptedException ie) {
            Thread.currentThread().interrupt();
            System.err.println("Polling interrupted");
        } catch (Exception e) {
            System.err.println("Error occurred: " + e.getMessage());
        } finally {
            service.shutdownExecutor();
        }
    }
}
package main

import (
    "context"
    "fmt"
    "os"
    "time"

    "github.com/volcengine/volcengine-go-sdk/service/arkruntime"
    "github.com/volcengine/volcengine-go-sdk/service/arkruntime/model"
    "github.com/volcengine/volcengine-go-sdk/volcengine"
)

func main() {
    // Initialize Ark client
    client := arkruntime.NewClientWithApiKey(
        os.Getenv("ARK_API_KEY"),
        // The base URL for model invocation
        arkruntime.WithBaseUrl("https://art-api.yuyuflow.com/api/v3"),
    )
    ctx := context.Background()

    // Model ID
    modelID := "doubao-seedance-2-5-260628"
    // Text prompt
    prompt := "延长@视频1,窗户打开后进入@视频2的美术馆室内,最后镜头进入@视频3的画内"

    // Example resource URLs
    refVideo1 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video1_75.mov"
    refVideo2 := "https://ark-project.tos-cn-beijing.volces.com/doc_video/r2v_extend_video2.mp4"
    refVideo3 := "https://ark-project.tos-cn-beijing.volces.com/doc_video/r2v_extend_video3.mp4"

    // Output video parameters
    generateAudio := true
    videoRatio := "adaptive"
    videoDuration := int64(11)
    outputFormat := "mov"

    // 1. Create video generation task
    fmt.Println("----- create request -----")
    createReq := model.CreateContentGenerationTaskRequest{
        Model:         modelID,
        GenerateAudio: volcengine.Bool(generateAudio),
        Ratio:         volcengine.String(videoRatio),
        Duration:      volcengine.Int64(videoDuration),
        OutputFormat:  volcengine.String(outputFormat),
        Content: []*model.CreateContentGenerationContentItem{
            {
                Type: model.ContentGenerationContentItemTypeText,
                Text: volcengine.String(prompt),
            },
            {
                Type: model.ContentGenerationContentItemType("video_url"),
                VideoURL: &model.VideoUrl{
                    Url: refVideo1,
                },
                Role: volcengine.String("reference_video"),
            },
            {
                Type: model.ContentGenerationContentItemType("video_url"),
                VideoURL: &model.VideoUrl{
                    Url: refVideo2,
                },
                Role: volcengine.String("reference_video"),
            },
            {
                Type: model.ContentGenerationContentItemType("video_url"),
                VideoURL: &model.VideoUrl{
                    Url: refVideo3,
                },
                Role: volcengine.String("reference_video"),
            },
        },
    }

    createResp, err := client.CreateContentGenerationTask(ctx, createReq)
    if err != nil {
        fmt.Printf("create content generation error: %v\n", err)
        return
    }

    taskID := createResp.ID
    fmt.Printf("Task Created with ID: %s\n", taskID)

    // 2. Poll task status
    pollTaskStatus(ctx, client, taskID)
}

// poll task status
func pollTaskStatus(ctx context.Context, client *arkruntime.Client, taskID string) {
    fmt.Println("----- polling task status -----")
    for {
        getReq := model.GetContentGenerationTaskRequest{ID: taskID}
        getResp, err := client.GetContentGenerationTask(ctx, getReq)
        if err != nil {
            fmt.Printf("get content generation task error: %v\n", err)
            return
        }

        status := getResp.Status
        if status == "succeeded" {
            fmt.Println("----- task succeeded -----")
            fmt.Printf("Task ID: %s \n", getResp.ID)
            fmt.Printf("Model: %s \n", getResp.Model)
            fmt.Printf("Video URL: %s \n", getResp.Content.VideoURL)
            fmt.Printf("Completion Tokens: %d \n", getResp.Usage.CompletionTokens)
            fmt.Printf("Created At: %d, Updated At: %d\n", getResp.CreatedAt, getResp.UpdatedAt)
            return
        } else if status == "failed" {
            fmt.Println("----- task failed -----")
            if getResp.Error != nil {
                fmt.Printf("Error Code: %s, Message: %s\n", getResp.Error.Code, getResp.Error.Message)
            }
            return
        } else {
            fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status)
            time.Sleep(10 * time.Second)
        }
    }
}

使用示例-首帧/首尾帧生视频

在首帧/首尾帧生视频任务中,Seedance 2.5 输出视频宽高比将自动和首帧图片宽高比保持一致(参数 ratio 默认且仅支持配置为 adaptive),视频输出时长可以自行设置或由模型智能判断(参数 duration 支持配置为 [4, 30]-1)。

输入:文本 + 首帧(宽高比 1:1) + 尾帧输出(宽高比 1:1)
图片

> 提示词:图中女孩对着镜头说“茄子”,360 度环绕运镜
图片瑙嗛绀轰緥


> 输出视频宽高比自动和首帧图片的 1:1 保持一致
curl -X POST https://art-api.yuyuflow.com/api/v3/contents/generations/tasks \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $ARK_API_KEY" \
  -d '{
    "model": "doubao-seedance-2-5-260628",
    "content": [
        {
            "type": "text",
            "text": "图中女孩对着镜头说“茄子”,360度环绕运镜"
        },
        {
            "type": "image_url",
            "image_url": {
                "url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/seepro_first_frame.jpeg"
            },
            "role": "first_frame"
        },
        {
            "type": "image_url",
            "image_url": {
                "url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/seepro_last_frame.jpeg"
            },
            "role": "last_frame"
        }
    ],
    "generate_audio": true,
    "ratio": "adaptive",
    "duration": 5
}'
import os
import time
# Install SDK:  pip install 'volcengine-python-sdk[ark]'
from volcenginesdkarkruntime import Ark

client = Ark(
    # The base URL for model invocation
    base_url="https://art-api.yuyuflow.com/api/v3",
    # Get API Key: https://art-api.yuyuflow.com/dashboard/overview
    api_key=os.environ.get("ARK_API_KEY"),
)

if __name__ == "__main__":
    print("----- create request -----")
    create_result = client.content_generation.tasks.create(
        model="doubao-seedance-2-5-260628",  # Replace with Model ID
        content=[
            {
                "type": "text",
                "text": "图中女孩对着镜头说“茄子”,360度环绕运镜",
            },
            {
                "type": "image_url",
                "image_url": {
                    "url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/seepro_first_frame.jpeg"
                },
                "role": "first_frame",
            },
            {
                "type": "image_url",
                "image_url": {
                    "url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/seepro_last_frame.jpeg"
                },
                "role": "last_frame",
            },
        ],
        generate_audio=True,
        ratio="adaptive",
        duration=5,
    )
    print(create_result)

    # Polling query section
    print("----- polling task status -----")
    task_id = create_result.id
    while True:
        get_result = client.content_generation.tasks.get(task_id=task_id)
        status = get_result.status
        if status == "succeeded":
            print("----- task succeeded -----")
            print(get_result)
            break
        if status == "failed":
            print("----- task failed -----")
            print(f"Error: {get_result.error}")
            break

        print(f"Current status: {status}, Retrying after 10 seconds...")
        time.sleep(10)
package com.ark.sample;

import com.volcengine.ark.runtime.model.content.generation.*;
import com.volcengine.ark.runtime.model.content.generation.CreateContentGenerationTaskRequest.Content;
import com.volcengine.ark.runtime.service.ArkService;
import okhttp3.ConnectionPool;
import okhttp3.Dispatcher;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class ContentGenerationTaskExample {

    // Client initialization
    static String apiKey = System.getenv("ARK_API_KEY");
    static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS);
    static Dispatcher dispatcher = new Dispatcher();
    static ArkService service = ArkService.builder()
           .baseUrl("https://art-api.yuyuflow.com/api/v3") // The base URL for model invocation
           .dispatcher(dispatcher)
           .connectionPool(connectionPool)
           .apiKey(apiKey)
           .build();

    public static void main(String[] args) {
        // Model ID
        final String modelId = "doubao-seedance-2-5-260628";
        // Text prompt
        final String prompt = "图中女孩对着镜头说“茄子”,360度环绕运镜";

        // Example resource URLs
        final String firstFrameUrl = "https://ark-project.tos-cn-beijing.volces.com/doc_image/seepro_first_frame.jpeg";
        final String lastFrameUrl = "https://ark-project.tos-cn-beijing.volces.com/doc_image/seepro_last_frame.jpeg";

        // Output video parameters
        final boolean generateAudio = true;
        final String videoRatio = "adaptive";
        final long videoDuration = 5L;

        System.out.println("----- create request -----");
        // Build request content
        List contents = new ArrayList<>();

        // 1. Text prompt
        contents.add(Content.builder()
                .type("text")
                .text(prompt)
                .build());

        // 2. First frame image
        contents.add(Content.builder()
                .type("image_url")
                .imageUrl(CreateContentGenerationTaskRequest.ImageUrl.builder()
                        .url(firstFrameUrl)
                        .build())
                .role("first_frame")
                .build());

        // 3. Last frame image
        contents.add(Content.builder()
                .type("image_url")
                .imageUrl(CreateContentGenerationTaskRequest.ImageUrl.builder()
                        .url(lastFrameUrl)
                        .build())
                .role("last_frame")
                .build());

        // Create video generation task
        CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
                .generateAudio(generateAudio)
                .model(modelId)
                .content(contents)
                .ratio(videoRatio)
                .duration(videoDuration)
                .build();

        CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
        System.out.println("Task Created: " + createResult);

        // Get task details and poll status
        String taskId = createResult.getId();
        pollTaskStatus(taskId);
    }

    /**
     * Poll task status
     * @param taskId Task ID
     */
    private static void pollTaskStatus(String taskId) {
        GetContentGenerationTaskRequest getRequest = GetContentGenerationTaskRequest.builder()
                .taskId(taskId)
                .build();

        System.out.println("----- polling task status -----");
        try {
            while (true) {
                GetContentGenerationTaskResponse getResponse = service.getContentGenerationTask(getRequest);
                String status = getResponse.getStatus();

                if ("succeeded".equalsIgnoreCase(status)) {
                    System.out.println("----- task succeeded -----");
                    System.out.println(getResponse);
                    break;
                } else if ("failed".equalsIgnoreCase(status)) {
                    System.out.println("----- task failed -----");
                    if (getResponse.getError() != null) {
                        System.out.println("Error: " + getResponse.getError().getMessage());
                    }
                    break;
                } else {
                    System.out.printf("Current status: %s, Retrying in 10 seconds...%n", status);
                    TimeUnit.SECONDS.sleep(10);
                }
            }
        } catch (InterruptedException ie) {
            Thread.currentThread().interrupt();
            System.err.println("Polling interrupted");
        } catch (Exception e) {
            System.err.println("Error occurred: " + e.getMessage());
        } finally {
            service.shutdownExecutor();
        }
    }
}
package main

import (
    "context"
    "fmt"
    "os"
    "time"

    "github.com/volcengine/volcengine-go-sdk/service/arkruntime"
    "github.com/volcengine/volcengine-go-sdk/service/arkruntime/model"
    "github.com/volcengine/volcengine-go-sdk/volcengine"
)

func main() {
    // Initialize Ark client
    client := arkruntime.NewClientWithApiKey(
        os.Getenv("ARK_API_KEY"),
        // The base URL for model invocation
        arkruntime.WithBaseUrl("https://art-api.yuyuflow.com/api/v3"),
    )
    ctx := context.Background()

    // Model ID
    modelID := "doubao-seedance-2-5-260628"
    // Text prompt
    prompt := "图中女孩对着镜头说“茄子”,360度环绕运镜"

    // Example resource URLs
    firstFrameURL := "https://ark-project.tos-cn-beijing.volces.com/doc_image/seepro_first_frame.jpeg"
    lastFrameURL := "https://ark-project.tos-cn-beijing.volces.com/doc_image/seepro_last_frame.jpeg"

    // Output video parameters
    generateAudio := true
    videoRatio := "adaptive"
    videoDuration := int64(5)

    // 1. Create video generation task
    fmt.Println("----- create request -----")
    createReq := model.CreateContentGenerationTaskRequest{
        Model:         modelID,
        GenerateAudio: volcengine.Bool(generateAudio),
        Ratio:         volcengine.String(videoRatio),
        Duration:      volcengine.Int64(videoDuration),
        Content: []*model.CreateContentGenerationContentItem{
            {
                Type: model.ContentGenerationContentItemTypeText,
                Text: volcengine.String(prompt),
            },
            {
                Type: model.ContentGenerationContentItemType("image_url"),
                ImageURL: &model.ImageURL{
                    URL: firstFrameURL,
                },
                Role: volcengine.String("first_frame"),
            },
            {
                Type: model.ContentGenerationContentItemType("image_url"),
                ImageURL: &model.ImageURL{
                    URL: lastFrameURL,
                },
                Role: volcengine.String("last_frame"),
            },
        },
    }

    createResp, err := client.CreateContentGenerationTask(ctx, createReq)
    if err != nil {
        fmt.Printf("create content generation error: %v\n", err)
        return
    }

    taskID := createResp.ID
    fmt.Printf("Task Created with ID: %s\n", taskID)

    // 2. Poll task status
    pollTaskStatus(ctx, client, taskID)
}

// poll task status
func pollTaskStatus(ctx context.Context, client *arkruntime.Client, taskID string) {
    fmt.Println("----- polling task status -----")
    for {
        getReq := model.GetContentGenerationTaskRequest{ID: taskID}
        getResp, err := client.GetContentGenerationTask(ctx, getReq)
        if err != nil {
            fmt.Printf("get content generation task error: %v\n", err)
            return
        }

        status := getResp.Status
        if status == "succeeded" {
            fmt.Println("----- task succeeded -----")
            fmt.Printf("Task ID: %s \n", getResp.ID)
            fmt.Printf("Model: %s \n", getResp.Model)
            fmt.Printf("Video URL: %s \n", getResp.Content.VideoURL)
            fmt.Printf("Completion Tokens: %d \n", getResp.Usage.CompletionTokens)
            fmt.Printf("Created At: %d, Updated At: %d\n", getResp.CreatedAt, getResp.UpdatedAt)
            return
        } else if status == "failed" {
            fmt.Println("----- task failed -----")
            if getResp.Error != nil {
                fmt.Printf("Error Code: %s, Message: %s\n", getResp.Error.Code, getResp.Error.Message)
            }
            return
        } else {
            fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status)
            time.Sleep(10 * time.Second)
        }
    }
}

原生多语言生成

Seedance 2.5 原生支持多种语言的提示词输入和有声视频生成,覆盖支持中文、英语、西班牙语、印度尼西亚语、马来语、泰语、阿拉伯语、葡萄牙语、越南语、日语、韩语。

输入:文本 + 图片输出
图片

> 提示词:电影级 hip-hop / 说唱音乐视频,歌词覆盖 8 种语言…(详见下方代码示例中的完整提示词)
瑙嗛绀轰緥
curl -X POST https://art-api.yuyuflow.com/api/v3/contents/generations/tasks \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $ARK_API_KEY" \
  -d '{
    "model": "doubao-seedance-2-5-260628",
    "content": [
        {
            "type": "text",
            "text": "电影级 hip-hop / 说唱音乐视频,真实照片级质感,高端调性,海边场景。以@图像1构建画面:一支乐队在金色沙滩、海浪拍岸的岸边表演 —— 一名主唱手握麦克风、麦架立于湿沙上激情演唱,一名吉他手立于画面左侧,一名吉他手立于画面右侧,一名鼓手坐在后方的架子鼓后敲击;辽阔的海岸线在身后展开,滚滚海浪层层涌来,巨大而温暖的黄金时刻夕阳斜掠过沙滩、在水面上粼粼闪耀,空气中漂浮着海雾与咸湿水汽。 红色运动服的主唱对着镜头充满节奏感地 RAP 演唱 —— 口型与下颌随每一个字精准对位,头随节拍用力点动,带动整段 flow。乐手们随节奏摇摆律动,身后海浪层层拍岸。这是一首明快带劲的说唱曲 —— 语速快、自信、节拍强劲。踩着节拍硬切(HARD CUT),每次切换双重反差(景别与镜头类型同时改变)。 歌词(主唱依次演唱以下每种语言的「你好」,精准对口型): 英语:\"Hello\" 中文:\"你好\" 日语:\"こんにちは\" 韩语:\"안녕하세요\" 葡萄牙语:\"Olá\" 泰语:\"สวัสดี\" 西班牙语:\"Hola\" 阿拉伯语:\"مرحبا\" 镜头 1 [0:00–0:03] —— 低角度大远景定场,斯坦尼康在黄金夕照与海雾中缓缓推进,海浪在乐队身后翻涌。歌词第 1 句(英语「Hello」)。硬切。镜头 2 [0:03–0:05] —— 红运动服主唱对镜头 RAP 的特写,手持甩镜切入,身后海面虚焦粼粼波光。歌词第 2 句(中文「你好」)。硬切。镜头 3 [0:05–0:08] —— 微距插入镜头,固定机位,吉他手的手指在弦上快速拨动,沙粒与咸湿水雾从画面前掠过。歌词第 3 句(日语「こんにちは」)。硬切。镜头 4 [0:08–0:10] —— 对某位乐手的 3/4 侧中景,缓慢潜行环绕,乐器金属件与湿润高光映着海面低斜的夕阳。歌词第 4 句(韩语「안녕하세요」)。硬切。镜头 5 [0:10–0:13] —— 岸边一名乐手,快速横移轨道掠过他,他转向镜头,身后一道浪花破碎。歌词第 5 句(葡萄牙语「Olá」)。硬切。镜头 6 [0:13–0:15] —— 水边的鼓手,手持快速上摇,海风与水花吹动他的头发,他随节拍律动敲击。歌词第 6 句(泰语「สวัสดี」)。硬切。镜头 7 [0:15–0:18] —— 对红运动服主唱 flow 正酣时的紧凑猛推,富攻击性的手持,身后暮色海面衬着乐队剪影。歌词第 7 句(西班牙语「Hola」)。硬切。镜头 8 [0:18–0:20] —— 全乐队英雄式大远景,富攻击性的手持推进,主唱与乐手踩着节拍向镜头迈步,海浪拍碎、金色夕光在整支乐队身后炸开光晕。歌词第 8 句(阿拉伯语「مرحبا」)。 白平衡 4000K,青橙(teal-and-amber)调色,35mm,浅景深,胶片颗粒,弥漫的海雾,黄金时刻光晕。质感扎实、高级、高端。节奏感说唱表演,精准对口型,头随节拍点动。无字幕、无文字叠加、无叠化转场、无重复人物,仅用硬切。总时长 20 秒。"
        },
        {
            "type": "image_url",
            "image_url": {
                "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_muti_language_input.png"
            },
            "role": "reference_image"
        }
    ],
    "generate_audio": true,
    "ratio": "16:9",
    "duration": 20,
}'
import os
import time
# Install SDK:  pip install 'volcengine-python-sdk[ark]'
from volcenginesdkarkruntime import Ark

client = Ark(
    # The base URL for model invocation
    base_url='https://art-api.yuyuflow.com/api/v3',
    # Get API Key:https://art-api.yuyuflow.com/dashboard/overview
    api_key=os.environ.get("ARK_API_KEY"),
)

if __name__ == "__main__":
    print("----- create request -----")
    create_result = client.content_generation.tasks.create(
        model="doubao-seedance-2-5-260628", # Replace with Model ID
        content=[
            {
                "type": "text",
                "text": "电影级 hip-hop / 说唱音乐视频,真实照片级质感,高端调性,海边场景。以@图像1构建画面:一支乐队在金色沙滩、海浪拍岸的岸边表演 —— 一名主唱手握麦克风、麦架立于湿沙上激情演唱,一名吉他手立于画面左侧,一名吉他手立于画面右侧,一名鼓手坐在后方的架子鼓后敲击;辽阔的海岸线在身后展开,滚滚海浪层层涌来,巨大而温暖的黄金时刻夕阳斜掠过沙滩、在水面上粼粼闪耀,空气中漂浮着海雾与咸湿水汽。 红色运动服的主唱对着镜头充满节奏感地 RAP 演唱 —— 口型与下颌随每一个字精准对位,头随节拍用力点动,带动整段 flow。乐手们随节奏摇摆律动,身后海浪层层拍岸。这是一首明快带劲的说唱曲 —— 语速快、自信、节拍强劲。踩着节拍硬切(HARD CUT),每次切换双重反差(景别与镜头类型同时改变)。 歌词(主唱依次演唱以下每种语言的「你好」,精准对口型): 英语:\"Hello\" 中文:\"你好\" 日语:\"こんにちは\" 韩语:\"안녕하세요\" 葡萄牙语:\"Olá\" 泰语:\"สวัสดี\" 西班牙语:\"Hola\" 阿拉伯语:\"مرحبا\" 镜头 1 [0:00–0:03] —— 低角度大远景定场,斯坦尼康在黄金夕照与海雾中缓缓推进,海浪在乐队身后翻涌。歌词第 1 句(英语「Hello」)。硬切。镜头 2 [0:03–0:05] —— 红运动服主唱对镜头 RAP 的特写,手持甩镜切入,身后海面虚焦粼粼波光。歌词第 2 句(中文「你好」)。硬切。镜头 3 [0:05–0:08] —— 微距插入镜头,固定机位,吉他手的手指在弦上快速拨动,沙粒与咸湿水雾从画面前掠过。歌词第 3 句(日语「こんにちは」)。硬切。镜头 4 [0:08–0:10] —— 对某位乐手的 3/4 侧中景,缓慢潜行环绕,乐器金属件与湿润高光映着海面低斜的夕阳。歌词第 4 句(韩语「안녕하세요」)。硬切。镜头 5 [0:10–0:13] —— 岸边一名乐手,快速横移轨道掠过他,他转向镜头,身后一道浪花破碎。歌词第 5 句(葡萄牙语「Olá」)。硬切。镜头 6 [0:13–0:15] —— 水边的鼓手,手持快速上摇,海风与水花吹动他的头发,他随节拍律动敲击。歌词第 6 句(泰语「สวัสดี」)。硬切。镜头 7 [0:15–0:18] —— 对红运动服主唱 flow 正酣时的紧凑猛推,富攻击性的手持,身后暮色海面衬着乐队剪影。歌词第 7 句(西班牙语「Hola」)。硬切。镜头 8 [0:18–0:20] —— 全乐队英雄式大远景,富攻击性的手持推进,主唱与乐手踩着节拍向镜头迈步,海浪拍碎、金色夕光在整支乐队身后炸开光晕。歌词第 8 句(阿拉伯语「مرحبا」)。 白平衡 4000K,青橙(teal-and-amber)调色,35mm,浅景深,胶片颗粒,弥漫的海雾,黄金时刻光晕。质感扎实、高级、高端。节奏感说唱表演,精准对口型,头随节拍点动。无字幕、无文字叠加、无叠化转场、无重复人物,仅用硬切。总时长 20 秒。",
            },
            {
                "type": "image_url",
                "image_url": {
                    "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_muti_language_input.png"
                },
                "role": "reference_image",
            },
        ],
        generate_audio=True,
        ratio="16:9",
        duration=20,
    )
    print(create_result)

    # Polling query section
    print("----- polling task status -----")
    task_id = create_result.id
    while True:
        get_result = client.content_generation.tasks.get(task_id=task_id)
        status = get_result.status
        if status == "succeeded":
            print("----- task succeeded -----")
            print(get_result)
            break
        elif status == "failed":
            print("----- task failed -----")
            print(f"Error: {get_result.error}")
            break
        else:
            print(f"Current status: {status}, Retrying after 30 seconds...")
            time.sleep(30)
package com.ark.sample;

import com.volcengine.ark.runtime.model.content.generation.*;
import com.volcengine.ark.runtime.model.content.generation.CreateContentGenerationTaskRequest.Content;
import com.volcengine.ark.runtime.service.ArkService;
import okhttp3.ConnectionPool;
import okhttp3.Dispatcher;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class ContentGenerationTaskExample {

    // Client initialization
    static String apiKey = System.getenv("ARK_API_KEY");
    static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS);
    static Dispatcher dispatcher = new Dispatcher();
    static ArkService service = ArkService.builder()
           .baseUrl("https://art-api.yuyuflow.com/api/v3") // The base URL for model invocation
           .dispatcher(dispatcher)
           .connectionPool(connectionPool)
           .apiKey(apiKey)
           .build();

    public static void main(String[] args) {

        // Model ID
        final String modelId = "doubao-seedance-2-5-260628";
        // Text prompt
        final String prompt = "电影级 hip-hop / 说唱音乐视频,真实照片级质感,高端调性,海边场景。以@图像1构建画面:一支乐队在金色沙滩、海浪拍岸的岸边表演 —— 一名主唱手握麦克风、麦架立于湿沙上激情演唱,一名吉他手立于画面左侧,一名吉他手立于画面右侧,一名鼓手坐在后方的架子鼓后敲击;辽阔的海岸线在身后展开,滚滚海浪层层涌来,巨大而温暖的黄金时刻夕阳斜掠过沙滩、在水面上粼粼闪耀,空气中漂浮着海雾与咸湿水汽。 红色运动服的主唱对着镜头充满节奏感地 RAP 演唱 —— 口型与下颌随每一个字精准对位,头随节拍用力点动,带动整段 flow。乐手们随节奏摇摆律动,身后海浪层层拍岸。这是一首明快带劲的说唱曲 —— 语速快、自信、节拍强劲。踩着节拍硬切(HARD CUT),每次切换双重反差(景别与镜头类型同时改变)。 歌词(主唱依次演唱以下每种语言的「你好」,精准对口型): 英语:\"Hello\" 中文:\"你好\" 日语:\"こんにちは\" 韩语:\"안녕하세요\" 葡萄牙语:\"Olá\" 泰语:\"สวัสดี\" 西班牙语:\"Hola\" 阿拉伯语:\"مرحبا\" 镜头 1 [0:00–0:03] —— 低角度大远景定场,斯坦尼康在黄金夕照与海雾中缓缓推进,海浪在乐队身后翻涌。歌词第 1 句(英语「Hello」)。硬切。镜头 2 [0:03–0:05] —— 红运动服主唱对镜头 RAP 的特写,手持甩镜切入,身后海面虚焦粼粼波光。歌词第 2 句(中文「你好」)。硬切。镜头 3 [0:05–0:08] —— 微距插入镜头,固定机位,吉他手的手指在弦上快速拨动,沙粒与咸湿水雾从画面前掠过。歌词第 3 句(日语「こんにちは」)。硬切。镜头 4 [0:08–0:10] —— 对某位乐手的 3/4 侧中景,缓慢潜行环绕,乐器金属件与湿润高光映着海面低斜的夕阳。歌词第 4 句(韩语「안녕하세요」)。硬切。镜头 5 [0:10–0:13] —— 岸边一名乐手,快速横移轨道掠过他,他转向镜头,身后一道浪花破碎。歌词第 5 句(葡萄牙语「Olá」)。硬切。镜头 6 [0:13–0:15] —— 水边的鼓手,手持快速上摇,海风与水花吹动他的头发,他随节拍律动敲击。歌词第 6 句(泰语「สวัสดี」)。硬切。镜头 7 [0:15–0:18] —— 对红运动服主唱 flow 正酣时的紧凑猛推,富攻击性的手持,身后暮色海面衬着乐队剪影。歌词第 7 句(西班牙语「Hola」)。硬切。镜头 8 [0:18–0:20] —— 全乐队英雄式大远景,富攻击性的手持推进,主唱与乐手踩着节拍向镜头迈步,海浪拍碎、金色夕光在整支乐队身后炸开光晕。歌词第 8 句(阿拉伯语「مرحبا」)。 白平衡 4000K,青橙(teal-and-amber)调色,35mm,浅景深,胶片颗粒,弥漫的海雾,黄金时刻光晕。质感扎实、高级、高端。节奏感说唱表演,精准对口型,头随节拍点动。无字幕、无文字叠加、无叠化转场、无重复人物,仅用硬切。总时长 20 秒。";

        // Example resource URLs
        final String refImage1 = "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_muti_language_input.png";

        // Output video parameters
        final boolean generateAudio = true;
        final String videoRatio = "16:9";
        final long videoDuration = 20L;

        System.out.println("----- create request -----");
        // Build request content
        List contents = new ArrayList<>();

        // 1. Text prompt
        contents.add(Content.builder()
                .type("text")
                .text(prompt)
                .build());

        // 2. Reference image
        contents.add(Content.builder()
                .type("image_url")
                .imageUrl(CreateContentGenerationTaskRequest.ImageUrl.builder()
                        .url(refImage1)
                        .build())
                .role("reference_image")
                .build());

        // Create video generation task
        CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
                .generateAudio(generateAudio)
                .model(modelId)
                .content(contents)
                .ratio(videoRatio)
                .duration(videoDuration)
                .build();

        CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
        System.out.println("Task Created: " + createResult);

        // Get task details and poll status
        String taskId = createResult.getId();
        pollTaskStatus(taskId);
    }

    /**
     * Poll task status
     * @param taskId Task ID
     */

    private static void pollTaskStatus(String taskId) {
        GetContentGenerationTaskRequest getRequest = GetContentGenerationTaskRequest.builder()
                .taskId(taskId)
                .build();

        System.out.println("----- polling task status -----");
        try {
            while (true) {
                GetContentGenerationTaskResponse getResponse = service.getContentGenerationTask(getRequest);
                String status = getResponse.getStatus();

                if ("succeeded".equalsIgnoreCase(status)) {
                    System.out.println("----- task succeeded -----");
                    System.out.println(getResponse);
                    break;
                } else if ("failed".equalsIgnoreCase(status)) {
                    System.out.println("----- task failed -----");
                    if (getResponse.getError() != null) {
                        System.out.println("Error: " + getResponse.getError().getMessage());
                    }
                    break;
                } else {
                    System.out.printf("Current status: %s, Retrying in 10 seconds...%n", status);
                    TimeUnit.SECONDS.sleep(10);
                }
            }
        } catch (InterruptedException ie) {
            Thread.currentThread().interrupt();
            System.err.println("Polling interrupted");
        } catch (Exception e) {
            System.err.println("Error occurred: " + e.getMessage());
        } finally {
            service.shutdownExecutor();
        }
    }
}
package main

import (
    "context"
    "fmt"
    "os"
    "time"

    "github.com/volcengine/volcengine-go-sdk/service/arkruntime"
    "github.com/volcengine/volcengine-go-sdk/service/arkruntime/model"
    "github.com/volcengine/volcengine-go-sdk/volcengine"
)

func main() {
    // Initialize Ark client
    client := arkruntime.NewClientWithApiKey(
        os.Getenv("ARK_API_KEY"),
        // The base URL for model invocation
        arkruntime.WithBaseUrl("https://art-api.yuyuflow.com/api/v3"),
    )
    ctx := context.Background()

    // Model ID
    modelID := "doubao-seedance-2-5-260628"
    // Text prompt
    prompt := "电影级 hip-hop / 说唱音乐视频,真实照片级质感,高端调性,海边场景。以@图像1构建画面:一支乐队在金色沙滩、海浪拍岸的岸边表演 —— 一名主唱手握麦克风、麦架立于湿沙上激情演唱,一名吉他手立于画面左侧,一名吉他手立于画面右侧,一名鼓手坐在后方的架子鼓后敲击;辽阔的海岸线在身后展开,滚滚海浪层层涌来,巨大而温暖的黄金时刻夕阳斜掠过沙滩、在水面上粼粼闪耀,空气中漂浮着海雾与咸湿水汽。 红色运动服的主唱对着镜头充满节奏感地 RAP 演唱 —— 口型与下颌随每一个字精准对位,头随节拍用力点动,带动整段 flow。乐手们随节奏摇摆律动,身后海浪层层拍岸。这是一首明快带劲的说唱曲 —— 语速快、自信、节拍强劲。踩着节拍硬切(HARD CUT),每次切换双重反差(景别与镜头类型同时改变)。 歌词(主唱依次演唱以下每种语言的「你好」,精准对口型): 英语:\"Hello\" 中文:\"你好\" 日语:\"こんにちは\" 韩语:\"안녕하세요\" 葡萄牙语:\"Olá\" 泰语:\"สวัสดี\" 西班牙语:\"Hola\" 阿拉伯语:\"مرحبا\" 镜头 1 [0:00–0:03] —— 低角度大远景定场,斯坦尼康在黄金夕照与海雾中缓缓推进,海浪在乐队身后翻涌。歌词第 1 句(英语「Hello」)。硬切。镜头 2 [0:03–0:05] —— 红运动服主唱对镜头 RAP 的特写,手持甩镜切入,身后海面虚焦粼粼波光。歌词第 2 句(中文「你好」)。硬切。镜头 3 [0:05–0:08] —— 微距插入镜头,固定机位,吉他手的手指在弦上快速拨动,沙粒与咸湿水雾从画面前掠过。歌词第 3 句(日语「こんにちは」)。硬切。镜头 4 [0:08–0:10] —— 对某位乐手的 3/4 侧中景,缓慢潜行环绕,乐器金属件与湿润高光映着海面低斜的夕阳。歌词第 4 句(韩语「안녕하세요」)。硬切。镜头 5 [0:10–0:13] —— 岸边一名乐手,快速横移轨道掠过他,他转向镜头,身后一道浪花破碎。歌词第 5 句(葡萄牙语「Olá」)。硬切。镜头 6 [0:13–0:15] —— 水边的鼓手,手持快速上摇,海风与水花吹动他的头发,他随节拍律动敲击。歌词第 6 句(泰语「สวัสดี」)。硬切。镜头 7 [0:15–0:18] —— 对红运动服主唱 flow 正酣时的紧凑猛推,富攻击性的手持,身后暮色海面衬着乐队剪影。歌词第 7 句(西班牙语「Hola」)。硬切。镜头 8 [0:18–0:20] —— 全乐队英雄式大远景,富攻击性的手持推进,主唱与乐手踩着节拍向镜头迈步,海浪拍碎、金色夕光在整支乐队身后炸开光晕。歌词第 8 句(阿拉伯语「مرحبا」)。 白平衡 4000K,青橙(teal-and-amber)调色,35mm,浅景深,胶片颗粒,弥漫的海雾,黄金时刻光晕。质感扎实、高级、高端。节奏感说唱表演,精准对口型,头随节拍点动。无字幕、无文字叠加、无叠化转场、无重复人物,仅用硬切。总时长 20 秒。"

    // Example resource URLs
    refImage1 := "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_muti_language_input.png"

    // Output video parameters
    generateAudio := true
    videoRatio := "16:9"
    videoDuration := int64(20)

    // 1. Create video generation task
    fmt.Println("----- create request -----")
    createReq := model.CreateContentGenerationTaskRequest{
        Model:         modelID,
        GenerateAudio: volcengine.Bool(generateAudio),
        Ratio:         volcengine.String(videoRatio),
        Duration:      volcengine.Int64(videoDuration),
        Content: []*model.CreateContentGenerationContentItem{
            {
                Type: model.ContentGenerationContentItemTypeText,
                Text: volcengine.String(prompt),
            },
            {
                Type: model.ContentGenerationContentItemType("image_url"),
                ImageURL: &model.ImageURL{
                    URL: refImage1,
                },
                Role: volcengine.String("reference_image"),
            },
        },
    }

    createResp, err := client.CreateContentGenerationTask(ctx, createReq)
    if err != nil {
        fmt.Printf("create content generation error: %v\n", err)
        return
    }

    taskID := createResp.ID
    fmt.Printf("Task Created with ID: %s\n", taskID)

    // 2. Poll task status
    pollTaskStatus(ctx, client, taskID)
}

// poll task status
func pollTaskStatus(ctx context.Context, client *arkruntime.Client, taskID string) {
    fmt.Println("----- polling task status -----")
    for {
        getReq := model.GetContentGenerationTaskRequest{ID: taskID}
        getResp, err := client.GetContentGenerationTask(ctx, getReq)
        if err != nil {
            fmt.Printf("get content generation task error: %v\n", err)
            return
        }

        status := getResp.Status
        if status == "succeeded" {
            fmt.Println("----- task succeeded -----")
            fmt.Printf("Task ID: %s \n", getResp.ID)
            fmt.Printf("Model: %s \n", getResp.Model)
            fmt.Printf("Video URL: %s \n", getResp.Content.VideoURL)
            fmt.Printf("Completion Tokens: %d \n", getResp.Usage.CompletionTokens)
            fmt.Printf("Created At: %d, Updated At: %d\n", getResp.CreatedAt, getResp.UpdatedAt)
            return
        } else if status == "failed" {
            fmt.Println("----- task failed -----")
            if getResp.Error != nil {
                fmt.Printf("Error Code: %s, Message: %s\n", getResp.Error.Code, getResp.Error.Message)
            }
            return
        } else {
            fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status)
            time.Sleep(10 * time.Second)
        }
    }
}

更多能力

Seedance 2.5 同样支持以下基础能力,详细使用方式和代码示例请参考对应链接:

  • 文生视频:输入文本提示词生成一段视频。

  • 使用联网搜索:根据提示词自主判断是否搜索互联网内容(如商品、天气等)。提升生成视频的时效性。

说明

以上能力的使用方式与 Seedance 2.0 系列基本一致,仅需将 Model ID 替换为 doubao-seedance-2-5-260628,并注意 Seedance 2.5 对应的参数限制(详见 创建视频生成任务 API )。

自定义视频输出规格

通过 API 参数控制输出视频的规格,包括分辨率、宽高比、时长、输出格式、是否包含水印等。

  • resolution :指定输出视频的分辨率。

  • ratio :指定输出视频的宽高比。

  • duration :指定输出视频的时长。

  • output_format :指定输出视频的格式。

  • watermark :指定是否为输出视频添加水印。

分辨率

通过 resolution 参数指定输出视频的分辨率。

  • 默认值:720p

  • 可选值:480p720p

Seedance 2.5 暂不支持 1080p 和 4k 分辨率。

Json
{
    "resolution": "720p"
}

宽高比

通过 ratio 参数指定输出视频的宽高比。

  • 默认值:adaptive:即模型根据输入的 prompt 和参考素材,自动适配视频宽高比。

  • 可选值:16:94:31:13:49:1621:9adaptive

adaptive 适配规则

  • 视频编辑 / 视频延长 :保持输出视频和首个待编辑视频/被延长视频的宽高比一致。
  • 首帧 / 首尾帧生视频 :保持输出视频和首帧图片的宽高比一致。
  • 文生视频/参考生视频 :根据 prompt 选择可选宽高比中(16:94:31:13:49:1621:9)最合适的宽高比。

注意

Seedance 2.5 在视频编辑、视频延长、首帧 / 首尾帧生视频任务中,仅支持配置 ratioadaptive,不可指定具体宽高比。

Json
{
    "ratio": "16:9"
}

不同宽高比对应的宽高像素值:

分辨率宽高比像素尺寸(宽×高)
480p16:9854×480
4:3752×560
1:1640×640
3:4560×752
9:16480×854
21:9992×432
720p16:91280×720
4:31112×834
1:1960×960
3:4834×1112
9:16720×1280
21:91470×630

视频时长

通过 duration 参数指定生成视频的时长(单位:秒)。

  • 默认值:-1

  • 取值范围:[4, 30]-1

    • -1 :模型根据输入的 prompt 和参考素材 ,自动适配视频时长。

duration = -1 适配规则

  • 视频编辑任务:保持输出视频的时长和输入视频基本一致。
  • 输出视频可能是非整数秒

  • 输出视频可能略短于输入视频,误差不超过 0.4 秒

  • 其他生视频任务:模型在 [4, 30] 范围内,自主选择合适的视频长度(整数秒)。

注意

Seedance 2.5 在视频编辑任务仅支持配置 duration-1,不可指定具体时长;且传入的待编辑视频时长需在 [4, 30]s 内,否则将触发报错。

Json
{
   "duration": 10
}

输出格式

通过 output_format 参数控制输出视频的格式。

  • mp4(默认):通用格式,兼容性最好,采用标准色彩精度可在网页、移动端、各类播放器及分发平台直接播放。

  • mov:面向专业场景的高色彩精度格式,更好地保持画面色彩与亮度一致性、适用于调色、抠像、合成等对色彩还原要求高的专业后期加工。推荐在视频编辑和视频延长场景使用 mov 格式作为输入和输出。

mov 格式播放兼容性

mov 格式采用专业编码(H.264视频编码+yuv444p 色度采样+PCM 音频编码),部分播放器可能不兼容。以下为常见的支持播放 mov 格式的播放器:

播放器macOSWindows
IINA
VLC
mpv
ffplay
Json
{
    "output_format": "mov"
}

视频中添加水印

通过 watermark 参数,来控制是否在生成的视频中添加水印。

  • true:在视频右下角添加AI生成水印标识。

  • false(默认):不添加水印。

Json
{
    "watermark": true
}

便利创作含肖像视频

Seedance 2.5 支持与 Seedance 2.0 系列相同的便利创作功能,详细教程请参见 Doubao Seedance 便利创作含肖像视频

方案介绍
信任模型产物作为输入素材本账号下部分模型生成的含人脸原始产物可作为输入素材,再次调用 Seedance 2.5 系列模型进行二次创作,不会触发输入审核拦截。
使用预置虚拟人像平台预置虚拟人像库,为创作者提供免费、合规、丰富多样的肖像素材。适用于需真人风格人脸但无需指定具体人物,追求零合规风险、快速创作的场景。
使用已授权真人素材支持使用已获得授权的真人肖像素材进行视频生成。

提示词技巧

提示词 Skill

平台提供 Seedance 2.5 提示词优化技能 ,方便您对提示词进行调优。

  1. 在本地项目中通过 NPX 安装
Bash
npx --yes skills@latest add \
  "https://arkdocs.tos-cn-beijing.volces.com/skills/" \
  --skill sd25-pe \
  --yes
  1. 使用方式 :在 AI 对话框输入 /sd25-pe + 你的提示词内容,开始调试提示词。

提示词规则

  • 遵循基础公式 :按照"主体 + 动作/事件 + 场景与环境 + 视觉风格 + 运镜/切镜 + 声音"的顺序组织提示词,不需要的部分可省略。

  • 明确素材职责 :使用 @图片1@视频1@音频1 指代参考素材,说明每份素材具体提供什么(如外貌、动作、音色),以及不采用什么。

  • 声音用特殊字符区分 :音乐用 ()、音效用 <>、台词用 {}、字幕用 【】。非中文台词建议在台词前明确语言。

完整的提示词撰写方法、模板和进阶技法详见 Seedance 2.5 提示词指南

使用限制

多模态输入

注意

Seedance 2.5 不支持直接上传含有真人人脸的参考图/视频。为了便利创作者对肖像的使用,平台推出了一系列解决方案,详情参见 Doubao Seedance 便利创作含肖像视频

图片要求

  • 传入方式:图片 URL、图片 Base64 编码、素材 ID。

  • 图片格式:jpeg、png、webp、bmp、tiff、gif、heic、heif。

  • 单个图片尺寸:

    • 宽高比(宽/高): [0.4, 2.5]

    • 宽高长度(px):[300, 6000]

  • 大小:单张图片小于 30 MB。请求体大小不超过 64 MB。大文件请勿使用Base64编码。

  • 图片数量:

    • 图生视频-首帧:1 张

    • 图生视频-首尾帧:2 张

    • 多模态参考生视频:1~30 张

视频要求

  • 传入方式:视频URL、素材 ID。

  • 视频格式:mp4、mov,支持编码格式见下表。

  • 分辨率:480p,720p

  • 时长:单个视频时长 [2, 30] s,最多传入 10 个参考视频,所有视频总时长不超过 30s。

  • 单个视频尺寸:

    • 宽高比(宽/高):[0.4, 2.5]

    • 宽高长度(px):[300, 6000]

    • 总像素数:[640×640=409600, 3326×2494=8295044],即宽和高的乘积符合 [409600, 8295044] 的区间要求。

  • 大小:单个视频不超过 200 MB。

  • 帧率 (FPS):[24, 60]

容器格式常用文件扩展名MIME支持编码
MP4.mp4video/mp4视频:H.264/AVC、H.265/HEVC

音频:AAC、MP3
QuickTime.movvideo/quicktime视频:H.264/AVC、H.265/HEVC

音频:AAC、MP3

音频要求

  • 传入方式:音频 URL 、音频 Base64 编码、素材 ID。

  • 音频格式:wav、mp3

  • 时长:单个音频时长 [2, 30] s,最多传入 10 段参考音频,所有音频总时长不超过 30 s。

  • 大小:单个音频不超过 15 MB,请求体大小不超过 64 MB。大文件请勿使用Base64编码。

保存时间

  • 任务记录:保存 7 天,查询区间 [T-7天, T),T 为请求发起时刻的 UTC 秒级时间戳。

  • 视频 URL:保存 24 小时(超时后无法访问),下载次数上限为 100 次,请及时下载或转存。