文生视频 API
视频模型使用 mode: "text_to_video"。
推荐模型
| 模型 | Key | 优势 |
|---|---|---|
| Veo 3.1 Fast | google/veo3.1-fast |
固定 8 秒的快速电影感视频。 |
| Veo 3.1 Quality | google/veo3.1-quality |
更高质量的 Veo 3.1 输出。 |
| Sora 2 | openai/sora-2 |
叙事与表演类场景。 |
| Kling 3.0 | kling/kling-v3 |
动作、产品运动和人物镜头。 |
| Seedance 2.0 Fast | doubao/seedance-2.0-fast |
灵活时长和快速视频生产。 |
示例
curl https://img2vid.net/api/v1/generations \
-H "Authorization: Bearer $BUBLE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "doubao/seedance-2.0-fast",
"mode": "text_to_video",
"prompt": "A stylish 5-second social ad for a smart travel backpack, fast clean cuts, city morning light, premium lifestyle cinematography",
"duration": "5s",
"resolution": "720p",
"aspect_ratio": "9:16",
"audio": "false",
"web_search": "false"
}'
SDK 示例
下面的 SDK 代码与上方 HTTP 示例使用同一套公开 API 结构:model、mode、prompt、媒体 URL 等稳定字段直接传入,模型专属选项保持为扁平的生成参数。
TypeScript / JavaScript
import { Buble } from '@buble/sdk';
const buble = new Buble();
const task = await buble.generations.create({
model: 'doubao/seedance-2.0-fast',
mode: 'text_to_video',
prompt:
'A stylish 5-second social ad for a smart travel backpack, fast clean cuts, city morning light, premium lifestyle cinematography',
duration: '5s',
resolution: '720p',
aspect_ratio: '9:16',
audio: 'false',
web_search: 'false',
});
const result = await buble.generations.wait(task.data.id);
console.log(result.data);
Python
from buble_ai import Buble
client = Buble()
task = client.generations.create(
model='doubao/seedance-2.0-fast',
mode='text_to_video',
prompt='A stylish 5-second social ad for a smart travel backpack, fast clean cuts, city morning light, premium lifestyle cinematography',
duration='5s',
resolution='720p',
aspect_ratio='9:16',
audio='false',
web_search='false',
)
result = client.generations.wait(task["data"]["id"])
print(result["data"])
Go
package main
import (
"context"
"fmt"
"log"
buble "github.com/bublehq/sdks/go"
)
func main() {
ctx := context.Background()
client := buble.NewClient()
task, err := client.Generations.Create(ctx, &buble.CreateGenerationRequest{
Model: "doubao/seedance-2.0-fast",
Mode: "text_to_video",
Prompt: "A stylish 5-second social ad for a smart travel backpack, fast clean cuts, city morning light, premium lifestyle cinematography",
Params: map[string]any{
"duration": "5s",
"resolution": "720p",
"aspect_ratio": "9:16",
"audio": "false",
"web_search": "false",
},
})
if err != nil {
log.Fatal(err)
}
result, err := client.Generations.Wait(ctx, task.Data.ID)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", result.Data)
}
Rust
use buble::{Client, CreateGenerationRequest, WaitOptions};
#[tokio::main]
async fn main() -> buble::Result<()> {
let client = Client::from_env();
let task = client
.generations()
.create(
CreateGenerationRequest::new("doubao/seedance-2.0-fast")
.mode("text_to_video")
.prompt("A stylish 5-second social ad for a smart travel backpack, fast clean cuts, city morning light, premium lifestyle cinematography")
.param("duration", "5s")?
.param("resolution", "720p")?
.param("aspect_ratio", "9:16")?
.param("audio", "false")?
.param("web_search", "false")?,
)
.await?;
let result = client
.generations()
.wait(&task.data.id, WaitOptions::default())
.await?;
println!("{:?}", result.data);
Ok(())
}
Swift
import Buble
let client = try BubleClient.fromEnvironment()
let task = try await client.generations.create(
try CreateGenerationRequest(model: "doubao/seedance-2.0-fast")
.mode("text_to_video")
.prompt("A stylish 5-second social ad for a smart travel backpack, fast clean cuts, city morning light, premium lifestyle cinematography")
.param("duration", "5s")
.param("resolution", "720p")
.param("aspect_ratio", "9:16")
.param("audio", "false")
.param("web_search", "false")
)
let result = try await client.generations.wait(task.data.id)
print(result.data)
Dart / Flutter
import 'package:buble/buble.dart';
Future<void> main() async {
final client = BubleClient.fromEnvironment();
final task = await client.generations.create(
CreateGenerationRequest(
model: 'doubao/seedance-2.0-fast',
mode: 'text_to_video',
prompt:
'A stylish 5-second social ad for a smart travel backpack, fast clean cuts, city morning light, premium lifestyle cinematography',
).withParams({
'duration': '5s',
'resolution': '720p',
'aspect_ratio': '9:16',
'audio': 'false',
'web_search': 'false',
}),
);
final result = await client.generations.wait(task.data.id);
print(result.data.raw);
}
Elixir
client = Buble.Client.new!()
{:ok, task} =
Buble.Generations.create(client, %{
model: "doubao/seedance-2.0-fast",
mode: "text_to_video",
prompt:
"A stylish 5-second social ad for a smart travel backpack, fast clean cuts, city morning light, premium lifestyle cinematography",
duration: "5s",
resolution: "720p",
aspect_ratio: "9:16",
audio: "false",
web_search: "false",
})
{:ok, result} = Buble.Generations.wait(client, get_in(task, ["data", "id"]))
IO.inspect(result["data"])
Java
import ai.buble.sdk.BubleClient;
import ai.buble.sdk.Envelope;
import ai.buble.sdk.generations.CreateGenerationRequest;
import ai.buble.sdk.generations.GenerationTask;
public class Example {
public static void main(String[] args) {
BubleClient client = BubleClient.fromEnv();
Envelope<GenerationTask> task = client.generations().create(
CreateGenerationRequest.builder()
.model("doubao/seedance-2.0-fast")
.mode("text_to_video")
.prompt("A stylish 5-second social ad for a smart travel backpack, fast clean cuts, city morning light, premium lifestyle cinematography")
.param("duration", "5s")
.param("resolution", "720p")
.param("aspect_ratio", "9:16")
.param("audio", "false")
.param("web_search", "false")
.build()
);
Envelope<GenerationTask> result = client.generations().wait(task.getData().getId());
System.out.println(result.getData().getStatus());
}
}
.NET
using Buble.Sdk;
using Buble.Sdk.Generations;
var client = BubleClient.FromEnv();
var request = new CreateGenerationRequest
{
Model = "doubao/seedance-2.0-fast",
Mode = "text_to_video",
Prompt = "A stylish 5-second social ad for a smart travel backpack, fast clean cuts, city morning light, premium lifestyle cinematography",
}
.WithParam("duration", "5s")
.WithParam("resolution", "720p")
.WithParam("aspect_ratio", "9:16")
.WithParam("audio", "false")
.WithParam("web_search", "false");
var task = await client.Generations.CreateAsync(request);
var result = await client.Generations.WaitAsync(task!.Data!.Id!);
Console.WriteLine(result.Data.Status);
PHP
<?php
use Buble\BubleClient;
use Buble\Generations\CreateGenerationRequest;
$client = BubleClient::fromEnv();
$request = new CreateGenerationRequest(
model: 'doubao/seedance-2.0-fast',
mode: 'text_to_video',
prompt: 'A stylish 5-second social ad for a smart travel backpack, fast clean cuts, city morning light, premium lifestyle cinematography',
);
$task = $client->generations()->create(
$request
->withParam('duration', '5s')
->withParam('resolution', '720p')
->withParam('aspect_ratio', '9:16')
->withParam('audio', 'false')
->withParam('web_search', 'false')
);
$result = $client->generations()->wait($task['data']['id']);
print_r($result['data']);
Ruby
require 'buble'
client = Buble::Client.new
task = client.generations.create(
model: 'doubao/seedance-2.0-fast',
mode: 'text_to_video',
prompt: 'A stylish 5-second social ad for a smart travel backpack, fast clean cuts, city morning light, premium lifestyle cinematography',
duration: '5s',
resolution: '720p',
aspect_ratio: '9:16',
audio: 'false',
web_search: 'false',
)
result = client.generations.wait(task['data']['id'])
puts result['data']