--- name: skill-video description: 触发词:生成视频、做视频、AI视频、文生视频、图生视频、Veo、Sora。用 Veo 3.1 生成视频,含费用预估与省钱策略(按官方2倍计价)。 --- # skill-video · Veo 3.1 视频生成 ## 一、先看这段(必读) **网关 `api.fmode.cn/v1/video/generations` 目前不可用。** new-api 的 Google Veo 插件(`plugins/tasks/google/plugin.js` 第 44 行)用 GET 查任务,而 Google 要求 POST `:fetchPredictOperation`,所以永远返回 `upstream task not found (HTTP 404)`。 **本技能绕过网关,直连上游 closeai。** 通道已验证可出片(H.264 / 1280×720 / 8s)。 - 上游 base:`https://api.openai-proxy.org/google` - 凭据:`/opt/data/.fmode/secrets/closeai.key`(渠道 3 的 key,勿外传) - 模型:`veo-3.1-generate-001`(标准)、`veo-3.1-fast-generate-001`(快速) --- ## 二、完整调用流程(三步) ### 第 1 步:提交生成 ```bash KEY=$(cat /opt/data/.fmode/secrets/closeai.key) curl -s -X POST "https://api.openai-proxy.org/google/v1beta/models/veo-3.1-generate-001:predictLongRunning" \ -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \ -d '{"instances":[{"prompt":"你的提示词"}],"parameters":{"aspectRatio":"16:9","durationSeconds":8}}' ``` 返回: ```json {"name":"projects/wv-s-gemini0910/locations/global/publishers/google/models/veo-3.1-generate-001/operations/xxxx"} ``` ### 第 2 步:轮询(★ 关键,别用 GET) ```bash OP="刚才返回的完整 name" curl -s -X POST "https://api.openai-proxy.org/google/v1beta/models/veo-3.1-generate-001:fetchPredictOperation" \ -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \ -d "{\"operationName\":\"$OP\"}" ``` **必须是 POST + `:fetchPredictOperation`。** GET 查会 404。 判断: - `"done": false` 或字段不存在 → 继续等(间隔 15-20 秒) - `"done": true` → 完成了,取视频 ### 第 3 步:取视频 ```json {"done":true,"response":{"raiMediaFilteredCount":0,"videos":[{"bytesBase64Encoded":"...","mimeType":"video/mp4"}]}} ``` base64 解码写 mp4。**注意 curl 要设 `--max-time 300`**,视频有 2-3MB,默认超时会截断 JSON。 ### 安全过滤 - `raiMediaFilteredCount > 0` → 有内容被安全策略拦了,看 `raiMediaFilteredReasons` - 视频为空 = 触发了内容审核,不扣费但也没结果 --- ## 三、参数详解 ### instances(必填) | 参数 | 类型 | 说明 | |---|---|---| | `prompt` | string | 文本提示词,英文效果更稳 | | `image` | object | 图生视频:`{"bytesBase64Encoded":"...","mimeType":"image/png"}` | **命令行图生视频:** ```bash # 用关键帧生成视频(锁定构图与人物) node scripts/gen.mjs \ --prompt "..." \ --image /path/to/keyframe.png \ --model standard --duration 8 \ --out /path/to/clip.mp4 ``` `--image` 支持 `.png` / `.jpg`,脚本会自动 base64 编码并识别 MIME。 ### parameters(影响费用,重点看) | 参数 | 可选值 | 默认 | 对费用影响 | |---|---|---|---| | `aspectRatio` | `16:9` / `9:16` | 16:9 | 不影响 | | `durationSeconds` | **4 / 6 / 8** | 8 | **★ 核心变量,按秒计费** | | `resolution` | `720p` / `1080p` | 720p | 1080p 更贵 | | `sampleCount` | 1-4 | 1 | **★ 成倍增加费用** | | `generateAudio` | true/false | — | 可能额外计费 | | `negativePrompt` | string | — | 不影响 | | `personGeneration` | `allow_adult` / `dont_allow` | — | 含人物时注意合规 | --- ## 四、费用计算(★ 技能必须自动算给用户看) ### 计价基准 | 模型 | 官方基础价 | 我方倍率 | 实际扣费 | |---|---|---|---| | veo-3.1-generate-001 | **$1.38 / 次(8s, 720p)** | 2.0× | **$2.76** | | veo-3.1-fast-generate-001 | **$0.35 / 次(8s, 720p)** | 2.0× | **$0.70** | > **倍率说明**:new-api 渠道当前 `group_ratio=2.5`,用户要求按 **官方 2 倍** 计。技能按 2.0 报预算,实际扣费以网关为准。 ### 估算公式 ``` 单条费用 ≈ 基础价 × (durationSeconds / 8) × (1080p ? 1.8 : 1.0) × sampleCount × 倍率 ``` ### 常用组合预算表(美元,已含 2 倍) | 组合 | 标准版 | 快速版 | |---|---|---| | 8s · 720p · 1条 | $2.76 | $0.70 | | 8s · 720p · 4条 | $11.04 | $2.80 | | 4s · 720p · 1条 | $1.38 | $0.35 | | 8s · 1080p · 1条 | $4.97 | $1.26 | | 6s · 720p · 1条 | $2.07 | $0.53 | ### ★ 省钱四原则(技能要主动建议) 1. **先 fast 试稿,定稿再用标准版** —— 省 75%。提示词没调好前,fast 足够看效果 2. **时长按需缩短** —— 4s 比 8s 便宜一半。叙事能压到 4s 就压 3. **一次多备选不如先出 1 条** —— 确认方向对了再加 `sampleCount` 4. **1080p 留到最后** —— 720p 定稿再出高清,差 1.8 倍 ### 技能必须做的费用前置动作 **任何一次生成前,先报预估费用和替代方案:** ``` 本次预估:8s · 720p · 标准版 · 1条 = $2.76(约 ¥20) 省钱替代:先用 fast 试稿 $0.70,确认后再用标准版 = 合计 $3.46(比直接出 2 条标准版省 37%) 是否继续? ``` --- ## 五、常见错误 | 报错 | 原因 | 解决 | |---|---|---| | `upstream task not found (HTTP 404)` | 用 GET 查了 | 改 POST `:fetchPredictOperation` | | `Invalid task protocol request` | 走了网关 `/v1/videos` | 直连上游,用 `/v1beta/models/{m}:predictLongRunning` | | `json.decoder.JSONDecodeError` | curl 超时截断 | `--max-time 300` | | `raiMediaFilteredCount > 0` | 触发安全审核 | 改提示词,避开人物/暴力/违禁 | | 401 | key 不对 | 重取 `/opt/data/.fmode/secrets/closeai.key` | --- ## 六、提示词写法 Veo 对英文更敏感。**中文提示词也能用,但英文出片质量更稳。** ### 6.1 两档用法:动态场景 vs 一场戏 **A 档|动态场景**(一条素材、一个动作) ``` [主体] + [动作] + [环境] + [镜头] + [光线] + [风格] ``` ``` A golden retriever running on the beach at sunset, tracking shot, warm golden hour light, cinematic, shallow depth of field ``` 适用:产品展示、氛围空镜、单动作素材。 **B 档|一场戏**(有情节、有人物关系、能连着看)★ 做剧集必须用这档 只写"一个人在做一件事",出片就是一张会动的画。**要让人看懂发生了什么事,必须写全时序和对白。** ``` 【场景】具体空间 + 光线条件 + 氛围 【开场状态】第一个瞬间画面是什么样 【人物】外观 + 姿态 + 在做什么(多人分别写) 【动作时序】按秒拆: 0-2s: ... 2-5s: ... 5-8s: ... 【对白】"说话人:台词"(Veo 3.1 会生成原生音频和口型) 【运镜】起始机位 → 结束机位 【光线】No sunlight, no cast shadows, flat diffused light 【风格】Cinematic 3D realistic style ``` **实例:** ``` A dark stone hut interior at night, the only light is a thin cold phosphorescent glow seeping through a crack in the wall. 0-2s: Camera tilts down slowly from the glowing crack to the stone floor, revealing a gaunt young man lying on his side, eyes open. 2-5s: His pupils slowly focus. His fingers twitch against the gravel. He pushes himself up slowly, body weak. 5-8s: He sits up, head turning toward the wooden door on the left. Outside, a low rumbling sound vibrates through the stone floor. Dialogue: (none, only breathing) Camera: tilt down from ceiling to floor level, ending in medium shot. No sunlight. No cast shadows. Flat diffused cold grey light. Cinematic 3D realistic style, shallow depth of field. ``` **B 档的六个关键点:** | 要点 | 说明 | |---|---| | **动作分秒写** | 0-2s / 2-5s / 5-8s,Veo 才能排出节奏 | | **写对白** | 用 `说话人:"台词"`,Veo 生成原生语音 + 口型 | | **写反应** | 一方说完,另一方给什么反应,这才是"戏" | | **运镜写起止** | "从天花板下摇到地面",不是只写"推镜" | | **多人分别写** | 每个人的位置、姿态、动作都要描述 | | **时长用 8 秒** | 4 秒装不下一场戏 | ### 6.2 图生视频能锁住什么 传 `--image` 后,Veo 会**保持参考图的构图、人物外观、光影**,只让画面动起来。 | 传参考图 | 不传参考图 | |---|---| | 人物长相稳定、构图可控 | AI 自由发挥,容易跑偏 | | 光影风格一致 | 光效可能突变 | | 适合连续剧集 | 适合单条素材 | **做剧集的标准流程**:先用图像模型(如 `gemini-2.5-flash-image`)出关键帧 → 确认画面 → 再用 `--image` 让关键帧动起来。 ### 6.3 让多个片段能连着看 **多段拼成一条片子,观众能看懂,靠这四件事:** 1. **人物一致**:所有片段用同一张人物参考图 2. **动作衔接**:上一段结尾的动作 = 下一段开场的状态 3. **情绪曲线**:平静 → 不安 → 恐惧 → 收束,不能全是平的 4. **时长够**:8 秒/段,4 秒只会出"动图" **自检**:把 N 段拼起来放一遍,观众能说出"发生了什么事"才算成立;只能说"看了几张画"就是失败。 --- ## 七、脚本 `scripts/gen.mjs` —— 一条命令完成 提交→轮询→下载: ```bash node scripts/gen.mjs --prompt "..." --duration 8 --ratio 16:9 --model fast --out /path/to.mp4 ``` 参数: - `--prompt` 必填 - `--duration` 4/6/8(默认 8) - `--ratio` 16:9 / 9:16 - `--model` standard / fast(默认 fast,省钱) - `--resolution` 720p / 1080p - `--count` 1-4(默认 1) - `--estimate-only` 只算钱不生成 --- ## 八、网关支持情况的实测结论(2026-11-05 验证) **网关 `api.fmode.cn` 的视频模型只有 2 个,且当前都不可用:** | 模型 | 状态 | |---|---| | `veo-3.1-generate-001` | ❌ 任务查询 404(插件 bug) | | `veo-3.1-fast-generate-001` | ❌ 同上 | **以下模型网关均未接入**(全部返回 503,不是名字写错,是通道不存在): `jimeng-3.0` / `jimeng-video` / `seedance-1.0` / `seedance-pro` / `doubao-seedance-1-0-pro` / `doubao-seedance-1-0-lite` / `kling-v2` / `minimax-hailuo-02` / `wan-2.5` > 有人会说「即梦的 Seedance」,注意区分: > **Seedream(doubao-seedream-4-0)是图像模型,网关支持且正常**(走 `/v1/images/generations`)。 > **Seedance 是视频模型,网关没有。** **结论:视频生成只能用 Veo 3.1,且必须直连上游 closeai,不能走网关。** ### 图像走网关,视频走上游 如果任务需要「图片 + 视频」混合: | 类型 | 走哪里 | 端点 | |---|---|---| | 图像 | 网关(走计费) | `POST https://api.fmode.cn/v1/images/generations`,模型 `doubao-seedream-4-0-250828` | | 视频 | 上游直连(不走计费) | 本文档第二节流程 |