- frontend/: Next.js 16 app (App Router, React 19, Tailwind v4) - skills/: project skills (seedance, automation, trae-agents, etc.) - Docs: PRD, UI-Design-System, DEV-LOG, seedance integration notes - skills-lock.json: skills version lock Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3045 lines
131 KiB
Markdown
3045 lines
131 KiB
Markdown
Seedance 模型具备出色的语义理解能力,可根据用户输入的文本、图片等内容,快速生成优质的视频片段。通过这篇教程,您可学习到如何调用 [Video Generation API](https://www.volcengine.com/docs/82379/1520758) 生成视频。
|
||
:::warning
|
||
Seedance 2.0 模型目前仅支持 [控制台体验中心](https://console.volcengine.com/ark/region:ark+cn-beijing/experience/vision?modelId=doubao-seedance-2-0-260128&tab=GenVideo) 在免费额度内体验,暂不支持 API 调用,敬请期待。
|
||
:::
|
||
:::tip
|
||
方舟平台的新用户?获取 API Key 及 开通模型等准备工作,请参见 [快速入门](/docs/82379/1399008)。
|
||
:::
|
||
<span id="a06d249e"></span>
|
||
# 效果预览
|
||
访问[模型卡片](https://console.volcengine.com/ark/region:ark+cn-beijing/model/detail?Id=doubao-seedance-2-0)查看更多示例。
|
||
|
||
<span aceTableMode="list" aceTableWidth="2,2,4,4"></span>
|
||
|场景 |输入:提示词 |输入:图片、视频、音频 |输出 |
|
||
|---|---|---|---|
|
||
|首帧图生视频 |一辆地铁轰隆隆驶过,书页和女孩的头发飞扬,镜头开始环绕着女孩360度旋转,周围的背景从地铁站渐渐转变为一个中世纪的教堂,西式幻想风格的音乐渐入。夹在女孩书中的几页信纸随风飞扬,在女孩的周身打着旋,随风而动的纸张降落时,女孩身处的环境已经彻底变成中世纪教堂的模样 |<span> </span> |<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/2400b351c4514dae897c197dcc963364~tplv-goo7wpa0wc-image.image" controls></video>|\
|
||
| | | | |
|
||
|首尾帧生视频 |360度环绕运镜 |<span> </span> |<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ace519a8a6d24c2c9ab3ccab1f729240~tplv-goo7wpa0wc-image.image" controls></video>|\
|
||
| | | | |
|
||
|
||
<span id="fd30cc1a"></span>
|
||
# 新手入门
|
||
视频生成是一个异步过程:
|
||
|
||
1. 成功调用 `POST /contents/generations/tasks` 接口后,API 将返回一个任务 ID 。
|
||
2. 您可以轮询 `GET /contents/generations/tasks/{id}` 接口,直到任务状态变为 `succeeded`;或者使用 Webhook 自动接收视频生成任务的状态变化。
|
||
3. 任务完成后,您可在 content.**video_url** 字段处,下载最终生成的 MP4 文件。
|
||
|
||
<span id="34b10d6d"></span>
|
||
## Step1: 创建视频生成任务
|
||
通过 `POST /contents/generations/tasks` 创建视频生成任务。
|
||
|
||
```mixin-react
|
||
return (<Tabs>
|
||
<Tabs.TabPane title="Curl" key="HHh29l3ni9"><RenderMd content={`\`\`\`Bash
|
||
curl https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \\
|
||
-H "Content-Type: application/json" \\
|
||
-H "Authorization: Bearer $ARK_API_KEY" \\
|
||
-d '{
|
||
"model": "doubao-seedance-1-5-pro-251215",
|
||
"content": [
|
||
{
|
||
"type": "text",
|
||
"text": "女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声"
|
||
},
|
||
{
|
||
"type": "image_url",
|
||
"image_url": {
|
||
"url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png"
|
||
}
|
||
}
|
||
],
|
||
"generate_audio": true,
|
||
"ratio": "adaptive",
|
||
"duration": 5,
|
||
"watermark": false
|
||
}'
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Python" key="m5yR9UkPeV"><RenderMd content={`\`\`\`Python
|
||
import os
|
||
from volcenginesdkarkruntime import Ark
|
||
|
||
# Get API Key:https://console.volcengine.com/ark/region:ark+cn-beijing/apikey
|
||
client = Ark(api_key=os.environ.get("ARK_API_KEY"))
|
||
|
||
if __name__ == "__main__":
|
||
print("----- create request -----")
|
||
resp = client.content_generation.tasks.create(
|
||
model="doubao-seedance-1-5-pro-251215", # Replace with Model ID
|
||
content=[
|
||
{
|
||
"text": (
|
||
"女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动"
|
||
),
|
||
"type": "text"
|
||
},
|
||
{
|
||
"image_url": {
|
||
"url": (
|
||
"https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png"
|
||
)
|
||
},
|
||
"type": "image_url"
|
||
}
|
||
],
|
||
generate_audio=True,
|
||
ratio="adaptive",
|
||
duration=5,
|
||
watermark=False,
|
||
)
|
||
|
||
print(resp)
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Java" key="JLDLjzTEvb"><RenderMd content={`\`\`\`Java
|
||
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 {
|
||
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
|
||
// Initialize the Ark client to read your API Key from an environment variable
|
||
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://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation
|
||
.dispatcher(dispatcher)
|
||
.connectionPool(connectionPool)
|
||
.apiKey(apiKey)
|
||
.build();
|
||
|
||
public static void main(String[] args) {
|
||
String model = "doubao-seedance-1-5-pro-251215"; // Replace with Model ID
|
||
Boolean generateAudio = true;
|
||
String ratio = "adaptive";
|
||
Long duration = 5L;
|
||
Boolean watermark = false;
|
||
System.out.println("----- create request -----");
|
||
List<Content> contents = new ArrayList<>();
|
||
|
||
// Combination of text prompt and parameters
|
||
contents.add(Content.builder()
|
||
.type("text")
|
||
.text("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声")
|
||
.build());
|
||
// The URL of the first frame image
|
||
contents.add(Content.builder()
|
||
.type("image_url")
|
||
.imageUrl(CreateContentGenerationTaskRequest.ImageUrl.builder()
|
||
.url("https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png")
|
||
.build())
|
||
.build());
|
||
|
||
// Create a video generation task
|
||
CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
|
||
.model(model)
|
||
.content(contents)
|
||
.generateAudio(generateAudio)
|
||
.ratio(ratio)
|
||
.duration(duration)
|
||
.watermark(watermark)
|
||
.build();
|
||
|
||
CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
|
||
System.out.println(createResult);
|
||
|
||
service.shutdownExecutor();
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Go" key="VO7xzExGiI"><RenderMd content={`\`\`\`Go
|
||
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() {
|
||
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
|
||
// Initialize the Ark client to read your API Key from an environment variable
|
||
client := arkruntime.NewClientWithApiKey(
|
||
// Get your API Key from the environment variable. This is the default mode and you can modify it as required
|
||
os.Getenv("ARK_API_KEY"),
|
||
// The base URL for model invocation
|
||
arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"),
|
||
)
|
||
ctx := context.Background()
|
||
// Replace with Model ID
|
||
modelEp := "doubao-seedance-1-5-pro-251215"
|
||
|
||
// Generate a task
|
||
fmt.Println("----- create request -----")
|
||
createReq := model.CreateContentGenerationTaskRequest{
|
||
Model: modelEp,
|
||
GenerateAudio: volcengine.Bool(true),
|
||
Ratio: volcengine.String("adaptive"),
|
||
Duration: volcengine.Int64(5),
|
||
Watermark: volcengine.Bool(false),
|
||
Content: []*model.CreateContentGenerationContentItem{
|
||
{
|
||
// Combination of text prompt and parameters
|
||
Type: model.ContentGenerationContentItemTypeText,
|
||
Text: volcengine.String("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声"),
|
||
},
|
||
{
|
||
// The URL of the first frame image
|
||
Type: model.ContentGenerationContentItemTypeImage,
|
||
ImageURL: &model.ImageURL{
|
||
URL: "https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png",
|
||
},
|
||
},
|
||
},
|
||
}
|
||
createResp, err := client.CreateContentGenerationTask(ctx, createReq)
|
||
if err != nil {
|
||
fmt.Printf("create content generation error: %v", err)
|
||
return
|
||
}
|
||
taskID := createResp.ID
|
||
fmt.Printf("Task Created with ID: %s", taskID)
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane></Tabs>);
|
||
```
|
||
|
||
请求成功后,系统将返回一个任务 ID。
|
||
```JSON
|
||
{
|
||
"id": "cgt-2025******-****"
|
||
}
|
||
```
|
||
|
||
<span id="a4fa0cc8"></span>
|
||
## Step2: 查询视频生成任务
|
||
利用创建视频生成任务时返回的 ID ,您可以查询视频生成任务的详细状态与结果。此接口会返回任务的当前状态(如 `queued` 、`running` 、 `succeeded` 等)以及生成的视频相关信息(如视频下载链接、分辨率、时长等)。
|
||
:::tip
|
||
因模型、API负载和视频输出规格的不同,视频生成的过程可能耗时较长。为高效管理这一过程,您可以通过轮询 API 接口(详见 [基础使用](/docs/82379/1366799#754e68e3) 和 [进阶使用](/docs/82379/1366799#e190e738) 部分的 SDK 示例)来请求状态更新,或通过 [使用 Webhook 通知](/docs/82379/1366799#724d67c3) 接收通知。
|
||
|
||
:::
|
||
```mixin-react
|
||
return (<Tabs>
|
||
<Tabs.TabPane title="Curl" key="LSIbbR5GyO"><RenderMd content={`\`\`\`Bash
|
||
# Replace cgt-2025**** with the ID acquired from "Create Video Generation Task".
|
||
|
||
curl https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/cgt-2025**** \\
|
||
-H "Content-Type: application/json" \\
|
||
-H "Authorization: Bearer $ARK_API_KEY"
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Python" key="MQxA6oNWWh"><RenderMd content={`\`\`\`Python
|
||
import os
|
||
from volcenginesdkarkruntime import Ark
|
||
|
||
client = Ark(api_key=os.environ.get("ARK_API_KEY"))
|
||
|
||
if __name__ == "__main__":
|
||
resp = client.content_generation.tasks.get(
|
||
task_id="cgt-2025****",
|
||
)
|
||
print(resp)
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Java" key="LejqOE9QI3"><RenderMd content={`\`\`\`Java
|
||
package com.ark.sample;
|
||
|
||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||
import com.volcengine.ark.runtime.model.content.generation.GetContentGenerationTaskRequest;
|
||
import com.volcengine.ark.runtime.service.ArkService;
|
||
import java.util.concurrent.TimeUnit;
|
||
import okhttp3.ConnectionPool;
|
||
import okhttp3.Dispatcher;
|
||
|
||
|
||
public class Sample {
|
||
|
||
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()
|
||
.dispatcher(dispatcher)
|
||
.connectionPool(connectionPool)
|
||
.apiKey(apiKey)
|
||
.build();
|
||
|
||
public static void main(String[] args) throws JsonProcessingException {
|
||
String taskId = "cgt-2025****";
|
||
|
||
GetContentGenerationTaskRequest req = GetContentGenerationTaskRequest.builder()
|
||
.taskId(taskId)
|
||
.build();
|
||
|
||
|
||
service.getContentGenerationTask(req).toString();
|
||
System.out.println(service.getContentGenerationTask(req));
|
||
|
||
service.shutdownExecutor();
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Go" key="Eqc43DGxTq"><RenderMd content={`\`\`\`Go
|
||
package main
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"os"
|
||
|
||
"github.com/volcengine/volcengine-go-sdk/service/arkruntime"
|
||
"github.com/volcengine/volcengine-go-sdk/service/arkruntime/model"
|
||
)
|
||
|
||
|
||
func main() {
|
||
client := arkruntime.NewClientWithApiKey(os.Getenv("ARK_API_KEY"))
|
||
ctx := context.Background()
|
||
|
||
req := model.GetContentGenerationTaskRequest{
|
||
ID: "cgt-2025****",
|
||
}
|
||
resp, err := client.GetContentGenerationTask(ctx, req)
|
||
if err != nil {
|
||
fmt.Printf("get content generation task error: %v\\n", err)
|
||
return
|
||
}
|
||
fmt.Printf("%+v\\n", resp)
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane></Tabs>);
|
||
```
|
||
|
||
当任务状态变为 succeeded 后,您可在 content.**video_url** 字段处,下载最终生成的视频文件。
|
||
```JSON
|
||
{
|
||
"id": "cgt-2025****",
|
||
"model": "doubao-seedance-1-5-pro-251215",
|
||
"status": "succeeded",
|
||
"content": {
|
||
// Video download URL (file format is MP4)
|
||
"video_url": "https://ark-content-generation-cn-beijing.tos-cn-beijing.volces.com/****"
|
||
},
|
||
"usage": {
|
||
"completion_tokens": 246840,
|
||
"total_tokens": 246840
|
||
},
|
||
"created_at": 1765510475,
|
||
"updated_at": 1765510559,
|
||
"seed": 58944,
|
||
"resolution": "1080p",
|
||
"ratio": "16:9",
|
||
"duration": 5,
|
||
"framespersecond": 24,
|
||
"service_tier": "default",
|
||
"execution_expires_after": 172800
|
||
}
|
||
```
|
||
|
||
<span id="e7b4c498"></span>
|
||
# 模型能力
|
||
|
||
<span aceTableMode="list" aceTableWidth="4,4,3,3,3,,"></span>
|
||
|模型名称 | |[Seedance 1.5 pro](https://console.volcengine.com/ark/region:ark+cn-beijing/model/detail?Id=doubao-seedance-1-5-pro&projectName=default) |[Seedance 1.0 pro](https://console.volcengine.com/ark/region:ark+cn-beijing/model/detail?Id=doubao-seedance-1-0-pro&projectName=default) |[Seedance 1.0 pro fast](https://console.volcengine.com/ark/region:ark+cn-beijing/model/detail?Id=doubao-seedance-1-0-pro-fast&projectName=default) |[Seedance 1.0 lite i2v](https://console.volcengine.com/ark/region:ark+cn-beijing/model/detail?Id=doubao-seedance-1-0-lite-i2v&projectName=default) |[Seedance-1.0 lite t2v](https://console.volcengine.com/ark/region:ark+cn-beijing/model/detail?Id=doubao-seedance-1-0-lite-t2v) |
|
||
|---|---|---|---|---|---|---|
|
||
|Model ID | |doubao\-seedance\-1\-5\-pro\-251215 |doubao\-seedance\-1\-0\-pro\-250528 |doubao\-seedance\-1\-0\-pro\-fast\-251015 |doubao\-seedance\-1\-0\-lite\-t2v\-250428 |doubao\-seedance\-1\-0\-lite\-i2v\-250428 |
|
||
|文生视频 | |<span> </span> |<span> </span> |<span> </span> |<span> </span> |<span> </span> |
|
||
|图生视频\-首帧 | |<span> </span> |<span> </span> |<span> </span> |<span> </span> |<span> </span> |
|
||
|图生视频\-首尾帧 | |<span> </span> |<span> </span> |<span> </span> |<span> </span> |<span> </span> |
|
||
|生成有声视频 | |<span> </span> |<span> </span> |<span> </span> |<span> </span> |<span> </span> |
|
||
|样片模式 | |<span> </span> |<span> </span> |<span> </span> |<span> </span> |<span> </span> |
|
||
|返回视频尾帧 | |<span> </span> |<span> </span> |<span> </span> |<span> </span> |<span> </span> |
|
||
|输出视频规格 |输出分辨率 |480p, 720p, 1080p |480p, 720p, 1080p |480p, 720p, 1080p |480p, 720p, 1080p |480p, 720p, 1080p |
|
||
| |输出宽高比 |21:9, 16:9, 4:3, 1:1, 3:4, 9:16 |||||
|
||
| |输出时长 |4~12 秒 |2~12 秒 |2~12 秒 |2~12 秒 |2~12 秒 |
|
||
| |输出视频格式 |mp4 |mp4 |mp4 |mp4 |mp4 |
|
||
|离线推理 | |<span> </span> |<span> </span> |<span> </span> |<span> </span> |<span> </span> |
|
||
|在线推理限流 |RPM |600 |600 |600 |300 |300 |
|
||
| |并发数 |10 |10 |10 |5 |5 |
|
||
|离线推理限流 |TPD |5000亿 |5000亿 |5000亿 |2500亿 |2500亿 |
|
||
|
||
|
||
|
||
|
||
|
||
<span id="c637f771"></span>
|
||
# 基础使用
|
||
<span id="42750622"></span>
|
||
## 文生视频
|
||
根据用户输入的提示词生成视频,结果具有较大的随机性,可以用于激发创作灵感。
|
||
|
||
<span aceTableMode="list" aceTableWidth="1,1"></span>
|
||
|提示词 |输出 |
|
||
|---|---|
|
||
|写实风格,晴朗的蓝天之下,一大片白色的雏菊花田,镜头逐渐拉近,最终定格在一朵雏菊花的特写上,花瓣上有几颗晶莹的露珠 |<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/62699e55f1674309b6692d188c9ed492~tplv-goo7wpa0wc-image.image" controls></video>|\
|
||
| | |
|
||
|
||
|
||
```mixin-react
|
||
return (<Tabs>
|
||
<Tabs.TabPane title="Python" key="y2VCq6qGBT"><RenderMd content={`\`\`\`Python
|
||
import os
|
||
import time
|
||
# Install SDK: pip install 'volcengine-python-sdk[ark]'
|
||
from volcenginesdkarkruntime import Ark
|
||
|
||
# Make sure that you have stored the API Key in the environment variable ARK_API_KEY
|
||
# Initialize the Ark client to read your API Key from an environment variable
|
||
client = Ark(
|
||
# This is the default path. You can configure it based on the service location
|
||
base_url="https://ark.cn-beijing.volces.com/api/v3",
|
||
# Get API Key:https://console.volcengine.com/ark/region:ark+cn-beijing/apikey
|
||
api_key=os.environ.get("ARK_API_KEY"),
|
||
)
|
||
|
||
if __name__ == "__main__":
|
||
print("----- create request -----")
|
||
create_result = client.content_generation.tasks.create(
|
||
model="doubao-seedance-1-5-pro-251215", # Replace with Model ID
|
||
content=[
|
||
{
|
||
# Combination of text prompt and parameters
|
||
"type": "text",
|
||
"text": "写实风格,晴朗的蓝天之下,一大片白色的雏菊花田,镜头逐渐拉近,最终定格在一朵雏菊花的特写上,花瓣上有几颗晶莹的露珠"
|
||
}
|
||
],
|
||
ratio="16:9",
|
||
duration=5,
|
||
watermark=False,
|
||
)
|
||
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)
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Java" key="QsDO8OmIHL"><RenderMd content={`\`\`\`Java
|
||
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 {
|
||
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
|
||
// Initialize the Ark client to read your API Key from an environment variable
|
||
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://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation
|
||
.dispatcher(dispatcher)
|
||
.connectionPool(connectionPool)
|
||
.apiKey(apiKey)
|
||
.build();
|
||
|
||
public static void main(String[] args) {
|
||
String model = "doubao-seedance-1-5-pro-251215"; // Replace with Model ID
|
||
String ratio = "16:9";
|
||
Long duration = 5L;
|
||
Boolean watermark = false;
|
||
System.out.println("----- create request -----");
|
||
List<Content> contents = new ArrayList<>();
|
||
|
||
// Combination of text prompt and parameters
|
||
contents.add(Content.builder()
|
||
.type("text")
|
||
.text("写实风格,晴朗的蓝天之下,一大片白色的雏菊花田,镜头逐渐拉近,最终定格在一朵雏菊花的特写上,花瓣上有几颗晶莹的露珠")
|
||
.build());
|
||
|
||
// Create a video generation task
|
||
CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
|
||
.model(model)
|
||
.content(contents)
|
||
.ratio(ratio)
|
||
.duration(duration)
|
||
.watermark(watermark)
|
||
.build();
|
||
|
||
CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
|
||
System.out.println(createResult);
|
||
|
||
// Get the details of the task
|
||
String taskId = createResult.getId();
|
||
GetContentGenerationTaskRequest getRequest = GetContentGenerationTaskRequest.builder()
|
||
.taskId(taskId)
|
||
.build();
|
||
|
||
// Polling query section
|
||
System.out.println("----- polling task status -----");
|
||
while (true) {
|
||
try {
|
||
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 -----");
|
||
System.out.println("Error: " + getResponse.getStatus());
|
||
break;
|
||
} else {
|
||
System.out.printf("Current status: %s, Retrying in 10 seconds...", status);
|
||
TimeUnit.SECONDS.sleep(10);
|
||
}
|
||
} catch (InterruptedException ie) {
|
||
Thread.currentThread().interrupt();
|
||
System.err.println("Polling interrupted");
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Go" key="OmweI48v9D"><RenderMd content={`\`\`\`Go
|
||
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() {
|
||
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
|
||
// Initialize the Ark client to read your API Key from an environment variable
|
||
client := arkruntime.NewClientWithApiKey(
|
||
// Get your API Key from the environment variable. This is the default mode and you can modify it as required
|
||
os.Getenv("ARK_API_KEY"),
|
||
// The base URL for model invocation
|
||
arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"),
|
||
)
|
||
ctx := context.Background()
|
||
// Replace with Model ID
|
||
modelEp := "doubao-seedance-1-5-pro-251215"
|
||
|
||
// Generate a task
|
||
fmt.Println("----- create request -----")
|
||
createReq := model.CreateContentGenerationTaskRequest{
|
||
Model: modelEp,
|
||
Ratio: volcengine.String("16:9"),
|
||
Duration: volcengine.Int64(5),
|
||
Watermark: volcengine.Bool(false),
|
||
Content: []*model.CreateContentGenerationContentItem{
|
||
{
|
||
// Combination of text prompt and parameters
|
||
Type: model.ContentGenerationContentItemTypeText,
|
||
Text: volcengine.String("写实风格,晴朗的蓝天之下,一大片白色的雏菊花田,镜头逐渐拉近,最终定格在一朵雏菊花的特写上,花瓣上有几颗晶莹的露珠"),
|
||
},
|
||
},
|
||
}
|
||
createResp, err := client.CreateContentGenerationTask(ctx, createReq)
|
||
if err != nil {
|
||
fmt.Printf("create content generation error: %v", err)
|
||
return
|
||
}
|
||
taskID := createResp.ID
|
||
fmt.Printf("Task Created with ID: %s", taskID)
|
||
|
||
// Polling query section
|
||
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", 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", getResp.CreatedAt, getResp.UpdatedAt)
|
||
return
|
||
} else if status == "failed" {
|
||
fmt.Println("----- task failed -----")
|
||
if getResp.Error != nil {
|
||
fmt.Printf("Error Code: %s, Message: %s", getResp.Error.Code, getResp.Error.Message)
|
||
}
|
||
return
|
||
} else {
|
||
fmt.Printf("Current status: %s, Retrying in 10 seconds... \\n", status)
|
||
time.Sleep(10 * time.Second)
|
||
}
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane></Tabs>);
|
||
```
|
||
|
||
<span id="979b2d28"></span>
|
||
## 图生视频\-基于首帧(`含音频`)
|
||
通过指定视频的首帧图片,模型能够基于该图片生成与之相关且画面连贯的视频内容。
|
||
Seedance 1.5 pro 可通过设置参数 **generate_audio** 为 `true`,生成有声视频。
|
||
|
||
<span aceTableMode="list" aceTableWidth="3,4,4"></span>
|
||
|提示词 |首帧 |输出 |
|
||
|---|---|---|
|
||
|女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声 |<span> </span> |<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/bb440efca0934d65845e2c6ee75501fa~tplv-goo7wpa0wc-image.image" controls></video>|\
|
||
| | | |
|
||
|
||
|
||
```mixin-react
|
||
return (<Tabs>
|
||
<Tabs.TabPane title="Python" key="Xiv8K6YBqJ"><RenderMd content={`\`\`\`Python
|
||
import os
|
||
import time
|
||
# Install SDK: pip install 'volcengine-python-sdk[ark]'
|
||
from volcenginesdkarkruntime import Ark
|
||
|
||
# Make sure that you have stored the API Key in the environment variable ARK_API_KEY
|
||
# Initialize the Ark client to read your API Key from an environment variable
|
||
client = Ark(
|
||
# This is the default path. You can configure it based on the service location
|
||
base_url="https://ark.cn-beijing.volces.com/api/v3",
|
||
# Get API Key:https://console.volcengine.com/ark/region:ark+cn-beijing/apikey
|
||
api_key=os.environ.get("ARK_API_KEY"),
|
||
)
|
||
|
||
if __name__ == "__main__":
|
||
print("----- create request -----")
|
||
create_result = client.content_generation.tasks.create(
|
||
model="doubao-seedance-1-5-pro-251215", # Replace with Model ID
|
||
content=[
|
||
{
|
||
# Combination of text prompt and parameters
|
||
"type": "text",
|
||
"text": "女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声"
|
||
},
|
||
{
|
||
# The URL of the first frame image
|
||
"type": "image_url",
|
||
"image_url": {
|
||
"url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png"
|
||
}
|
||
}
|
||
],
|
||
generate_audio=True,
|
||
ratio="adaptive",
|
||
duration=5,
|
||
watermark=False,
|
||
)
|
||
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)
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Java" key="Wg6jaFp9Q5"><RenderMd content={`\`\`\`Java
|
||
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 {
|
||
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
|
||
// Initialize the Ark client to read your API Key from an environment variable
|
||
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://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation
|
||
.dispatcher(dispatcher)
|
||
.connectionPool(connectionPool)
|
||
.apiKey(apiKey)
|
||
.build();
|
||
|
||
public static void main(String[] args) {
|
||
String model = "doubao-seedance-1-5-pro-251215"; // Replace with Model ID
|
||
Boolean generateAudio = true;
|
||
String ratio = "adaptive";
|
||
Long duration = 5L;
|
||
Boolean watermark = false;
|
||
System.out.println("----- create request -----");
|
||
List<Content> contents = new ArrayList<>();
|
||
|
||
// Combination of text prompt and parameters
|
||
contents.add(Content.builder()
|
||
.type("text")
|
||
.text("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声")
|
||
.build());
|
||
// The URL of the first frame image
|
||
contents.add(Content.builder()
|
||
.type("image_url")
|
||
.imageUrl(CreateContentGenerationTaskRequest.ImageUrl.builder()
|
||
.url("https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png")
|
||
.build())
|
||
.build());
|
||
|
||
// Create a video generation task
|
||
CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
|
||
.model(model)
|
||
.content(contents)
|
||
.generateAudio(generateAudio)
|
||
.ratio(ratio)
|
||
.duration(duration)
|
||
.watermark(watermark)
|
||
.build();
|
||
|
||
CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
|
||
System.out.println(createResult);
|
||
|
||
// Get the details of the task
|
||
String taskId = createResult.getId();
|
||
GetContentGenerationTaskRequest getRequest = GetContentGenerationTaskRequest.builder()
|
||
.taskId(taskId)
|
||
.build();
|
||
|
||
// Polling query section
|
||
System.out.println("----- polling task status -----");
|
||
while (true) {
|
||
try {
|
||
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 -----");
|
||
System.out.println("Error: " + getResponse.getStatus());
|
||
break;
|
||
} else {
|
||
System.out.printf("Current status: %s, Retrying in 10 seconds...", status);
|
||
TimeUnit.SECONDS.sleep(10);
|
||
}
|
||
} catch (InterruptedException ie) {
|
||
Thread.currentThread().interrupt();
|
||
System.err.println("Polling interrupted");
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Go" key="B5JEPgvMU1"><RenderMd content={`\`\`\`Go
|
||
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() {
|
||
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
|
||
// Initialize the Ark client to read your API Key from an environment variable
|
||
client := arkruntime.NewClientWithApiKey(
|
||
// Get your API Key from the environment variable. This is the default mode and you can modify it as required
|
||
os.Getenv("ARK_API_KEY"),
|
||
// The base URL for model invocation
|
||
arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"),
|
||
)
|
||
ctx := context.Background()
|
||
// Replace with Model ID
|
||
modelEp := "doubao-seedance-1-5-pro-251215"
|
||
|
||
// Generate a task
|
||
fmt.Println("----- create request -----")
|
||
createReq := model.CreateContentGenerationTaskRequest{
|
||
Model: modelEp,
|
||
GenerateAudio: volcengine.Bool(true),
|
||
Ratio: volcengine.String("adaptive"),
|
||
Duration: volcengine.Int64(5),
|
||
Watermark: volcengine.Bool(false),
|
||
Content: []*model.CreateContentGenerationContentItem{
|
||
{
|
||
// Combination of text prompt and parameters
|
||
Type: model.ContentGenerationContentItemTypeText,
|
||
Text: volcengine.String("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声"),
|
||
},
|
||
{
|
||
// The URL of the first frame image
|
||
Type: model.ContentGenerationContentItemTypeImage,
|
||
ImageURL: &model.ImageURL{
|
||
URL: "https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png",
|
||
},
|
||
},
|
||
},
|
||
}
|
||
createResp, err := client.CreateContentGenerationTask(ctx, createReq)
|
||
if err != nil {
|
||
fmt.Printf("create content generation error: %v", err)
|
||
return
|
||
}
|
||
taskID := createResp.ID
|
||
fmt.Printf("Task Created with ID: %s", taskID)
|
||
|
||
// Polling query section
|
||
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", 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", getResp.CreatedAt, getResp.UpdatedAt)
|
||
return
|
||
} else if status == "failed" {
|
||
fmt.Println("----- task failed -----")
|
||
if getResp.Error != nil {
|
||
fmt.Printf("Error Code: %s, Message: %s", getResp.Error.Code, getResp.Error.Message)
|
||
}
|
||
return
|
||
} else {
|
||
fmt.Printf("Current status: %s, Retrying in 10 seconds... \\n", status)
|
||
time.Sleep(10 * time.Second)
|
||
}
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane></Tabs>);
|
||
```
|
||
|
||
<span id="0d55ca07"></span>
|
||
## 图生视频\-基于首尾帧(`含音频`)
|
||
通过指定视频的起始和结束图片,模型即可生成流畅衔接首、尾帧的视频,实现画面间自然、连贯的过渡效果。
|
||
Seedance 1.5 pro 可通过设置参数 **generate_audio** 为 `true`,生成有声视频。
|
||
|
||
<span aceTableMode="list" aceTableWidth="2,3,3,3"></span>
|
||
|提示词 |首帧 |尾帧 |输出 |
|
||
|---|---|---|---|
|
||
|图中女孩对着镜头说“茄子”,360度环绕运镜 |<span> </span> |<span> </span> |<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ca99026747b148c2bd06b3bcc09fc717~tplv-goo7wpa0wc-image.image" controls></video>|\
|
||
| | | | |
|
||
|
||
|
||
```mixin-react
|
||
return (<Tabs>
|
||
<Tabs.TabPane title="Python" key="NbK0rdnFut"><RenderMd content={`\`\`\`Python
|
||
import os
|
||
import time
|
||
# Install SDK: pip install 'volcengine-python-sdk[ark]'
|
||
from volcenginesdkarkruntime import Ark
|
||
|
||
# Make sure that you have stored the API Key in the environment variable ARK_API_KEY
|
||
# Initialize the Ark client to read your API Key from an environment variable
|
||
client = Ark(
|
||
# This is the default path. You can configure it based on the service location
|
||
base_url="https://ark.cn-beijing.volces.com/api/v3",
|
||
# Get API Key:https://console.volcengine.com/ark/region:ark+cn-beijing/apikey
|
||
api_key=os.environ.get("ARK_API_KEY"),
|
||
)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
print("----- create request -----")
|
||
create_result = client.content_generation.tasks.create(
|
||
model="doubao-seedance-1-5-pro-251215", # Replace with Model ID
|
||
content=[
|
||
{
|
||
# Combination of text prompt and parameters
|
||
"type": "text",
|
||
"text": "图中女孩对着镜头说\\"茄子\\",360度环绕运镜"
|
||
},
|
||
{
|
||
# The URL of the first frame image
|
||
"type": "image_url",
|
||
"image_url": {
|
||
"url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/seepro_first_frame.jpeg"
|
||
},
|
||
"role": "first_frame"
|
||
},
|
||
{
|
||
# The URL of the last frame image
|
||
"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,
|
||
watermark=False,
|
||
)
|
||
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)
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Java" key="wjhclBC1yd"><RenderMd content={`\`\`\`Java
|
||
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 {
|
||
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
|
||
// Initialize the Ark client to read your API Key from an environment variable
|
||
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://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation
|
||
.dispatcher(dispatcher)
|
||
.connectionPool(connectionPool)
|
||
.apiKey(apiKey)
|
||
.build();
|
||
|
||
public static void main(String[] args) {
|
||
String model = "doubao-seedance-1-5-pro-251215"; // Replace with Model ID
|
||
Boolean generateAudio = true;
|
||
String ratio = "adaptive";
|
||
Long duration = 5L;
|
||
Boolean watermark = false;
|
||
System.out.println("----- create request -----");
|
||
List<Content> contents = new ArrayList<>();
|
||
|
||
// Combination of text prompt and parameters
|
||
contents.add(Content.builder()
|
||
.type("text")
|
||
.text("图中女孩对着镜头说“茄子”,360度环绕运镜")
|
||
.build());
|
||
// The URL of the first frame image
|
||
contents.add(Content.builder()
|
||
.type("image_url")
|
||
.imageUrl(CreateContentGenerationTaskRequest.ImageUrl.builder()
|
||
.url("https://ark-project.tos-cn-beijing.volces.com/doc_image/seepro_first_frame.jpeg")
|
||
.build())
|
||
.role("first_frame")
|
||
.build());
|
||
|
||
// The URL of the last frame image
|
||
contents.add(Content.builder()
|
||
.type("image_url")
|
||
.imageUrl(CreateContentGenerationTaskRequest.ImageUrl.builder()
|
||
.url("https://ark-project.tos-cn-beijing.volces.com/doc_image/seepro_last_frame.jpeg")
|
||
.build())
|
||
.role("last_frame")
|
||
.build());
|
||
|
||
// Create a video generation task
|
||
CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
|
||
.model(model)
|
||
.content(contents)
|
||
.generateAudio(generateAudio)
|
||
.ratio(ratio)
|
||
.duration(duration)
|
||
.watermark(watermark)
|
||
.build();
|
||
|
||
CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
|
||
System.out.println(createResult);
|
||
|
||
// Get the details of the task
|
||
String taskId = createResult.getId();
|
||
GetContentGenerationTaskRequest getRequest = GetContentGenerationTaskRequest.builder()
|
||
.taskId(taskId)
|
||
.build();
|
||
|
||
// Polling query section
|
||
System.out.println("----- polling task status -----");
|
||
while (true) {
|
||
try {
|
||
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 -----");
|
||
System.out.println("Error: " + getResponse.getStatus());
|
||
break;
|
||
} else {
|
||
System.out.printf("Current status: %s, Retrying in 10 seconds...", status);
|
||
TimeUnit.SECONDS.sleep(10);
|
||
}
|
||
} catch (InterruptedException ie) {
|
||
Thread.currentThread().interrupt();
|
||
System.err.println("Polling interrupted");
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Go" key="bN2QSjlDBA"><RenderMd content={`\`\`\`Go
|
||
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() {
|
||
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
|
||
// Initialize the Ark client to read your API Key from an environment variable
|
||
client := arkruntime.NewClientWithApiKey(
|
||
// Get your API Key from the environment variable. This is the default mode and you can modify it as required
|
||
os.Getenv("ARK_API_KEY"),
|
||
// The base URL for model invocation
|
||
arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"),
|
||
)
|
||
ctx := context.Background()
|
||
// Replace with Model ID
|
||
modelEp := "doubao-seedance-1-5-pro-251215"
|
||
|
||
// Generate a task
|
||
fmt.Println("----- create request -----")
|
||
createReq := model.CreateContentGenerationTaskRequest{
|
||
Model: modelEp,
|
||
GenerateAudio: volcengine.Bool(true),
|
||
Ratio: volcengine.String("adaptive"),
|
||
Duration: volcengine.Int64(5),
|
||
Watermark: volcengine.Bool(false),
|
||
Content: []*model.CreateContentGenerationContentItem{
|
||
{
|
||
// Combination of text prompt and parameters
|
||
Type: model.ContentGenerationContentItemTypeText,
|
||
Text: volcengine.String("图中女孩对着镜头说“茄子”,360度环绕运镜"),
|
||
},
|
||
{
|
||
// The URL of the first frame image
|
||
Type: model.ContentGenerationContentItemTypeImage,
|
||
ImageURL: &model.ImageURL{
|
||
URL: "https://ark-project.tos-cn-beijing.volces.com/doc_image/seepro_first_frame.jpeg",
|
||
},
|
||
Role: volcengine.String("first_frame"),
|
||
},
|
||
{
|
||
// The URL of the last frame image
|
||
Type: model.ContentGenerationContentItemTypeImage,
|
||
ImageURL: &model.ImageURL{
|
||
URL: "https://ark-project.tos-cn-beijing.volces.com/doc_image/seepro_last_frame.jpeg",
|
||
},
|
||
Role: volcengine.String("last_frame"),
|
||
},
|
||
},
|
||
}
|
||
createResp, err := client.CreateContentGenerationTask(ctx, createReq)
|
||
if err != nil {
|
||
fmt.Printf("create content generation error: %v", err)
|
||
return
|
||
}
|
||
taskID := createResp.ID
|
||
fmt.Printf("Task Created with ID: %s", taskID)
|
||
|
||
// Polling query section
|
||
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", 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", getResp.CreatedAt, getResp.UpdatedAt)
|
||
return
|
||
} else if status == "failed" {
|
||
fmt.Println("----- task failed -----")
|
||
if getResp.Error != nil {
|
||
fmt.Printf("Error Code: %s, Message: %s", getResp.Error.Code, getResp.Error.Message)
|
||
}
|
||
return
|
||
} else {
|
||
fmt.Printf("Current status: %s, Retrying in 10 seconds... \\n", status)
|
||
time.Sleep(10 * time.Second)
|
||
}
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane></Tabs>);
|
||
```
|
||
|
||
<span id="c5f5f577"></span>
|
||
## 图生视频\-基于参考图
|
||
模型能精准提取参考图片(支持输入1\-4张)中各类对象的关键特征,并依据这些特征在视频生成过程中高度还原对象的形态、色彩和纹理等细节,确保生成的视频与参考图的视觉风格一致。
|
||
|
||
<span aceTableMode="list" aceTableWidth="1,1,1,1,2"></span>
|
||
|提示词 |参考图1 |参考图2 |参考图3 |输出 |
|
||
|---|---|---|---|---|
|
||
|[图1]戴着眼镜穿着蓝色T恤的男生和[图2]的柯基小狗,坐在[图3]的草坪上,视频卡通风格 |<span> </span> |<span> </span> |<span> </span> |<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/489a331a1d6c4966adcb343f3d19faf3~tplv-goo7wpa0wc-image.image" controls></video>|\
|
||
| | | | | |
|
||
|
||
|
||
```mixin-react
|
||
return (<Tabs>
|
||
<Tabs.TabPane title="Python" key="A067ekxtBn"><RenderMd content={`\`\`\`Python
|
||
import os
|
||
import time
|
||
# Install SDK: pip install 'volcengine-python-sdk[ark]'
|
||
from volcenginesdkarkruntime import Ark
|
||
|
||
# Make sure that you have stored the API Key in the environment variable ARK_API_KEY
|
||
# Initialize the Ark client to read your API Key from an environment variable
|
||
client = Ark(
|
||
# This is the default path. You can configure it based on the service location
|
||
base_url="https://ark.cn-beijing.volces.com/api/v3",
|
||
# Get API Key:https://console.volcengine.com/ark/region:ark+cn-beijing/apikey
|
||
api_key=os.environ.get("ARK_API_KEY"),
|
||
)
|
||
|
||
if __name__ == "__main__":
|
||
print("----- create request -----")
|
||
try:
|
||
create_result = client.content_generation.tasks.create(
|
||
model="doubao-seedance-1-0-lite-i2v-250428", # Replace with Model ID
|
||
content=[
|
||
{
|
||
# Combination of text prompt and parameters
|
||
"type": "text",
|
||
"text": "[图1]戴着眼镜穿着蓝色T恤的男生和[图2]的柯基小狗,坐在[图3]的草坪上,视频卡通风格"
|
||
},
|
||
{
|
||
# The URL of the first reference image
|
||
# 1-4 reference images need to be provided
|
||
"type": "image_url",
|
||
"image_url": {
|
||
"url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/seelite_ref_1.png"
|
||
},
|
||
"role": "reference_image"
|
||
},
|
||
{
|
||
# The URL of the second reference image
|
||
"type": "image_url",
|
||
"image_url": {
|
||
"url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/seelite_ref_2.png"
|
||
},
|
||
"role": "reference_image"
|
||
},
|
||
{
|
||
# The URL of the third reference image
|
||
"type": "image_url",
|
||
"image_url": {
|
||
"url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/seelite_ref_3.png"
|
||
},
|
||
"role": "reference_image"
|
||
}
|
||
],
|
||
ratio="16:9",
|
||
duration=5,
|
||
watermark=False,
|
||
)
|
||
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)
|
||
except Exception as e:
|
||
print(f"An error occurred: {e}")
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Java" key="vHX8r5Vj6R"><RenderMd content={`\`\`\`Java
|
||
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 {
|
||
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
|
||
// Initialize the Ark client to read your API Key from an environment variable
|
||
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://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation
|
||
.dispatcher(dispatcher)
|
||
.connectionPool(connectionPool)
|
||
.apiKey(apiKey)
|
||
.build();
|
||
|
||
public static void main(String[] args) {
|
||
String model = "doubao-seedance-1-0-lite-i2v-250428"; // Replace with Model ID
|
||
String ratio = "16:9";
|
||
Long duration = 5L;
|
||
Boolean watermark = false;
|
||
System.out.println("----- create request -----");
|
||
List<Content> contents = new ArrayList<>();
|
||
|
||
// Combination of text prompt and parameters
|
||
contents.add(Content.builder()
|
||
.type("text")
|
||
.text("[图1]戴着眼镜穿着蓝色T恤的男生和[图2]的柯基小狗,坐在[图3]的草坪上,视频卡通风格")
|
||
.build());
|
||
// The URL of the first reference image
|
||
contents.add(Content.builder()
|
||
.type("image_url")
|
||
.imageUrl(CreateContentGenerationTaskRequest.ImageUrl.builder()
|
||
.url("https://ark-project.tos-cn-beijing.volces.com/doc_image/seelite_ref_1.png")
|
||
.build())
|
||
.role("reference_image")
|
||
.build());
|
||
// The URL of the second reference image
|
||
contents.add(Content.builder()
|
||
.type("image_url")
|
||
.imageUrl(CreateContentGenerationTaskRequest.ImageUrl.builder()
|
||
.url("https://ark-project.tos-cn-beijing.volces.com/doc_image/seelite_ref_2.png")
|
||
.build())
|
||
.role("reference_image")
|
||
.build());
|
||
// The URL of the third reference image
|
||
contents.add(Content.builder()
|
||
.type("image_url")
|
||
.imageUrl(CreateContentGenerationTaskRequest.ImageUrl.builder()
|
||
.url("https://ark-project.tos-cn-beijing.volces.com/doc_image/seelite_ref_3.png")
|
||
.build())
|
||
.role("reference_image")
|
||
.build());
|
||
|
||
// Create a video generation task
|
||
CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
|
||
.model(model)
|
||
.content(contents)
|
||
.ratio(ratio)
|
||
.duration(duration)
|
||
.watermark(watermark)
|
||
.build();
|
||
|
||
CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
|
||
System.out.println(createResult);
|
||
|
||
// Get the details of the task
|
||
String taskId = createResult.getId();
|
||
GetContentGenerationTaskRequest getRequest = GetContentGenerationTaskRequest.builder()
|
||
.taskId(taskId)
|
||
.build();
|
||
|
||
// Polling query section
|
||
System.out.println("----- polling task status -----");
|
||
while (true) {
|
||
try {
|
||
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 -----");
|
||
System.out.println("Error: " + getResponse.getStatus());
|
||
break;
|
||
} else {
|
||
System.out.printf("Current status: %s, Retrying in 10 seconds...", status);
|
||
TimeUnit.SECONDS.sleep(10);
|
||
}
|
||
} catch (InterruptedException ie) {
|
||
Thread.currentThread().interrupt();
|
||
System.err.println("Polling interrupted");
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Go" key="cA15jN1HMM"><RenderMd content={`\`\`\`Go
|
||
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() {
|
||
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
|
||
// Initialize the Ark client to read your API Key from an environment variable
|
||
client := arkruntime.NewClientWithApiKey(
|
||
// Get your API Key from the environment variable. This is the default mode and you can modify it as required
|
||
os.Getenv("ARK_API_KEY"),
|
||
// The base URL for model invocation
|
||
arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"),
|
||
)
|
||
ctx := context.Background()
|
||
// Replace with Model ID
|
||
modelEp := "doubao-seedance-1-0-lite-i2v-250428"
|
||
|
||
// Generate a task
|
||
fmt.Println("----- create request -----")
|
||
createReq := model.CreateContentGenerationTaskRequest{
|
||
Model: modelEp,
|
||
Ratio: volcengine.String("16:9"),
|
||
Duration: volcengine.Int64(5),
|
||
Watermark: volcengine.Bool(false),
|
||
Content: []*model.CreateContentGenerationContentItem{
|
||
{
|
||
// Combination of text prompt and parameters
|
||
Type: model.ContentGenerationContentItemTypeText,
|
||
Text: volcengine.String("[图1]戴着眼镜穿着蓝色T恤的男生和[图2]的柯基小狗,坐在[图3]的草坪上,视频卡通风格"),
|
||
},
|
||
{
|
||
// The URL of the first reference image
|
||
// # 1-4 reference images need to be provided
|
||
Type: model.ContentGenerationContentItemTypeImage,
|
||
ImageURL: &model.ImageURL{
|
||
URL: "https://ark-project.tos-cn-beijing.volces.com/doc_image/seelite_ref_1.png",
|
||
},
|
||
Role: volcengine.String("reference_image"),
|
||
},
|
||
{
|
||
// The URL of the second reference image
|
||
Type: model.ContentGenerationContentItemTypeImage,
|
||
ImageURL: &model.ImageURL{
|
||
URL: "https://ark-project.tos-cn-beijing.volces.com/doc_image/seelite_ref_2.png",
|
||
},
|
||
Role: volcengine.String("reference_image"),
|
||
},
|
||
{
|
||
// The URL of the third reference image
|
||
Type: model.ContentGenerationContentItemTypeImage,
|
||
ImageURL: &model.ImageURL{
|
||
URL: "https://ark-project.tos-cn-beijing.volces.com/doc_image/seelite_ref_3.png",
|
||
},
|
||
Role: volcengine.String("reference_image"),
|
||
},
|
||
},
|
||
}
|
||
|
||
createResp, err := client.CreateContentGenerationTask(ctx, createReq)
|
||
if err != nil {
|
||
fmt.Printf("create content generation error: %v", err)
|
||
return
|
||
}
|
||
taskID := createResp.ID
|
||
fmt.Printf("Task Created with ID: %s", taskID)
|
||
|
||
// Polling query section
|
||
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", 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", getResp.CreatedAt, getResp.UpdatedAt)
|
||
return
|
||
} else if status == "failed" {
|
||
fmt.Println("----- task failed -----")
|
||
if getResp.Error != nil {
|
||
fmt.Printf("Error Code: %s, Message: %s", getResp.Error.Code, getResp.Error.Message)
|
||
}
|
||
return
|
||
} else {
|
||
fmt.Printf("Current status: %s, Retrying in 10 seconds... \\n", status)
|
||
time.Sleep(10 * time.Second)
|
||
}
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane></Tabs>);
|
||
```
|
||
|
||
<span id="68fd42bf"></span>
|
||
## 管理视频任务
|
||
<span id="360a1a86"></span>
|
||
### 查询视频生成任务列表
|
||
该接口支持传入条件筛选参数,以查询符合条件的视频生成任务列表。
|
||
|
||
```mixin-react
|
||
return (<Tabs>
|
||
<Tabs.TabPane title="Curl" key="QxHAvY6Phh"><RenderMd content={`\`\`\`Bash
|
||
curl https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks?page_size=2&filter.status=succeeded& \\
|
||
-H "Content-Type: application/json" \\
|
||
-H "Authorization: Bearer $ARK_API_KEY"
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Python" key="xvfBJkdSMf"><RenderMd content={`\`\`\`Python
|
||
import os
|
||
from volcenginesdkarkruntime import Ark
|
||
|
||
client = Ark(api_key=os.environ.get("ARK_API_KEY"))
|
||
|
||
if __name__ == "__main__":
|
||
resp = client.content_generation.tasks.list(
|
||
page_size=3,
|
||
status="succeeded",
|
||
)
|
||
print(resp)
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Java" key="uyVqVPAfg2"><RenderMd content={`\`\`\`Java
|
||
package com.ark.sample;
|
||
|
||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||
import com.volcengine.ark.runtime.model.content.generation.ListContentGenerationTasksRequest;
|
||
import com.volcengine.ark.runtime.service.ArkService;
|
||
import java.util.concurrent.TimeUnit;
|
||
import okhttp3.ConnectionPool;
|
||
import okhttp3.Dispatcher;
|
||
|
||
|
||
public class Sample {
|
||
|
||
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()
|
||
.dispatcher(dispatcher)
|
||
.connectionPool(connectionPool)
|
||
.apiKey(apiKey)
|
||
.build();
|
||
|
||
public static void main(String[] args) throws JsonProcessingException {
|
||
|
||
ListContentGenerationTasksRequest req =
|
||
ListContentGenerationTasksRequest.builder().pageSize(3).status("succeeded").build();
|
||
|
||
service.listContentGenerationTasks(req).toString();
|
||
System.out.println(service.getContentGenerationTask(req));
|
||
|
||
// shutdown service after all requests is finished
|
||
service.shutdownExecutor();
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Go" key="WEQqkjtJQG"><RenderMd content={`\`\`\`Go
|
||
package main
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"os"
|
||
|
||
"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() {
|
||
client := arkruntime.NewClientWithApiKey(os.Getenv("ARK_API_KEY"))
|
||
ctx := context.Background()
|
||
|
||
req := model.ListContentGenerationTasksRequest{
|
||
PageSize: volcengine.Int(3),
|
||
Filter: &model.ListContentGenerationTasksFilter{
|
||
Status: volcengine.String("succeeded"),
|
||
},
|
||
}
|
||
|
||
resp, err := client.ListContentGenerationTasks(ctx, req)
|
||
if err != nil {
|
||
fmt.Printf("failed to list content generation tasks: %v\\n", err)
|
||
return
|
||
}
|
||
fmt.Printf("%+v\\n", resp)
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane></Tabs>);
|
||
```
|
||
|
||
<span id="64914c89"></span>
|
||
### 删除或取消视频生成任务
|
||
取消排队中的视频生成任务,或者删除视频生成任务记录。
|
||
|
||
```mixin-react
|
||
return (<Tabs>
|
||
<Tabs.TabPane title="Curl" key="pcSYFHFPIW"><RenderMd content={`\`\`\`Bash
|
||
# Replace cgt-2025**** with the ID acquired from "Create Video Generation Task".
|
||
|
||
curl -X DELETE https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/cgt-2025**** \\
|
||
-H "Content-Type: application/json" \\
|
||
-H "Authorization: Bearer $ARK_API_KEY"
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Python" key="FFuaXAvSPo"><RenderMd content={`\`\`\`Python
|
||
import os
|
||
from volcenginesdkarkruntime import Ark
|
||
|
||
client = Ark(api_key=os.environ.get("ARK_API_KEY"))
|
||
|
||
if __name__ == "__main__":
|
||
try:
|
||
client.content_generation.tasks.delete(
|
||
task_id="cgt-2025****",
|
||
)
|
||
except Exception as e:
|
||
print(f"failed to delete task: {e}")
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Java" key="zRP4j5bXE9"><RenderMd content={`\`\`\`Java
|
||
package com.ark.sample;
|
||
|
||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||
import com.volcengine.ark.runtime.model.content.generation.DeleteContentGenerationTaskRequest;
|
||
import com.volcengine.ark.runtime.service.ArkService;
|
||
import java.util.concurrent.TimeUnit;
|
||
import okhttp3.ConnectionPool;
|
||
import okhttp3.Dispatcher;
|
||
|
||
public class Sample {
|
||
|
||
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()
|
||
.dispatcher(dispatcher)
|
||
.connectionPool(connectionPool)
|
||
.apiKey(apiKey)
|
||
.build();
|
||
|
||
public static void main(String[] args) throws JsonProcessingException {
|
||
|
||
DeleteContentGenerationTaskRequest req =
|
||
DeleteContentGenerationTaskRequest.builder()
|
||
.taskId("cgt-2025****")
|
||
.build();
|
||
|
||
service.deleteContentGenerationTask(req).toString();
|
||
|
||
service.shutdownExecutor();
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Go" key="BofVIYmGlW"><RenderMd content={`\`\`\`Go
|
||
package main
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"os"
|
||
|
||
"github.com/volcengine/volcengine-go-sdk/service/arkruntime"
|
||
"github.com/volcengine/volcengine-go-sdk/service/arkruntime/model"
|
||
)
|
||
|
||
|
||
func main() {
|
||
client := arkruntime.NewClientWithApiKey(os.Getenv("ARK_API_KEY"))
|
||
ctx := context.Background()
|
||
|
||
req := model.DeleteContentGenerationTaskRequest{
|
||
ID: "cgt-2025****",
|
||
}
|
||
err := client.DeleteContentGenerationTask(ctx, req)
|
||
if err != nil {
|
||
fmt.Printf("delete content generation task error: %v\\n", err)
|
||
return
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane></Tabs>);
|
||
```
|
||
|
||
<span id="9fe4cce0"></span>
|
||
## 设置视频输出规格【New】
|
||
支持通过 **resolution、ratio、duration、frames、seed、camera_fixed、watermark** 参数控制视频输出的规格。
|
||
:::warning
|
||
不同模型,可能对应支持不同的参数与取值,详见下方表格。当输入的参数或取值不符合所选的模型时,该参数将被忽略或触发报错。
|
||
|
||
* **新方式:** 在 request body 中直接传入参数。此方式为**强校验,** 若参数填写错误,模型会返回错误提示。
|
||
* **旧方式:** 在文本提示词后追加 \-\-[parameters]。此方式为**弱校验,** 若参数填写错误,模型将自动使用默认值且不会报错。
|
||
:::
|
||
* **新方式(推荐):在 request body 中直接传入参数**
|
||
|
||
```JSON
|
||
...
|
||
// Strongly recommended
|
||
// Specify the aspect ratio of the generated video as 16:9, duration as 5 seconds, resolution as 720p, seed as 11, and include a watermark. The camera is not fixed.
|
||
"model": "doubao-seedance-1-5-pro-251215",
|
||
"content": [
|
||
{
|
||
"type": "text",
|
||
"text": "小猫对着镜头打哈欠"
|
||
}
|
||
],
|
||
// All parameters must be written in full; abbreviations are not supported
|
||
"resolution": "720p",
|
||
"ratio":"16:9",
|
||
"duration": 5,
|
||
// "frames": 29, Either duration or frames is required
|
||
"seed": 11,
|
||
"camera_fixed": false,
|
||
"watermark": true
|
||
...
|
||
```
|
||
|
||
|
||
* **旧方式:在文本提示词后追加** **\-\-[parameters]**
|
||
|
||
```JSON
|
||
...
|
||
// Specify the aspect ratio of the generated video as 16:9, duration as 5 seconds, resolution as 720p, seed as 11, and include a watermark. The camera is not fixed.
|
||
"content": [
|
||
{
|
||
"type": "text",
|
||
"text": "小猫对着镜头打哈欠 --rs 720p --rt 16:9 --dur 5 --seed 11 --cf false --wm true"
|
||
// "text": "小猫对着镜头打哈欠 --resolution 720p --ratio 16:9 --duration 5 --seed 11 --camerafixed false --watermark true"
|
||
}
|
||
]
|
||
...
|
||
```
|
||
|
||
|
||
<span aceTableMode="list" aceTableWidth="2,4,4,4"></span>
|
||
| |doubao\-seedance\-1\-5\-pro |doubao\-seedance\-1\-0\-pro|doubao\-seedance\-1\-0\-lite\-t2v|\
|
||
| | |doubao\-seedance\-1\-0\-pro\-fast |doubao\-seedance\-1\-0\-lite\-i2v |
|
||
|---|---|---|---|
|
||
|resolution|* 480p|* 480p|* 480p|\
|
||
|分辨率 |* 720p|* 720p|* 720p|\
|
||
| |* 1080p |* 1080p |* 1080p`参考图场景不支持` |
|
||
|ratio|* 16:9|* 16:9|* 16:9|\
|
||
|宽高比 |* 4:3|* 4:3|* 4:3|\
|
||
| |* 1:1|* 1:1|* 1:1|\
|
||
| |* 3:4|* 3:4|* 3:4|\
|
||
| |* 9:16|* 9:16|* 9:16|\
|
||
| |* 21:9|* 21:9|* 21:9|\
|
||
| |* adaptive|* adaptive`文生视频场景不支持`|* adaptive`参考图和文生视频场景不支持`|\
|
||
| ||||\
|
||
| ||||\
|
||
| |---|---|---|\
|
||
| ||||\
|
||
| ||||\
|
||
| |480p 各画面比例的宽高像素值如下|480p 各画面比例的宽高像素值如下|480p 各画面比例的宽高像素值如下|\
|
||
| ||||\
|
||
| |* `16:9`:864×496|* `16:9`:864×480|* `16:9`:864×480|\
|
||
| |* `4:3`:752×560|* `4:3`:736×544|* `4:3`:736×544|\
|
||
| |* `1:1`:640×640|* `1:1`:640×640|* `1:1`:640×640|\
|
||
| |* `3:4`:560×752|* `3:4`:544×736|* `3:4`:544×736|\
|
||
| |* `9:16`:496×864|* `9:16`:480×864|* `9:16`:480×864|\
|
||
| |* `21:9`:992×432|* `21:9`:960×416|* `21:9`:960×416|\
|
||
| ||||\
|
||
| ||||\
|
||
| |---|---|---|\
|
||
| ||||\
|
||
| ||||\
|
||
| |720p 各画面比例的宽高像素值如下|720p 各画面比例的宽高像素值如下|720p 各画面比例的宽高像素值如下|\
|
||
| ||||\
|
||
| |* `16:9`:1280×720|* `16:9`:1248×704|* `16:9`:1248×704|\
|
||
| |* `4:3`:1112×834|* `4:3`:1120×832|* `4:3`:1120×832|\
|
||
| |* `1:1`:960×960|* `1:1`:960×960|* `1:1`:960×960|\
|
||
| |* `3:4`:834×1112|* `3:4`:832×1120|* `3:4`:832×1120|\
|
||
| |* `9:16`:720×1280|* `9:16`:704×1248|* `9:16`:704×1248|\
|
||
| |* `21:9`:1470×630|* `21:9`:1504×640|* `21:9`:1504×640|\
|
||
| ||||\
|
||
| ||||\
|
||
| |---|---|---|\
|
||
| ||||\
|
||
| ||||\
|
||
| |1080p 各画面比例的宽高像素值如下|1080p 各画面比例的宽高像素值如下|1080p 各画面比例的宽高像素值如下`参考图场景不支持`|\
|
||
| ||||\
|
||
| |* `16:9`:1920×1080|* `16:9`:1920×1088|* `16:9`:1920×1088|\
|
||
| |* `4:3`:1664×1248|* `4:3`:1664×1248|* `4:3`:1664×1248|\
|
||
| |* `1:1`:1440×1440|* `1:1`:1440×1440|* `1:1`:1440×1440|\
|
||
| |* `3:4`:1248×1664|* `3:4`:1248×1664|* `3:4`:1248×1664|\
|
||
| |* `9:16`:1080×1920|* `9:16`:1088×1920|* `9:16`:1088×1920|\
|
||
| |* `21:9`:2206×946 |* `21:9`:2176×928 |* `21:9`:2176×928 |
|
||
|duration|4 ~12 秒 |2 ~12 秒 |2 ~12 秒 |\
|
||
|生成视频时长(秒) | | | |
|
||
|frames|<span> </span> |支持 [29, 289] 区间内所有满足 25 + 4n 格式的整数值,其中 n 为正整数。 |支持 [29, 289] 区间内所有满足 25 + 4n 格式的整数值,其中 n 为正整数。 |\
|
||
|生成视频帧数 | | | |
|
||
|seed|<span> </span> |<span> </span> |<span> </span> |\
|
||
|种子整数 | | | |
|
||
|camera_fixed|<span> </span> |<span> </span> |<span> </span>|\
|
||
|是否固定摄像头 | | |`参考图场景不支持` |
|
||
|watermark|<span> </span> |<span> </span> |<span> </span> |\
|
||
|是否包含水印 | | | |
|
||
|
||
<span id="44236b6a"></span>
|
||
## 提示词建议
|
||
|
||
* **提示词 = 主体 + 运动, 背景 + 运动,镜头 + 运动 ...**
|
||
* 用简洁准确的自然语言写出你想要的效果。
|
||
* 如果有较为明确的效果预期,建议先用生图模型生成符合预期的图片,再用图生视频进行视频片段的生成。
|
||
* 文生视频会有较大的结果随机性,可以用于激发创作灵感
|
||
* 图生视频时请尽量上传高清高质量的图片,上传图片的质量对图生视频影响较大。
|
||
* 当生成的视频不符合预期时,建议修改提示词,将抽象描述换成具象描述,并注意删除不重要的部分,将重要内容前置。
|
||
* 更多提示词的使用技巧请参见 [Seedance-1.5-pro 提示词指南](/docs/82379/2168087)、[Seedance-1.0-pro&pro-fast 提示词指南](/docs/82379/1631633)、 [Seedance-1.0-lite 提示词指南](/docs/82379/1587797)。
|
||
|
||
<span id="e190e738"></span>
|
||
# 进阶使用
|
||
<span id="c3588bd1"></span>
|
||
## 离线推理
|
||
针对推理时延敏感度低(例如小时级响应)的场景,建议将 **service_tier** 设为 `flex`,一键切换至离线推理模式——价格仅为在线推理的 50%,显著降低业务成本。
|
||
注意根据业务场景设置合适的超时时间,超过该时间后任务将自动终止。
|
||
|
||
```mixin-react
|
||
return (<Tabs>
|
||
<Tabs.TabPane title="Python" key="FxnmuCZe0F"><RenderMd content={`\`\`\`Python
|
||
import os
|
||
import time
|
||
# Install SDK: pip install 'volcengine-python-sdk[ark]'
|
||
from volcenginesdkarkruntime import Ark
|
||
|
||
# Make sure that you have stored the API Key in the environment variable ARK_API_KEY
|
||
# Initialize the Ark client to read your API Key from an environment variable
|
||
client = Ark(
|
||
# This is the default path. You can configure it based on the service location
|
||
base_url="https://ark.cn-beijing.volces.com/api/v3",
|
||
# Get API Key:https://console.volcengine.com/ark/region:ark+cn-beijing/apikey
|
||
api_key=os.environ.get("ARK_API_KEY"),
|
||
)
|
||
|
||
if __name__ == "__main__":
|
||
print("----- create request -----")
|
||
create_result = client.content_generation.tasks.create(
|
||
model="doubao-seedance-1-5-pro-251215", # Replace with Model ID
|
||
content=[
|
||
{
|
||
# Combination of text prompt and parameters
|
||
"type": "text",
|
||
"text": "女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动"
|
||
},
|
||
{
|
||
# The URL of the first frame image
|
||
"type": "image_url",
|
||
"image_url": {
|
||
"url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png"
|
||
}
|
||
}
|
||
],
|
||
ratio="adaptive",
|
||
duration=5,
|
||
watermark=False,
|
||
service_tier="flex",
|
||
execution_expires_after=172800,
|
||
)
|
||
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 60 seconds...")
|
||
time.sleep(60)
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Java" key="w8VwFFAPaU"><RenderMd content={`\`\`\`Java
|
||
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 {
|
||
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
|
||
// Initialize the Ark client to read your API Key from an environment variable
|
||
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://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation
|
||
.dispatcher(dispatcher)
|
||
.connectionPool(connectionPool)
|
||
.apiKey(apiKey)
|
||
.build();
|
||
|
||
public static void main(String[] args) {
|
||
String model = "doubao-seedance-1-5-pro-251215"; // Replace with Model ID
|
||
String ratio = "adaptive";
|
||
Long duration = 5L;
|
||
Boolean watermark = false;
|
||
String serviceTier = "flex";
|
||
Long executionExpiresAfter = 172800L;
|
||
System.out.println("----- create request -----");
|
||
List<Content> contents = new ArrayList<>();
|
||
|
||
// Combination of text prompt and parameters
|
||
contents.add(Content.builder()
|
||
.type("text")
|
||
.text("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动")
|
||
.build());
|
||
// The URL of the first frame image
|
||
contents.add(Content.builder()
|
||
.type("image_url")
|
||
.imageUrl(CreateContentGenerationTaskRequest.ImageUrl.builder()
|
||
.url("https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png")
|
||
.build())
|
||
.build());
|
||
|
||
// Create a video generation task
|
||
CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
|
||
.model(model)
|
||
.content(contents)
|
||
.ratio(ratio)
|
||
.duration(duration)
|
||
.watermark(watermark)
|
||
.serviceTier(serviceTier)
|
||
.executionExpiresAfter(executionExpiresAfter)
|
||
.build();
|
||
|
||
CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
|
||
System.out.println(createResult);
|
||
|
||
// Get the details of the task
|
||
String taskId = createResult.getId();
|
||
GetContentGenerationTaskRequest getRequest = GetContentGenerationTaskRequest.builder()
|
||
.taskId(taskId)
|
||
.build();
|
||
|
||
// Polling query section
|
||
System.out.println("----- polling task status -----");
|
||
while (true) {
|
||
try {
|
||
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 -----");
|
||
System.out.println("Error: " + getResponse.getStatus());
|
||
break;
|
||
} else {
|
||
System.out.printf("Current status: %s, Retrying in 60 seconds...", status);
|
||
TimeUnit.SECONDS.sleep(60);
|
||
}
|
||
} catch (InterruptedException ie) {
|
||
Thread.currentThread().interrupt();
|
||
System.err.println("Polling interrupted");
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Go" key="aS5odaF5rN"><RenderMd content={`\`\`\`Go
|
||
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() {
|
||
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
|
||
// Initialize the Ark client to read your API Key from an environment variable
|
||
client := arkruntime.NewClientWithApiKey(
|
||
// Get your API Key from the environment variable. This is the default mode and you can modify it as required
|
||
os.Getenv("ARK_API_KEY"),
|
||
// The base URL for model invocation
|
||
arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"),
|
||
)
|
||
ctx := context.Background()
|
||
// Replace with Model ID
|
||
modelEp := "doubao-seedance-1-5-pro-251215"
|
||
|
||
// Generate a task
|
||
fmt.Println("----- create request -----")
|
||
createReq := model.CreateContentGenerationTaskRequest{
|
||
Model: modelEp,
|
||
Ratio: volcengine.String("adaptive"),
|
||
Duration: volcengine.Int64(5),
|
||
Watermark: volcengine.Bool(false),
|
||
ServiceTier: volcengine.String("flex"),
|
||
ExecutionExpiresAfter: volcengine.Int64(172800),
|
||
Content: []*model.CreateContentGenerationContentItem{
|
||
{
|
||
// Combination of text prompt and parameters
|
||
Type: model.ContentGenerationContentItemTypeText,
|
||
Text: volcengine.String("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动"),
|
||
},
|
||
{
|
||
// The URL of the first frame image
|
||
Type: model.ContentGenerationContentItemTypeImage,
|
||
ImageURL: &model.ImageURL{
|
||
URL: "https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png",
|
||
},
|
||
},
|
||
},
|
||
}
|
||
createResp, err := client.CreateContentGenerationTask(ctx, createReq)
|
||
if err != nil {
|
||
fmt.Printf("create content generation error: %v", err)
|
||
return
|
||
}
|
||
taskID := createResp.ID
|
||
fmt.Printf("Task Created with ID: %s", taskID)
|
||
|
||
// Polling query section
|
||
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", 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", getResp.CreatedAt, getResp.UpdatedAt)
|
||
return
|
||
} else if status == "failed" {
|
||
fmt.Println("----- task failed -----")
|
||
if getResp.Error != nil {
|
||
fmt.Printf("Error Code: %s, Message: %s", getResp.Error.Code, getResp.Error.Message)
|
||
}
|
||
return
|
||
} else {
|
||
fmt.Printf("Current status: %s, Retrying in 60 seconds... \\n", status)
|
||
time.Sleep(60 * time.Second)
|
||
}
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane></Tabs>);
|
||
```
|
||
|
||
<span id="5acd28c8"></span>
|
||
## 样片模式
|
||
获得一个符合预期的生产级别视频,通常需要多次抽卡,耗时耗力。Draft 样片模式是平台推出的中间产物可视化功能,开启该功能后,将生成一段预览视频,帮助用户 **低成本验证** 生成视频的场景结构、镜头调度、主体动作与 Prompt 意图等关键要素是否符合预期,快速调整方向。确认符合预期后,再基于 Draft 视频生成最终的高质量视频。
|
||
|
||
<span aceTableMode="list" aceTableWidth="3,3,3"></span>
|
||
|输入 |Draft 视频 |正式视频 |
|
||
|---|---|---|
|
||
|<span> </span>|<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/1c92b2d2fb1749d28a21ad56d46bd2d1~tplv-goo7wpa0wc-image.image" controls></video>|<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/1aa51109dee44b8a9b263f713754dd40~tplv-goo7wpa0wc-image.image" controls></video>|\
|
||
|> 提示词:女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声 |||\
|
||
| |> 生成一段预览视频,低成本验证结果。 |> 复用 Draft 视频使用 **模型、提示词、输入图片、种子值、音频设置、视频宽高比、视频时长等** 生成正式视频,保证视频关键要素一致。 |
|
||
|
||
本功能使用分为两步:
|
||
<span id="13ae3900"></span>
|
||
### Step1: 生成 Draft 视频
|
||
|
||
1. 设置 `"draft": true`,调用`POST /contents/generations/tasks`接口创建 Draft 视频生成任务。
|
||
2. 调用`GET /contents/generations/tasks/{id}`接口查询生成状态和结果,下载 Draft 视频,确认是否符合预期。
|
||
|
||
:::tip
|
||
|
||
* 仅 Seedance 1.5 pro 支持该功能。
|
||
* 仅支持 480p 分辨率(使用其他分辨率会报错),不支持返回尾帧功能,不支持离线推理功能。
|
||
* Draft 视频的 token 单价不变,消耗的 token 更少。`Draft视频token用量 = 正常视频token用量 × 折算系数`,以 Seedance 1.5 pro 为例,有声视频的折算系数为 0.6,故生成一个 Draft 有声视频的价格是正常视频的 0.6 倍,显著降低了成本。
|
||
|
||
|
||
:::
|
||
```mixin-react
|
||
return (<Tabs>
|
||
<Tabs.TabPane title="Curl" key="b7pWB7Kiur"><RenderMd content={`1. 创建 Draft 视频生成任务。
|
||
|
||
\`\`\`Bash
|
||
curl https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \\
|
||
-H "Content-Type: application/json" \\
|
||
-H "Authorization: Bearer $ARK_API_KEY" \\
|
||
-d '{
|
||
"model": "doubao-seedance-1-5-pro-251215",
|
||
"content": [
|
||
{
|
||
"type": "text",
|
||
"text": "女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动"
|
||
},
|
||
{
|
||
"type": "image_url",
|
||
"image_url": {
|
||
"url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png"
|
||
}
|
||
}
|
||
],
|
||
"seed": 20,
|
||
"duration": 6,
|
||
"draft": true
|
||
}'
|
||
\`\`\`
|
||
|
||
请求成功后,系统将返回一个任务 ID。此 ID 即为 Draft 视频任务 ID,后续需基于这个 ID 生成最终视频。
|
||
|
||
2. 使用 Draft 视频任务 ID,查询生成状态和结果
|
||
|
||
\`\`\`Bash
|
||
# Replace cgt-2026****-pzjqb with the ID acquired from last step
|
||
|
||
curl https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/cgt-2026****-pzjqb \\
|
||
-H "Content-Type: application/json" \\
|
||
-H "Authorization: Bearer $ARK_API_KEY"
|
||
\`\`\`
|
||
|
||
当任务状态变为 succeeded 后,您可在 content.**video_url** 字段处,下载生成的 Draft 视频文件,检视效果是否符合预期。若不符合预期,可重新调整参数并再次创建 Draft 视频生成任务。当确认 Draft 视频效果符合预期后,即可按照后续步骤生成最终视频。
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Python" key="mGZzjBTzc9"><RenderMd content={`1. 创建 Draft 视频任务并轮询任务状态;
|
||
2. 当任务状态变为 \`succeeded\`后,您可在 content.**video_url** 字段处,下载生成的 Draft 视频文件,检视效果是否符合预期。若不符合预期,可重新调整参数并再次创建 Draft 视频生成任务。当确认 Draft 视频效果符合预期后,即可按照后续步骤生成最终视频。
|
||
|
||
\`\`\`Python
|
||
import os
|
||
import time
|
||
# Install SDK: pip install 'volcengine-python-sdk[ark]'
|
||
from volcenginesdkarkruntime import Ark
|
||
|
||
# Make sure that you have stored the API Key in the environment variable ARK_API_KEY
|
||
# Initialize the Ark client to read your API Key from an environment variable
|
||
client = Ark(
|
||
# This is the default path. You can configure it based on the service location
|
||
base_url="https://ark.cn-beijing.volces.com/api/v3",
|
||
# Get API Key:https://console.volcengine.com/ark/region:ark+cn-beijing/apikey
|
||
api_key=os.environ.get("ARK_API_KEY"),
|
||
)
|
||
|
||
if __name__ == "__main__":
|
||
print("----- create request -----")
|
||
create_result = client.content_generation.tasks.create(
|
||
model="doubao-seedance-1-5-pro-251215", # Replace with Model ID
|
||
content=[
|
||
{
|
||
# Combination of text prompt and parameters
|
||
"type": "text",
|
||
"text": "女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动"
|
||
},
|
||
{
|
||
# The URL of the first frame image
|
||
"type": "image_url",
|
||
"image_url": {
|
||
"url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png"
|
||
}
|
||
}
|
||
],
|
||
seed= 20,
|
||
duration= 6,
|
||
draft= True,
|
||
)
|
||
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)
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Java" key="APeJMCL5TZ"><RenderMd content={`1. 创建 Draft 视频任务并轮询任务状态;
|
||
2. 当任务状态变为 \`succeeded\`后,您可在 content.**video_url** 字段处,下载生成的 Draft 视频文件,检视效果是否符合预期。若不符合预期,可重新调整参数并再次创建 Draft 视频生成任务。当确认 Draft 视频效果符合预期后,即可按照后续步骤生成最终视频。
|
||
|
||
\`\`\`Java
|
||
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 {
|
||
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
|
||
// Initialize the Ark client to read your API Key from an environment variable
|
||
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://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation
|
||
.dispatcher(dispatcher)
|
||
.connectionPool(connectionPool)
|
||
.apiKey(apiKey)
|
||
.build();
|
||
|
||
public static void main(String[] args) {
|
||
String model = "doubao-seedance-1-5-pro-251215"; // Replace with Model ID
|
||
Long seed = 20L;
|
||
Long duration = 6L;
|
||
Boolean draft = true;
|
||
System.out.println("----- create request -----");
|
||
List<Content> contents = new ArrayList<>();
|
||
|
||
// Combination of text prompt and parameters
|
||
contents.add(Content.builder()
|
||
.type("text")
|
||
.text("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动")
|
||
.build());
|
||
// The URL of the first frame image
|
||
contents.add(Content.builder()
|
||
.type("image_url")
|
||
.imageUrl(CreateContentGenerationTaskRequest.ImageUrl.builder()
|
||
.url("https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png")
|
||
.build())
|
||
.build());
|
||
|
||
// Create a video generation task
|
||
CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
|
||
.model(model)
|
||
.content(contents)
|
||
.seed(seed)
|
||
.duration(duration)
|
||
.draft(draft)
|
||
.build();
|
||
|
||
CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
|
||
System.out.println(createResult);
|
||
|
||
// Get the details of the task
|
||
String taskId = createResult.getId();
|
||
GetContentGenerationTaskRequest getRequest = GetContentGenerationTaskRequest.builder()
|
||
.taskId(taskId)
|
||
.build();
|
||
|
||
// Polling query section
|
||
System.out.println("----- polling task status -----");
|
||
while (true) {
|
||
try {
|
||
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 -----");
|
||
System.out.println("Error: " + getResponse.getStatus());
|
||
break;
|
||
} else {
|
||
System.out.printf("Current status: %s, Retrying in 10 seconds...", status);
|
||
TimeUnit.SECONDS.sleep(10);
|
||
}
|
||
} catch (InterruptedException ie) {
|
||
Thread.currentThread().interrupt();
|
||
System.err.println("Polling interrupted");
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Go" key="SdHXO0O9i4"><RenderMd content={`1. 创建 Draft 视频任务并轮询任务状态;
|
||
2. 当任务状态变为 \`succeeded\`后,您可在 content.**video_url** 字段处,下载生成的 Draft 视频文件,检视效果是否符合预期。若不符合预期,可重新调整参数并再次创建 Draft 视频生成任务。当确认 Draft 视频效果符合预期后,即可按照后续步骤生成最终视频。
|
||
|
||
\`\`\`Go
|
||
package main
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"time"
|
||
"os"
|
||
|
||
"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() {
|
||
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
|
||
// Initialize the Ark client to read your API Key from an environment variable
|
||
client := arkruntime.NewClientWithApiKey(
|
||
// Get your API Key from the environment variable. This is the default mode and you can modify it as required
|
||
os.Getenv("ARK_API_KEY"),
|
||
// The base URL for model invocation
|
||
arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"),
|
||
)
|
||
ctx := context.Background()
|
||
// Replace with Model ID
|
||
modelEp := "doubao-seedance-1-5-pro-251215"
|
||
|
||
// Generate a task
|
||
fmt.Println("----- create request -----")
|
||
createReq := model.CreateContentGenerationTaskRequest{
|
||
Model: modelEp,
|
||
Seed: volcengine.Int64(20),
|
||
Duration: volcengine.Int64(6),
|
||
Draft: volcengine.Bool(true),
|
||
Content: []*model.CreateContentGenerationContentItem{
|
||
{
|
||
// Combination of text prompt and parameters
|
||
Type: model.ContentGenerationContentItemTypeText,
|
||
Text: volcengine.String("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动"),
|
||
},
|
||
{
|
||
// The URL of the first frame image
|
||
Type: model.ContentGenerationContentItemTypeImage,
|
||
ImageURL: &model.ImageURL{
|
||
URL: "https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png",
|
||
},
|
||
},
|
||
},
|
||
}
|
||
createResp, err := client.CreateContentGenerationTask(ctx, createReq)
|
||
if err != nil {
|
||
fmt.Printf("create content generation error: %v", err)
|
||
return
|
||
}
|
||
taskID := createResp.ID
|
||
fmt.Printf("Task Created with ID: %s", taskID)
|
||
|
||
// Polling query section
|
||
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", 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", getResp.CreatedAt, getResp.UpdatedAt)
|
||
return
|
||
} else if status == "failed" {
|
||
fmt.Println("----- task failed -----")
|
||
if getResp.Error != nil {
|
||
fmt.Printf("Error Code: %s, Message: %s", getResp.Error.Code, getResp.Error.Message)
|
||
}
|
||
return
|
||
} else {
|
||
fmt.Printf("Current status: %s, Retrying in 10 seconds... \\n", status)
|
||
time.Sleep(10 * time.Second)
|
||
}
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane></Tabs>);
|
||
```
|
||
|
||
<span id="015173ef"></span>
|
||
### Step2: 基于 Draft 视频生成正式视频
|
||
如果确认 Draft 视频符合预期,可基于 Step1 返回的 Draft 视频任务 ID,再次调用`POST /contents/generations/tasks`接口,生成最终视频。
|
||
:::tip
|
||
|
||
* 平台将自动复用 Draft 视频使用的用户输入( **model、** content.**text、** content.**image_url、generate_audio、seed、ratio、duration、camera_fixed** ),生成正式视频。
|
||
* 其余参数支持指定,不指定将使用本模型的默认值。例如:指定正式视频的分辨率、是否包含水印、是否使用离线推理、是否返回尾帧等。
|
||
* 基于 Draft 视频生成最终视频属于正常推理过程,按照正常视频消耗 token 量计费。
|
||
* Draft 视频任务 ID 的有效期为 7 天(从 **created at** 时间戳开始计算),超时后将无法使用该 Draft 视频生成正式视频。
|
||
|
||
|
||
:::
|
||
```mixin-react
|
||
return (<Tabs>
|
||
<Tabs.TabPane title="Curl" key="N9ThhrbaV9"><RenderMd content={`1. 基于 \`content.draft_task.id\` 创建视频生成任务。
|
||
|
||
\`\`\`Bash
|
||
curl https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \\
|
||
-H "Content-Type: application/json" \\
|
||
-H "Authorization: Bearer $ARK_API_KEY" \\
|
||
-d '{
|
||
"model": "doubao-seedance-1-5-pro-251215",
|
||
"content": [
|
||
{
|
||
"type": "draft_task",
|
||
"draft_task": {"id": "cgt-2026****-pzjqb"}
|
||
}
|
||
],
|
||
"watermark": false,
|
||
"resolution": "720p",
|
||
"return_last_frame": true,
|
||
"service_tier": "default"
|
||
}'
|
||
\`\`\`
|
||
|
||
请求成功后,系统将返回一个任务 ID。
|
||
|
||
2. 使用视频任务 ID,查询生成状态和结果
|
||
|
||
\`\`\`Bash
|
||
# Replace cgt-2026****-bn6zj with the ID acquired from last step
|
||
|
||
curl https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/cgt-2026****-bn6zj \\
|
||
-H "Content-Type: application/json" \\
|
||
-H "Authorization: Bearer $ARK_API_KEY"
|
||
\`\`\`
|
||
|
||
当任务状态变为 succeeded 后,您可在 content.**video_url** 字段处,下载生成的视频文件。
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Python" key="fTIWNoOAdT"><RenderMd content={`1. 基于\`content.draft_task.id\` (此 ID 通过 Step1 的返回信息获取)创建视频生成任务并轮询获取任务状态;
|
||
2. 当任务状态变为 \`succeeded\` 后,您可在 content.**video_url** 字段处,下载生成的视频文件。
|
||
|
||
\`\`\`Python
|
||
import os
|
||
import time
|
||
# Install SDK: pip install 'volcengine-python-sdk[ark]'
|
||
from volcenginesdkarkruntime import Ark
|
||
|
||
# Make sure that you have stored the API Key in the environment variable ARK_API_KEY
|
||
# Initialize the Ark client to read your API Key from an environment variable
|
||
client = Ark(
|
||
# This is the default path. You can configure it based on the service location
|
||
base_url="https://ark.cn-beijing.volces.com/api/v3",
|
||
# Get API Key:https://console.volcengine.com/ark/region:ark+cn-beijing/apikey
|
||
api_key=os.environ.get("ARK_API_KEY"),
|
||
)
|
||
|
||
if __name__ == "__main__":
|
||
print("----- create request -----")
|
||
create_result = client.content_generation.tasks.create(
|
||
model="doubao-seedance-1-5-pro-251215", # Replace with Model ID
|
||
content=[
|
||
{
|
||
"type": "draft_task",
|
||
"draft_task": {
|
||
"id": "cgt-2026****-pzjqb"
|
||
}
|
||
}
|
||
],
|
||
watermark= False,
|
||
resolution= "720p",
|
||
return_last_frame= True,
|
||
service_tier= "default",
|
||
)
|
||
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)
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Java" key="r9TfYnhxy4"><RenderMd content={`1. 基于\`content.draft_task.id\` (此 ID 通过 Step1 的返回信息获取)创建视频生成任务并轮询获取任务状态;
|
||
2. 当任务状态变为 \`succeeded\` 后,您可在 content.**video_url** 字段处,下载生成的视频文件。
|
||
|
||
\`\`\`Java
|
||
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 {
|
||
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
|
||
// Initialize the Ark client to read your API Key from an environment variable
|
||
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://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation
|
||
.dispatcher(dispatcher)
|
||
.connectionPool(connectionPool)
|
||
.apiKey(apiKey)
|
||
.build();
|
||
|
||
public static void main(String[] args) {
|
||
String model = "doubao-seedance-1-5-pro-251215"; // Replace with Model ID
|
||
Boolean watermark = false;
|
||
String resolution = "720p";
|
||
Boolean returnLastFrame = true;
|
||
String serviceTier = "default";
|
||
System.out.println("----- create request -----");
|
||
List<Content> contents = new ArrayList<>();
|
||
|
||
// Combination of text prompt and parameters
|
||
contents.add(Content.builder()
|
||
.type("draft_task")
|
||
.draftTask(CreateContentGenerationTaskRequest.DraftTask.builder()
|
||
.id("cgt-2026****-pzjqb")
|
||
.build())
|
||
.build());
|
||
|
||
|
||
// Create a video generation task
|
||
CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
|
||
.model(model)
|
||
.content(contents)
|
||
.watermark(watermark)
|
||
.resolution(resolution)
|
||
.returnLastFrame(returnLastFrame)
|
||
.serviceTier(serviceTier)
|
||
.build();
|
||
|
||
CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
|
||
System.out.println(createResult);
|
||
|
||
// Get the details of the task
|
||
String taskId = createResult.getId();
|
||
GetContentGenerationTaskRequest getRequest = GetContentGenerationTaskRequest.builder()
|
||
.taskId(taskId)
|
||
.build();
|
||
|
||
// Polling query section
|
||
System.out.println("----- polling task status -----");
|
||
while (true) {
|
||
try {
|
||
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 -----");
|
||
System.out.println("Error: " + getResponse.getStatus());
|
||
break;
|
||
} else {
|
||
System.out.printf("Current status: %s, Retrying in 10 seconds...", status);
|
||
TimeUnit.SECONDS.sleep(10);
|
||
}
|
||
} catch (InterruptedException ie) {
|
||
Thread.currentThread().interrupt();
|
||
System.err.println("Polling interrupted");
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Go" key="mqElFrgHUZ"><RenderMd content={`1. 基于\`content.draft_task.id\` (此 ID 通过 Step1 的返回信息获取)创建视频生成任务并轮询获取任务状态;
|
||
2. 当任务状态变为 \`succeeded\` 后,您可在 content.**video_url** 字段处,下载生成的视频文件。
|
||
|
||
\`\`\`Go
|
||
package main
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"time"
|
||
"os"
|
||
|
||
"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() {
|
||
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
|
||
// Initialize the Ark client to read your API Key from an environment variable
|
||
client := arkruntime.NewClientWithApiKey(
|
||
// Get your API Key from the environment variable. This is the default mode and you can modify it as required
|
||
os.Getenv("ARK_API_KEY"),
|
||
// The base URL for model invocation
|
||
arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"),
|
||
)
|
||
ctx := context.Background()
|
||
// Replace with Model ID
|
||
modelEp := "doubao-seedance-1-5-pro-251215"
|
||
|
||
// Generate a task
|
||
fmt.Println("----- create request -----")
|
||
createReq := model.CreateContentGenerationTaskRequest{
|
||
Model: modelEp,
|
||
Watermark: volcengine.Bool(false),
|
||
Resolution: volcengine.String("720p"),
|
||
ReturnLastFrame: volcengine.Bool(true),
|
||
ServiceTier: volcengine.String("default"),
|
||
Content: []*model.CreateContentGenerationContentItem{
|
||
{
|
||
Type: model.ContentGenerationContentItemTypeDraftTask,
|
||
DraftTask: &model.DraftTask{ID: "cgt-2026****-pzjqb"},
|
||
},
|
||
},
|
||
}
|
||
|
||
createResp, err := client.CreateContentGenerationTask(ctx, createReq)
|
||
if err != nil {
|
||
fmt.Printf("create content generation error: %v", err)
|
||
return
|
||
}
|
||
taskID := createResp.ID
|
||
fmt.Printf("Task Created with ID: %s", taskID)
|
||
|
||
// Polling query section
|
||
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", 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", getResp.CreatedAt, getResp.UpdatedAt)
|
||
return
|
||
} else if status == "failed" {
|
||
fmt.Println("----- task failed -----")
|
||
if getResp.Error != nil {
|
||
fmt.Printf("Error Code: %s, Message: %s", getResp.Error.Code, getResp.Error.Message)
|
||
}
|
||
return
|
||
} else {
|
||
fmt.Printf("Current status: %s, Retrying in 10 seconds... \\n", status)
|
||
time.Sleep(10 * time.Second)
|
||
}
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane></Tabs>);
|
||
```
|
||
|
||
<span id="141cf7fa"></span>
|
||
## 生成多个连续视频
|
||
使用前一个生成视频的尾帧,作为后一个视频任务的首帧,循环生成多个连续的视频。
|
||
后续您可以自行使用 FFmpeg 等工具,将生成的多个短视频拼接成一个完整长视频。
|
||
|
||
<span aceTableMode="list" aceTableWidth="1,1,1"></span>
|
||
|输出1 |输出2 |输出3 |
|
||
|---|---|---|
|
||
|<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/09e5e4cf5aed462fb426ab9ce1eec485~tplv-goo7wpa0wc-image.image" controls></video>|<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d3f181984db040ac98d4d16f5c0115e6~tplv-goo7wpa0wc-image.image" controls></video>|<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/4bc452920fa94ffc838d871c2619323b~tplv-goo7wpa0wc-image.image" controls></video>|\
|
||
||||\
|
||
|> 女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动 |> 女孩和狐狸在草地上奔跑,阳光明媚,女孩的笑容灿烂,狐狸欢快地跳跃 |> 女孩和狐狸坐在树下休息,女孩轻轻抚摸狐狸的毛发,狐狸温顺地趴在女孩腿上 |
|
||
|
||
```Python
|
||
import os
|
||
import time
|
||
# Install SDK: pip install 'volcengine-python-sdk[ark]'
|
||
from volcenginesdkarkruntime import Ark
|
||
|
||
# Make sure that you have stored the API Key in the environment variable ARK_API_KEY
|
||
# Initialize the Ark client to read your API Key from an environment variable
|
||
client = Ark(
|
||
# This is the default path. You can configure it based on the service location
|
||
base_url="https://ark.cn-beijing.volces.com/api/v3",
|
||
# Get API Key:https://console.volcengine.com/ark/region:ark+cn-beijing/apikey
|
||
api_key=os.environ.get("ARK_API_KEY"),
|
||
)
|
||
|
||
def generate_video_with_last_frame(prompt, initial_image_url=None):
|
||
"""
|
||
Generate video and return video URL and last frame URL
|
||
Parameters:
|
||
prompt: Text prompt for video generation
|
||
initial_image_url: Initial image URL (optional)
|
||
Returns:
|
||
video_url: Generated video URL
|
||
last_frame_url: URL of the last frame of the video
|
||
"""
|
||
print(f"----- Generating video: {prompt} -----")
|
||
|
||
# Build content list
|
||
content = [{
|
||
"text": prompt,
|
||
"type": "text"
|
||
}]
|
||
|
||
# If initial image is provided, add to content
|
||
if initial_image_url:
|
||
content.append({
|
||
"image_url": {
|
||
"url": initial_image_url
|
||
},
|
||
"type": "image_url"
|
||
})
|
||
|
||
# Create video generation task
|
||
create_result = client.content_generation.tasks.create(
|
||
model="doubao-seedance-1-5-pro-251215", # Replace with Model ID
|
||
content=content,
|
||
return_last_frame=True,
|
||
ratio="adaptive",
|
||
duration=5,
|
||
watermark=False,
|
||
)
|
||
|
||
# Poll to check 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 get_result.status == "succeeded":
|
||
print("Video generation succeeded")
|
||
try:
|
||
if hasattr(get_result, 'content') and hasattr(get_result.content, 'video_url') and hasattr(get_result.content, 'last_frame_url'):
|
||
return get_result.content.video_url, get_result.content.last_frame_url
|
||
print("Failed to obtain video URL or last frame URL")
|
||
return None, None
|
||
except Exception as e:
|
||
print(f"Error occurred while obtaining video URL and last frame URL: {e}")
|
||
return None, None
|
||
elif status == "failed":
|
||
print(f"----- Video generation failed -----")
|
||
print(f"Error: {get_result.error}")
|
||
return None, None
|
||
else:
|
||
print(f"Current status: {status}, retrying in 10 seconds...")
|
||
time.sleep(10)
|
||
|
||
|
||
|
||
if __name__ == "__main__":
|
||
# Define 3 video prompts
|
||
prompts = [
|
||
"女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动",
|
||
"女孩和狐狸在草地上奔跑,阳光明媚,女孩的笑容灿烂,狐狸欢快地跳跃",
|
||
"女孩和狐狸坐在树下休息,女孩轻轻抚摸狐狸的毛发,狐狸温顺地趴在女孩腿上"
|
||
]
|
||
|
||
# Store generated video URLs
|
||
video_urls = []
|
||
|
||
# Initial image URL
|
||
initial_image_url = "https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png"
|
||
|
||
# Generate 3 short videos
|
||
for i, prompt in enumerate(prompts):
|
||
print(f"Generating video {i+1}")
|
||
video_url, last_frame_url = generate_video_with_last_frame(prompt, initial_image_url)
|
||
|
||
if video_url and last_frame_url:
|
||
video_urls.append(video_url)
|
||
print(f"Video {i+1} URL: {video_url}")
|
||
# Use the last frame of the current video as the first frame of the next video
|
||
initial_image_url = last_frame_url
|
||
else:
|
||
print(f"Video {i+1} generation failed, exiting program")
|
||
exit(1)
|
||
|
||
print("All videos generated successfully!")
|
||
print("Generated video URL list:")
|
||
for i, url in enumerate(video_urls):
|
||
print(f"Video {i+1}: {url}")
|
||
```
|
||
|
||
<span id="caf01f12"></span>
|
||
## 使用 Webhook 通知
|
||
通过 **callback_url** 参数可以指定一个回调通知地址,当视频生成任务的状态发生变化时,方舟会向该地址发送一条 POST 请求,方便您及时获取任务最新情况。 请求内容结构与[查询任务API](https://www.volcengine.com/docs/82379/1521309)的返回体一致。
|
||
```Bash
|
||
{
|
||
"id": "cgt-2025****",
|
||
"model": "doubao-seedance-1-5-pro-251215",
|
||
"status": "running", # Possible status values: queued, running, succeeded, failed, expired
|
||
"created_at": 1765434920,
|
||
"updated_at": 1765434920,
|
||
"service_tier": "default",
|
||
"execution_expires_after": 172800
|
||
}
|
||
```
|
||
|
||
您需要自行搭建一个公网可访问的 Web Server 来接收 Webhook 通知。以下是一个简单的 Web Server 代码示例,供您参考。
|
||
```Python
|
||
# Building a Simple Web Server with Python Flask for Webhook Notification Processing
|
||
|
||
from flask import Flask, request, jsonify
|
||
import sqlite3
|
||
import logging
|
||
from datetime import datetime
|
||
import os
|
||
|
||
# === Basic Configuration ===
|
||
app = Flask(__name__)
|
||
# Configure logging
|
||
logging.basicConfig(
|
||
level=logging.INFO,
|
||
format='%(asctime)s - %(levelname)s - %(message)s',
|
||
handlers=[logging.FileHandler('webhook.log'), logging.StreamHandler()]
|
||
)
|
||
# Database path
|
||
DB_PATH = 'video_tasks.db'
|
||
|
||
# === Database Initialization ===
|
||
def init_db():
|
||
"""Automatically create task table on first run, aligning fields with callback parameters"""
|
||
conn = sqlite3.connect(DB_PATH)
|
||
cursor = conn.cursor()
|
||
# Create table: task_id as primary key for idempotent updates
|
||
cursor.execute('''
|
||
CREATE TABLE IF NOT EXISTS video_generation_tasks (
|
||
task_id TEXT PRIMARY KEY,
|
||
model TEXT NOT NULL,
|
||
status TEXT NOT NULL,
|
||
created_at INTEGER NOT NULL,
|
||
updated_at INTEGER NOT NULL,
|
||
service_tier TEXT NOT NULL,
|
||
execution_expires_after INTEGER NOT NULL,
|
||
last_callback_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||
)
|
||
''')
|
||
conn.commit()
|
||
conn.close()
|
||
logging.info("Database initialized, table created/exists")
|
||
|
||
# === Core Webhook Interface ===
|
||
@app.route('/webhook/callback', methods=['POST'])
|
||
def video_task_callback():
|
||
"""Core interface for receiving Ark callback"""
|
||
try:
|
||
# 1. Parse callback request body (JSON format)
|
||
callback_data = request.get_json()
|
||
if not callback_data:
|
||
logging.error("Callback request body empty or non-JSON format")
|
||
return jsonify({"code": 400, "msg": "Invalid JSON data"}), 400
|
||
|
||
# 2. Validate required fields
|
||
required_fields = ['id', 'model', 'status', 'created_at', 'updated_at', 'service_tier', 'execution_expires_after']
|
||
for field in required_fields:
|
||
if field not in callback_data:
|
||
logging.error(f"Callback data missing required field: {field}, data: {callback_data}")
|
||
return jsonify({"code": 400, "msg": f"Missing field: {field}"}), 400
|
||
|
||
# 3. Extract key information and log
|
||
task_id = callback_data['id']
|
||
status = callback_data['status']
|
||
model = callback_data['model']
|
||
logging.info(f"Received task callback | Task ID: {task_id} | Status: {status} | Model: {model}")
|
||
print(f"[{datetime.now()}] Task {task_id} status updated to: {status}") # Console output
|
||
|
||
# 4. Database operation
|
||
conn = sqlite3.connect(DB_PATH)
|
||
cursor = conn.cursor()
|
||
cursor.execute('''
|
||
INSERT OR REPLACE INTO video_generation_tasks (
|
||
task_id, model, status, created_at, updated_at, service_tier, execution_expires_after
|
||
) VALUES (?, ?, ?, ?, ?, ?, ?)
|
||
''', (
|
||
task_id,
|
||
model,
|
||
status,
|
||
callback_data['created_at'],
|
||
callback_data['updated_at'],
|
||
callback_data['service_tier'],
|
||
callback_data['execution_expires_after']
|
||
))
|
||
conn.commit()
|
||
conn.close()
|
||
logging.info(f"Task {task_id} database update successful")
|
||
|
||
# 5. Return 200 response
|
||
return jsonify({"code": 200, "msg": "Callback received successfully", "task_id": task_id}), 200
|
||
|
||
except Exception as e:
|
||
# Catch all exceptions to avoid returning 5xx
|
||
logging.error(f"Callback processing failed: {str(e)}", exc_info=True)
|
||
return jsonify({"code": 200, "msg": "Callback received successfully (internal processing exception)"}), 200
|
||
|
||
# === Helper Interface (Optional, for querying task status) ===
|
||
@app.route('/tasks/<task_id>', methods=['GET'])
|
||
def get_task_status(task_id):
|
||
"""Query latest status of specified task"""
|
||
conn = sqlite3.connect(DB_PATH)
|
||
cursor = conn.cursor()
|
||
cursor.execute('SELECT * FROM video_generation_tasks WHERE task_id = ?', (task_id,))
|
||
task = cursor.fetchone()
|
||
conn.close()
|
||
if not task:
|
||
return jsonify({"code": 404, "msg": "Task not found"}), 404
|
||
# Map field names for response
|
||
fields = ['task_id', 'model', 'status', 'created_at', 'updated_at', 'service_tier', 'execution_expires_after', 'last_callback_at']
|
||
task_dict = dict(zip(fields, task))
|
||
return jsonify({"code": 200, "data": task_dict}), 200
|
||
|
||
# === Service Startup ===
|
||
if __name__ == '__main__':
|
||
# Initialize database
|
||
init_db()
|
||
# Start Flask service (bind to 0.0.0.0 for public access, port customizable)
|
||
# Test environment: debug=True; Production environment should disable debug and use gunicorn
|
||
app.run(host='0.0.0.0', port=8080, debug=False)
|
||
```
|
||
|
||
<span id="66cb028f"></span>
|
||
# 使用限制
|
||
<span id="2760a484"></span>
|
||
## 保存时间
|
||
任务数据(如任务状态、视频URL等)仅保留24小时,超时后会被自动清除。请您务必及时保存生成的视频。
|
||
<span id="b25b1821"></span>
|
||
## 限流说明
|
||
**模型限流**
|
||
**default(在线推理)**
|
||
|
||
* RPM 限流:账号下同模型(区分模型版本)每分钟允许创建的任务数量上限。若超过该限制,创建视频生成任务时会报错。
|
||
* 并发数限制:账号下同模型(区分模型版本)同一时刻在处理中的任务数量上限。超过此限制的任务将进入队列等待处理。
|
||
* 不同模型的限制值不同,详见[视频生成能力](/docs/82379/1330310#2705b333)。
|
||
|
||
**flex(离线推理)**
|
||
|
||
* TPD 限流:账号在一天内对同一模型(区分模型版本)的总调用 token 上限。超过此限制的调用请求将被拒绝。不同模型的 TPD 限流值不同,详见[视频生成能力](/docs/82379/1330310#2705b333)。
|
||
|
||
<span id="f76aafc8"></span>
|
||
## 图片裁剪规则
|
||
**Seedance 系列模型的图生视频场景,支持设置生成视频的宽高比。** 当选择的视频宽高与您上传的图片宽高比不一致时,方舟会对您的图片进行裁剪,裁剪时会居中裁剪。详细规则如下:
|
||
:::tip
|
||
若要呈现出较好的视频效果,建议所指定的视频宽高比(ratio)与实际上传图片的宽高比尽可能接近。
|
||
|
||
:::
|
||
1. 输入参数:
|
||
* 原始图片宽度记为`W`(单位:像素),高度记为`H`(单位:像素)。
|
||
* 目标比例记为`A:B`(例如,21:9),这表示裁剪后的宽度与高度之比应为 `A/B`(如 21/9≈2.333)。
|
||
2. 比较宽高比:
|
||
* 计算原始图片的宽高比`Ratio_原始=W/H`。
|
||
* 计算目标比例的比值`Ratio_目标=A/B`(例如,21:9 的 Ratio目标=21/9≈2.333)。
|
||
* 根据比较结果,决定裁剪基准:
|
||
* 如果`Ratio_原始<Ratio_目标`(即原始图片“太高”或“竖高”),则以宽度为基准裁剪。
|
||
* 如果`Ratio_原始>Ratio_目标`(即原始图片“太宽”或“横宽”),则以高度为基准裁剪。
|
||
* 如果相等,则无需裁剪,直接使用全图。
|
||
3. 裁剪尺寸计算(量化公式):
|
||
* 以宽度为基准(适用于竖高图片):
|
||
* 裁剪宽度`Crop_W=W`(使用整个原始宽度)。
|
||
* 裁剪高度`Crop_H=(B/A)×W`(根据目标比例等比例计算高度)。
|
||
* 裁剪区域的起始坐标(居中定位):
|
||
* X 坐标(水平):总是 0(因为宽度全用,从左侧开始)。
|
||
* Y 坐标(垂直):`(H−Crop_H)/2`(确保垂直居中,从顶部开始)。
|
||
* 以高度为基准(适用于横宽图片):
|
||
* 裁剪高度`Crop_H=H`(使用整个原始高度)。
|
||
* 裁剪宽度`Crop_W=(A/B)×H`(根据目标比例等比例计算宽度)。
|
||
* 裁剪区域的起始坐标(居中定位):
|
||
* X 坐标(水平):`(W−Crop_W)/2`(确保水平居中,从左侧开始)。
|
||
* Y 坐标(垂直):总是 0(因为高度全用,从顶部开始)。
|
||
4. 裁剪结果:
|
||
* 最终裁剪出的图片尺寸为`Crop_W×Crop_H`,比例严格为`A:B`,且完全位于原始图片内部,无黑边。
|
||
* 裁剪区域总是以原始图片中心为基准,因此内容居中。
|
||
5. 裁剪示例:
|
||
> 以 Seedance 1.0 Pro 首帧图生视频功能为例
|
||
|
||
|
||
<span aceTableMode="list" aceTableWidth="2,1,2"></span>
|
||
|输入的首帧图片 |指定的宽高比ratio |生成的视频结果 |
|
||
|---|---|---|
|
||
|16:9|21:9 |<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/6e8590c07be9406d805209355b799a37~tplv-goo7wpa0wc-image.image" controls></video>|\
|
||
|<span> </span> | | |
|
||
|^^|16:9 |<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/e0bef5f3806f439da5f0c9f5acc44c9b~tplv-goo7wpa0wc-image.image" controls></video>|\
|
||
| | | |
|
||
|^^|4:3 |<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/a8e3202b77744bec83e0c7baa247b84c~tplv-goo7wpa0wc-image.image" controls></video>|\
|
||
| | | |
|
||
|^^|1:1 |<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/436df8f6dae74d6c86d08bf1e18bc9d0~tplv-goo7wpa0wc-image.image" controls></video>|\
|
||
| | | |
|
||
|^^|3:4 |<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/a3a94a577d754501889535a651d03a55~tplv-goo7wpa0wc-image.image" controls></video>|\
|
||
| | | |
|
||
|^^|9:16 |<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/1423ee0fc9cf451398788dc57e9f55c4~tplv-goo7wpa0wc-image.image" controls></video>|\
|
||
| | | |
|
||
|
||
|
||
|