curl --request POST \
--url https://api.evolink.ai/v1/videos/generations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "gemini-omni-1.2-flash-text-to-video",
"prompt": "ガラス玉が木製のコースを勢いよく転がり、最後に水へ落ちてしぶきを上げる。",
"quality": "1080p",
"aspect_ratio": "16:9",
"duration": 3
}
'import requests
url = "https://api.evolink.ai/v1/videos/generations"
payload = {
"model": "gemini-omni-1.2-flash-text-to-video",
"prompt": "ガラス玉が木製のコースを勢いよく転がり、最後に水へ落ちてしぶきを上げる。",
"quality": "1080p",
"aspect_ratio": "16:9",
"duration": 3
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
model: 'gemini-omni-1.2-flash-text-to-video',
prompt: 'ガラス玉が木製のコースを勢いよく転がり、最後に水へ落ちてしぶきを上げる。',
quality: '1080p',
aspect_ratio: '16:9',
duration: 3
})
};
fetch('https://api.evolink.ai/v1/videos/generations', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.evolink.ai/v1/videos/generations",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'model' => 'gemini-omni-1.2-flash-text-to-video',
'prompt' => 'ガラス玉が木製のコースを勢いよく転がり、最後に水へ落ちてしぶきを上げる。',
'quality' => '1080p',
'aspect_ratio' => '16:9',
'duration' => 3
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.evolink.ai/v1/videos/generations"
payload := strings.NewReader("{\n \"model\": \"gemini-omni-1.2-flash-text-to-video\",\n \"prompt\": \"ガラス玉が木製のコースを勢いよく転がり、最後に水へ落ちてしぶきを上げる。\",\n \"quality\": \"1080p\",\n \"aspect_ratio\": \"16:9\",\n \"duration\": 3\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.evolink.ai/v1/videos/generations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"gemini-omni-1.2-flash-text-to-video\",\n \"prompt\": \"ガラス玉が木製のコースを勢いよく転がり、最後に水へ落ちてしぶきを上げる。\",\n \"quality\": \"1080p\",\n \"aspect_ratio\": \"16:9\",\n \"duration\": 3\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.evolink.ai/v1/videos/generations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"gemini-omni-1.2-flash-text-to-video\",\n \"prompt\": \"ガラス玉が木製のコースを勢いよく転がり、最後に水へ落ちてしぶきを上げる。\",\n \"quality\": \"1080p\",\n \"aspect_ratio\": \"16:9\",\n \"duration\": 3\n}"
response = http.request(request)
puts response.read_body{
"created": 1757169743,
"id": "task-unified-1757169743-7cvnl5zw",
"model": "gemini-omni-1.2-flash-text-to-video",
"object": "video.generation.task",
"progress": 0,
"status": "processing",
"task_info": {
"can_cancel": false,
"estimated_time": 60,
"video_duration": 3
},
"type": "video",
"usage": {
"billing_rule": "per_token",
"credits_reserved": 102.34,
"user_group": "default"
}
}{
"error": {
"code": "invalid_request",
"message": "Invalid request parameters",
"type": "invalid_request_error"
}
}{
"error": {
"code": "unauthorized",
"message": "Invalid or expired token",
"type": "authentication_error"
}
}{
"error": {
"code": "insufficient_quota",
"message": "Insufficient quota. Please top up your account.",
"type": "insufficient_quota"
}
}{
"error": {
"code": "model_access_denied",
"message": "Token does not have access to model: gemini-omni-1.2-flash-text-to-video",
"type": "invalid_request_error"
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "Too many requests, please try again later",
"type": "rate_limit_error"
}
}{
"error": {
"code": "internal_error",
"message": "Internal server error",
"type": "api_error"
}
}Gemini Omni 1.2 Flash テキストから動画
- Gemini Omni 1.2 Flash(
gemini-omni-1.2-flash-text-to-video)は、テキストプロンプトからネイティブ音声付き動画を生成します。 - 解像度:
qualityは360p、720p、1080p、4k。既定値720p。 - 長さ:
durationは3〜15秒の整数。既定値3。 - アスペクト比:
aspect_ratioは16:9、9:16、auto。既定値auto。 - 同期したネイティブ音声を自動生成します。追加パラメータは不要です。
- 否定的な指定は
promptに直接記述します(例:No dialogue)。独立したパラメータはありません。 seedの固定で再現性を高められます。- 非同期処理です。タスクIDで状態を確認してください。
- リンクは24時間有効です。早めに保存してください。
curl --request POST \
--url https://api.evolink.ai/v1/videos/generations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "gemini-omni-1.2-flash-text-to-video",
"prompt": "ガラス玉が木製のコースを勢いよく転がり、最後に水へ落ちてしぶきを上げる。",
"quality": "1080p",
"aspect_ratio": "16:9",
"duration": 3
}
'import requests
url = "https://api.evolink.ai/v1/videos/generations"
payload = {
"model": "gemini-omni-1.2-flash-text-to-video",
"prompt": "ガラス玉が木製のコースを勢いよく転がり、最後に水へ落ちてしぶきを上げる。",
"quality": "1080p",
"aspect_ratio": "16:9",
"duration": 3
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
model: 'gemini-omni-1.2-flash-text-to-video',
prompt: 'ガラス玉が木製のコースを勢いよく転がり、最後に水へ落ちてしぶきを上げる。',
quality: '1080p',
aspect_ratio: '16:9',
duration: 3
})
};
fetch('https://api.evolink.ai/v1/videos/generations', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.evolink.ai/v1/videos/generations",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'model' => 'gemini-omni-1.2-flash-text-to-video',
'prompt' => 'ガラス玉が木製のコースを勢いよく転がり、最後に水へ落ちてしぶきを上げる。',
'quality' => '1080p',
'aspect_ratio' => '16:9',
'duration' => 3
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.evolink.ai/v1/videos/generations"
payload := strings.NewReader("{\n \"model\": \"gemini-omni-1.2-flash-text-to-video\",\n \"prompt\": \"ガラス玉が木製のコースを勢いよく転がり、最後に水へ落ちてしぶきを上げる。\",\n \"quality\": \"1080p\",\n \"aspect_ratio\": \"16:9\",\n \"duration\": 3\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.evolink.ai/v1/videos/generations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"gemini-omni-1.2-flash-text-to-video\",\n \"prompt\": \"ガラス玉が木製のコースを勢いよく転がり、最後に水へ落ちてしぶきを上げる。\",\n \"quality\": \"1080p\",\n \"aspect_ratio\": \"16:9\",\n \"duration\": 3\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.evolink.ai/v1/videos/generations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"gemini-omni-1.2-flash-text-to-video\",\n \"prompt\": \"ガラス玉が木製のコースを勢いよく転がり、最後に水へ落ちてしぶきを上げる。\",\n \"quality\": \"1080p\",\n \"aspect_ratio\": \"16:9\",\n \"duration\": 3\n}"
response = http.request(request)
puts response.read_body{
"created": 1757169743,
"id": "task-unified-1757169743-7cvnl5zw",
"model": "gemini-omni-1.2-flash-text-to-video",
"object": "video.generation.task",
"progress": 0,
"status": "processing",
"task_info": {
"can_cancel": false,
"estimated_time": 60,
"video_duration": 3
},
"type": "video",
"usage": {
"billing_rule": "per_token",
"credits_reserved": 102.34,
"user_group": "default"
}
}{
"error": {
"code": "invalid_request",
"message": "Invalid request parameters",
"type": "invalid_request_error"
}
}{
"error": {
"code": "unauthorized",
"message": "Invalid or expired token",
"type": "authentication_error"
}
}{
"error": {
"code": "insufficient_quota",
"message": "Insufficient quota. Please top up your account.",
"type": "insufficient_quota"
}
}{
"error": {
"code": "model_access_denied",
"message": "Token does not have access to model: gemini-omni-1.2-flash-text-to-video",
"type": "invalid_request_error"
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "Too many requests, please try again later",
"type": "rate_limit_error"
}
}{
"error": {
"code": "internal_error",
"message": "Internal server error",
"type": "api_error"
}
}承認
##すべてのインターフェースはBearer Tokenによる認証が必要です##
API Key の取得:
API Key 管理ページ にアクセスして API Key を取得してください
利用時はリクエストヘッダーに以下を追加します:
Authorization: Bearer YOUR_API_KEY
ボディ
モデル名。固定値は gemini-omni-1.2-flash-text-to-video
gemini-omni-1.2-flash-text-to-video "gemini-omni-1.2-flash-text-to-video"
被写体、動作、シーン、カメラワークを記述するプロンプト。
中国語と英語に対応します。動作や変化を具体的に記述すると、結果が安定しやすくなります。否定的な指定は prompt に直接記述してください(例:No dialogue、文字を表示しない)。独立したネガティブプロンプトのパラメータはありません。
プロンプトは必須です。空文字列や空白文字のみの値は指定できません。
1\S"ガラス玉が木製のコースを勢いよく転がり、最後に水へ落ちてしぶきを上げる。"
動画解像度。デフォルトは 720p です。
対応値:
360p:横 640×360 / 縦 360×640720p:横 1280×720 / 縦 720×1280。デフォルト1080p:横 1920×1080 / 縦 1080×19204k:横 3840×2160 / 縦 2160×3840
向きは aspect_ratio で決まり、16:9 は横向き、9:16 は縦向きです。
課金: 出力 token は解像度に比例します。720p を基準に、360p は約 1/3、1080p は約 1.5 倍、4k は約 3 倍です。実際の料金は生成時の使用量に基づきます。
360p, 720p, 1080p, 4k "720p"
動画の長さ(秒)。既定値は 3。3〜15 の任意の整数に対応します。長さは料金に直接影響します。
3 <= x <= 153
アスペクト比: 16:9、9:16、auto。既定値auto。
16:9, 9:16, auto "auto"
乱数シード。既定ではランダムです。範囲は 0〜4294967295。シードを固定すると、プロンプト調整時のパラメータ変更によるばらつきを抑え、再現性を高められます。
0 <= x <= 429496729542
タスク完了後のHTTPSコールバックアドレス
コールバックのタイミング:
- タスクの完了(completed)、失敗(failed)、キャンセル(cancelled)時にトリガーされます
- 課金確定後に送信されます
セキュリティ制限:
- HTTPSプロトコルのみ対応
- 内部ネットワークIPアドレス(127.0.0.1、10.x.x.x、172.16-31.x.x、192.168.x.x など)へのコールバックは禁止
- URLの長さは
2048文字以内
コールバックの仕組み:
- タイムアウト時間:
10秒 - 失敗後は最大
3回まで再試行します(失敗後それぞれ1秒/2秒/4秒後に再試行します) - コールバックのレスポンスボディの形式はタスク照会インターフェースの返却形式と同一です
- コールバックアドレスが2xxステータスコードを返した場合は成功とみなし、それ以外のステータスコードは再試行をトリガーします
"https://your-domain.com/webhooks/video-task-completed"
レスポンス
動画タスクの作成に成功しました
タスク作成のタイムスタンプ
1757169743
タスクID
"task-unified-1757169743-7cvnl5zw"
実際に使用されたモデル名
"gemini-omni-1.2-flash-text-to-video"
タスクの具体的な種別
video.generation.task タスクの進捗率 (0-100)
0 <= x <= 1000
タスクの状態。作成APIは常に processing を返します。内部状態の pending もクライアントには processing として公開されます。
pending, processing, completed, failed "processing"
動画タスクの詳細情報
Show child attributes
Show child attributes
タスクの出力タイプ
text, image, audio, video "video"
使用量と課金情報
Show child attributes
Show child attributes