文生视频 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 结构:modelmodeprompt、媒体 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']