@aicopycoders/exodus 2026.7.200-beta.6 → 2026.7.200-beta.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,14 @@
1
1
  # CAST — a generative grammar for video ad formats
2
2
 
3
+ > **SUPERSEDED (2026-07, map #528):** the 4-axis CAST grammar below is superseded by the
4
+ > 5-knob **CASTS** system — **Conceit · Actor · Style · Terrain · Setup** — whose canonical
5
+ > terms live in the repo-root **`CONTEXT.md`** glossary. CASTS adds the **Setup** knob (frame
6
+ > arrangement / opening / pacing / overlays) and restructures **Actor** as Role × Look; the
7
+ > product's shelf registry and Rig entity (#538) are built on those terms. This file's
8
+ > thinking still carries forward — conceit = the engine room, novelty vs diversity knobs,
9
+ > and the conceit-primer idea (now the registry's per-value `promptGuidance`) — but for
10
+ > terminology and knob shapes, defer to `CONTEXT.md`.
11
+
3
12
  > Part of the creative-strategy framework set; compact index lives in `exodus-strategist`.
4
13
  > A faceted system for **decoding any video ad** into its parts and **generating infinite new
5
14
  > ones** — while staying human-readable. This is a *thinking* framework: the base Exodus CLI
@@ -0,0 +1,207 @@
1
+ # Kie.ai Video Model Catalog — Research Findings
2
+
3
+ **Research date:** 2026-07-13
4
+ **For:** Wayfinder ticket #529 (map #528 — video in the Workflow Builder)
5
+ **Author:** research agent
6
+ **Method:** Primary sources = https://kie.ai + https://docs.kie.ai (model + API-reference pages). Marketing pages under `kie.ai/*` (pricing, market) return **HTTP 403 to automated fetch**, so capability facts come from the `docs.kie.ai` model pages (fetchable) and pricing comes from Kie-published/secondary sources anchored to Kie's stated **$0.005/credit** rate. Anything I could not pin to a primary Kie page is flagged **[verify]**. Local code claims come from reading this repo + the `archive/pixar-v2` git tag.
7
+
8
+ > **Caveat on pricing precision:** Kie updates model prices frequently and the canonical `kie.ai/pricing` / `kie.ai/market` pages block automated fetch. The per-clip USD figures below are directionally correct (and internally consistent with the $0.005/credit anchor), but **confirm the exact credit cost on the live pricing page / each model's doc page before hard-coding any number in the app.**
9
+
10
+ ---
11
+
12
+ ## 1. Executive summary + recommended v1 list
13
+
14
+ Kie.ai is a **unified multi-model gateway**: one API key, one async job pattern (`/api/v1/jobs/createTask` → poll `recordInfo` or receive a `callBackUrl` webhook), 30+ video models switchable by a `model` slug. It exposes today (video): **Google Veo 3 / 3.1**, **Kling (2.1, 3.0)**, **ByteDance Seedance (2.0, 2.0 Fast, 2.5, 1.5 Pro)**, **OpenAI Sora 2 / Sora 2 Pro**, **Hailuo/MiniMax (2.3 Pro/Standard)**, **Wan (2.6 family)**, **Runway**, plus Grok Imagine. All four "big" families now support **image-to-video** and most now support **native audio** — a material change since the pixr era.
15
+
16
+ **Recommended v1 model list for the Video-node picker** (criteria: image-to-video quality, native audio, price, reliability):
17
+
18
+ | Rank | Model | `model` slug | Why | Native audio | I2V |
19
+ |------|-------|--------------|-----|:---:|:---:|
20
+ | **Default** | **Veo 3.1 Fast** | `veo3_fast` | Best price/quality with native dialogue+SFX audio; first-frame + first/last-frame + reference I2V; 9:16 & 16:9; battle-tested endpoint. ~$0.30–0.40 / 8s. | ✅ | ✅ |
21
+ | 2 | **Seedance 2.0** | `bytedance/seedance-2` | Strongest multimodal keyframe control (first/last frame + up to 9 reference images + reference video/audio), native audio default-on, cheap, and it's the exact model family the old pixr clip stage already drove. | ✅ | ✅ |
22
+ | 3 | **Kling 3.0** | `kling-3.0/video` | Multi-shot storytelling + `@element` character-consistency (2–4 ref images/element, max 3), up to 15s, native sound, up to 4K. Best for character-driven multi-shot ads. | ✅ | ✅ |
23
+ | 4 (premium) | **Veo 3.1 Quality** | `veo3` | Highest fidelity when budget allows (~$1.25–2.00 / 8s). Same param surface as Fast. | ✅ | ✅ |
24
+ | 5 (premium) | **Sora 2 / Pro** | `sora-2` / `sora-2-pro` | Best physics/realism + synced native audio; pricier, no free tier. Good "hero clip" option. | ✅ | ✅ |
25
+
26
+ **Default = Veo 3.1 Fast (`veo3_fast`)**: it is the sweet spot of native-audio quality, image-to-video support (single keyframe *and* first/last frame *and* reference), vertical-native output for ad formats, and low cost, on Kie's most mature video endpoint.
27
+
28
+ **Native-audio landscape:** Veo 3.1, Kling 3.0, Seedance 2.0, Sora 2, and Hailuo 2.3 all generate audio natively now. This is the single biggest shift vs. the pixr pipeline, which ran Seedance **silent** and overlaid ElevenLabs VO. For v1 the native-audio toggle should default **on** for models that support it, with a clear "silent (BYO audio)" option that maps to each model's `generate_audio:false` / `sound:false` flag.
29
+
30
+ **Pricing ballpark:** credits bill at **$0.005/credit (200 credits = $1)**. An 8s Veo 3 Fast clip ≈ $0.30–0.40; Veo 3 Quality ≈ $1.25–2.00; Kling ≈ $0.07/s; Seedance 2.0 Fast ≈ $0.02/s; Hailuo 2.3 1080p ≈ $0.40/clip. Sora 2 is the priciest household name.
31
+
32
+ **API pattern:** async job — `POST /api/v1/jobs/createTask` returns a `taskId`; then either poll `GET /api/v1/jobs/recordInfo?taskId=...` (states: `waiting → queuing → generating → success|fail`) or supply `callBackUrl` for a webhook. Rate limit ~**20 create requests / 10s / account**. Errors: 401 unauthorized, 402 insufficient credits, 429 rate-limited, 500 server error (Veo also has a dedicated `/api/v1/veo/generate` endpoint).
33
+
34
+ **Biggest change vs the pixr Kie client:** (1) Seedance now defaults to **native audio on** and adds first/last-frame + up to 9 reference images + reference video/audio (pixr hard-coded `generate_audio:false` and one `reference_image_urls`); (2) the whole modern video roster (Veo 3.1, Kling 3.0, Sora 2, Hailuo, Wan) is available through the *same* unified `createTask` the pixr client already spoke — so adding models is mostly a slug + param-map change, not a new transport.
35
+
36
+ ---
37
+
38
+ ## 2. Per-model capability table
39
+
40
+ All models are invoked through `POST https://api.kie.ai/api/v1/jobs/createTask` with `{ model, input, callBackUrl }` **unless noted** (Veo also has a dedicated endpoint). "Upstream" = capability from the provider's own docs, not confirmed on Kie's page (Kie's exposed params may be a subset).
41
+
42
+ ### Google Veo 3.1 — `veo3` / `veo3_fast` / `veo3_lite`
43
+ Source: https://docs.kie.ai/veo3-api/generate-veo-3-video , https://docs.kie.ai/veo3-api/quickstart , https://docs.kie.ai/veo3-api/extend-video
44
+
45
+ - **Endpoint:** dedicated `POST https://api.kie.ai/api/v1/veo/generate` (also surfaced in the Market). Extend endpoint exists for lengthening clips.
46
+ - **Image-to-video:** ✅ `imageUrls` array (**1–3 images**). `generationType`: `TEXT_2_VIDEO`, `FIRST_AND_LAST_FRAMES_2_VIDEO`, `REFERENCE_2_VIDEO`. So it supports single keyframe, first+last frame, and reference-image (character/style) modes.
47
+ - **Native audio:** ✅ "All videos ship with background audio by default." Veo 3 is known for synced dialogue + SFX (upstream).
48
+ - **Duration:** `4`, `6`, or `8` s (default 8).
49
+ - **Aspect ratio:** `16:9`, `9:16`, `Auto` (default 16:9).
50
+ - **Resolution:** `720p`, `1080p`, `4k` (default 720p).
51
+ - **Other params:** `watermark`, `enableTranslation` (auto-translate prompt to EN), `callBackUrl`, `seeds` [verify].
52
+ - **Tiers:** `veo3` (quality), `veo3_fast` (default, cheaper), `veo3_lite` (cheapest/high-volume).
53
+
54
+ ### Kling 3.0 — `kling-3.0/video`
55
+ Source: https://docs.kie.ai/market/kling/kling-3-0 , https://docs.kie.ai/market/kling/motion-control-v3
56
+
57
+ - **Image-to-video:** ✅ `image_urls` = first/last frame images (optional when using element references).
58
+ - **Reference / character consistency:** ✅ `@element_name` syntax in the prompt; **max 3 elements** per task; image elements accept **2–4 image URLs** (JPG/PNG, ≤10MB each) for character consistency across shots. Also a dedicated **motion-control** variant.
59
+ - **Native audio:** ✅ `sound` boolean (defaults **true** in multi-shot mode); native audio up to 15s.
60
+ - **Multi-shot:** ✅ `multi_shots` boolean → pass an **array of prompts** for multi-shot storytelling.
61
+ - **Duration:** integer **3–15** s.
62
+ - **Aspect ratio:** `16:9`, `9:16`, `1:1` (auto-adapts when `image_urls` given).
63
+ - **Resolution (`mode`):** `std` = 720p, `pro` = 1080p, `4K` = 2160p (per AR: 16:9 / 9:16 / 1:1).
64
+
65
+ ### ByteDance Seedance 2.0 — `bytedance/seedance-2` (+ `-fast`, `2.5`, `1.5-pro`)
66
+ Source: https://docs.kie.ai/market/bytedance/seedance-2 , https://docs.kie.ai/market/bytedance/seedance-2-fast
67
+
68
+ - **Image-to-video:** ✅ `first_frame_url` and/or `last_frame_url` (URL or `asset://{assetId}`). Three mutually-exclusive modes: first-frame I2V, first+last-frame I2V, or multimodal reference generation.
69
+ - **Reference / character consistency:** ✅ `reference_image_urls` (**max 9**; jpeg/png/webp/bmp/tiff/gif), `reference_video_urls` (**max 3**, 2–15s, mp4/mov), `reference_audio_urls` (**max 3**, 2–15s, wav/mp3). This is the richest keyframe/reference surface of any model here.
70
+ - **Native audio:** ✅ `generate_audio` boolean, **default `true`** (was run silent by pixr).
71
+ - **Duration:** **4–15** s (default 5).
72
+ - **Aspect ratio:** `1:1`, `4:3`, `3:4`, `16:9`, `9:16`, `21:9`, `adaptive` (default 16:9).
73
+ - **Resolution:** `480p`, `720p`, `1080p`, `4k` (default 720p).
74
+ - **Other:** `nsfw_checker`, `web_search`, `prompt` 3–20,000 chars, `callBackUrl`.
75
+ - **`bytedance/seedance-2-fast`:** cheaper/faster variant, same param family.
76
+
77
+ ### OpenAI Sora 2 — `sora-2` / `sora-2-pro` (+ Characters)
78
+ Source: https://docs.kie.ai/market/sora2/... (index confirmed via search; individual pages render as SPA and 404'd to automated fetch — **capability confirmed, param names [verify] on live docs**)
79
+
80
+ - **Variants:** `sora-2` (standard), `sora-2-pro` (higher quality), plus **Characters** and **Image-to-Video** / **Text-to-Video** modes.
81
+ - **Image-to-video:** ✅ (dedicated Image-to-Video page).
82
+ - **Native audio:** ✅ synced dialogue + ambient (Sora 2's headline feature, upstream).
83
+ - **Strength:** best physics/realism. No free tier; priciest of the household names.
84
+ - **Duration / AR / resolution:** [verify on the specific `sora2` doc pages].
85
+
86
+ ### Hailuo / MiniMax 2.3 — `hailuo/...` (e.g. `2-3-image-to-video-pro`)
87
+ Source: https://docs.kie.ai/market/hailuo/2-3-image-to-video-pro (via search)
88
+
89
+ - **Image-to-video:** ✅ dedicated I2V Pro + Standard tiers.
90
+ - **Native audio:** ✅ (2.3 generation) [verify exact flag].
91
+ - **Strength:** character animation + facial expression / talking-head, avatar content.
92
+ - **Pricing:** ~80 credits (~$0.40) for a 1080p clip [verify].
93
+
94
+ ### Wan 2.6 — `wan/2.6-*`
95
+ Source: https://kie.ai/market/image-to-video (via search)
96
+
97
+ - Variants: `Wan 2.6 Image-to-Video`, `Text-to-Video`, `Video-to-Video`, `2.6-flash-image-to-video`, `2-6-flash-video-to-video`.
98
+ - **Image-to-video:** ✅. Native audio / duration / AR: [verify on live docs]. Budget option.
99
+
100
+ ### Runway — `runway/...`
101
+ Source: https://docs.kie.ai/runway-api/quickstart
102
+
103
+ - Dedicated Runway API surface for high-quality I2V/T2V. Params (Gen-3/Gen-4 family) [verify on live docs]. Traditionally **no native audio** (upstream). Lower priority for v1.
104
+
105
+ ---
106
+
107
+ ## 3. Pricing (credits → USD)
108
+
109
+ **Credit rate (primary anchor):** Kie bills at **$0.005 per credit** → **200 credits = $1.00**. Different models bill per-second, per-clip, or per-image; the unit is shown per model on the pricing page.
110
+ Source: https://kie.ai/pricing (403 to fetch), corroborated by https://skywork.ai/... and https://kie.ai/v3-api-pricing.
111
+
112
+ | Model | Kie price (per clip / rate) | Credits | Notes |
113
+ |-------|------------------------------|---------|-------|
114
+ | **Veo 3 / 3.1 Fast** | ~**$0.30–0.40** / 8s w/ audio | 60–80 | Recent update lowered Fast to ~60 cr ($0.30) [verify] |
115
+ | **Veo 3 / 3.1 Quality** | ~**$1.25–2.00** / 8s w/ audio | 250–400 | Recent update lowered to ~250 cr ($1.25) [verify] |
116
+ | **Kling 2.1** | Std **$0.125**/5s · Pro **$0.25**/5s · Master **$0.80**/5s | 25 / 50 / 160 | Kling 3.0 similar tiered ($0.07/s cited) [verify] |
117
+ | **Seedance 2.0 Fast** | ~**$0.022**/s (~$0.11 for 5s) | ~4.4/s | Cheapest production-grade [verify] |
118
+ | **Seedance 2.0** | between Fast and premium [verify] | — | Native audio default-on |
119
+ | **Hailuo 2.3** | ~**$0.40** / 1080p clip | ~80 | [verify] |
120
+ | **Sora 2 / Pro** | priciest household name [verify] | — | No free tier |
121
+ | **Runway / Wan** | budget–mid [verify] | — | — |
122
+
123
+ > Kie claims ~30% below official API pricing on most models, up to 60–70% on select high-demand models. **Treat every USD figure above as [verify] against the live pricing page before hard-coding.**
124
+
125
+ ---
126
+
127
+ ## 4. API shape
128
+
129
+ **Unified async job pattern** (all Market models):
130
+
131
+ 1. **Create:** `POST https://api.kie.ai/api/v1/jobs/createTask`
132
+ Headers: `Authorization: Bearer <KIE_API_KEY>`, `Content-Type: application/json`
133
+ Body: `{ "model": "<slug>", "input": { ...model params... }, "callBackUrl": "<optional webhook>" }`
134
+ Returns: `{ code, msg, data: { taskId } }`.
135
+ 2. **Get result — two options:**
136
+ - **Poll:** `GET https://api.kie.ai/api/v1/jobs/recordInfo?taskId=<id>` → `data.state` ∈ `waiting | queuing | generating | success | fail`; on `success`, `data.resultJson` is a JSON string containing `resultUrls[]` (video URL). On `fail`, `data.failCode` / `data.failMsg`.
137
+ - **Webhook:** supply `callBackUrl` in createTask; Kie POSTs completion, "eliminating the need for polling" (recommended for production).
138
+ 3. **Credit check:** `GET https://api.kie.ai/api/v1/chat/credit`.
139
+
140
+ **Veo exception:** Veo 3.x also has a **dedicated endpoint** `POST https://api.kie.ai/api/v1/veo/generate` (+ get-details + extend), separate from the generic jobs endpoint.
141
+
142
+ **Rate limits:** ~**20 generation requests per 10 seconds per account** (from the Getting-Started guide).
143
+
144
+ **Error / status semantics:** `401` unauthorized (bad key), `402` insufficient credits, `429` rate-limited, `500` server error. Job-level failures surface as `state:"fail"` + `failCode`/`failMsg` (Kie relays upstream provider errors, incl. safety blocks, in `failMsg`). HTTP 200 on createTask means **accepted, not complete**.
145
+
146
+ Sources: https://docs.kie.ai/ , https://docs.kie.ai/market/quickstart , https://docs.kie.ai/market/common/get-task-detail
147
+
148
+ ---
149
+
150
+ ## 5. Diff vs the prior integration (pixr client, `archive/pixar-v2`)
151
+
152
+ The torn-out pixr pipeline's Kie client lives at **`archive/pixar-v2:scout/src/pixar/kie-client.ts`** (also `archive/pixar-v2:scout/src/image-ads/image-gen.ts` and the PowerShell reference `archive/pixar-v2:contrib/mcastelli99/2026-05-13/code/generate_videos_daily_glide.ps1`).
153
+
154
+ **What the pixr client used:**
155
+ - **Same transport** we'd reuse today: unified `POST /api/v1/jobs/createTask` + poll `GET /api/v1/jobs/recordInfo`, Bearer auth, `resultJson.resultUrls[0]`. Confirmed identical to the current image stack.
156
+ - **Video model:** `bytedance/seedance-2` (`MODEL_VIDEO_SEEDANCE`), called via `buildClipRequest` with:
157
+ `{ prompt, aspect_ratio: "9:16", resolution: "720p", duration, generate_audio: false, reference_image_urls: [<one image>] }`.
158
+ **Audio was hard-coded OFF** — with defense-in-depth throwing if a caller passed `generateAudio !== false` — per Mario's "AUDIO_ARCHITECTURE.md" (Seedance audio drifted pacing). Audio came from a **separate ElevenLabs direct call** (`kieGenerateVoiceover` hits `api.elevenlabs.io/v1/text-to-speech/{voice_id}` directly, **not** Kie — an earlier attempt at ElevenLabs-via-Kie 422'd on the slug `elevenlabs/text-to-speech-multilingual-v2`).
159
+ - **Image models:** `gpt-image-2-text-to-image` (T2I) and `gpt-image-2-image-to-image` (I2I, via `input_urls: [refUrl]`), with `aspect_ratio`, `output_format:"png"`, `resolution:"1K"`.
160
+ - **Retry/robustness:** exponential backoff on transient 5xx / "try again later" / rate-limit, each retry minting a fresh task; video poll timeout 20 min, image 7 min.
161
+
162
+ **What has changed in Kie's current API vs that client:**
163
+ 1. **Seedance native audio is now default-ON.** Current `bytedance/seedance-2` defaults `generate_audio:true`; the pixr "silent + overlay ElevenLabs" architecture is now **optional**, not required. v1 can drop the separate VO stage for models with native audio (or keep silent mode as an explicit toggle).
164
+ 2. **Seedance keyframe/reference surface expanded dramatically.** Then: one `reference_image_urls[]`. Now: `first_frame_url` + `last_frame_url` (true first/last-frame I2V) **plus** `reference_image_urls` (max 9), `reference_video_urls` (max 3), `reference_audio_urls` (max 3), `web_search`, `nsfw_checker`. Duration widened to 4–15s, resolution adds 480p/1080p/4k, AR adds 1:1/4:3/3:4/21:9/adaptive.
165
+ 3. **The whole modern roster is now on the same endpoint.** pixr only ever drove Seedance for clips. Today Veo 3.1 (also its own `/veo/generate`), Kling 3.0, Sora 2, Hailuo 2.3, Wan 2.6 are all reachable via the same `createTask` + slug the pixr client already spoke — so the Video-node picker is largely a **slug + input-schema map**, not new transport code.
166
+ 4. **Webhook callbacks** (`callBackUrl`) are now first-class and recommended over polling for production; pixr was poll-only.
167
+ 5. **ElevenLabs-via-Kie** remains awkward (pixr went direct); if the storyboard ever needs standalone VO, prefer the model's native audio or a direct ElevenLabs call rather than routing TTS through Kie.
168
+
169
+ ---
170
+
171
+ ## 6. Current image-node render stack (Scene Frames will likely reuse this)
172
+
173
+ The **working tree** (not the archive) drives Kie for images in two places, both via the identical unified `createTask` + `recordInfo` poll pattern:
174
+
175
+ - **`src/lib/modules/providers/image-generator/kie-nano-banana.ts`** — `KieNanoBananaProvider`, slug `"nano-banana-pro"` but **actually targets `gpt-image-2-text-to-image`** (`DEFAULT_MODEL`). Input: `{ prompt, nsfw_checker:false }` only — it does **not** send aspect_ratio/size (comment: model ignores them). createTask → poll `recordInfo` (2s interval, 120s timeout) → `resultJson.resultUrls[0]`. Maps safety failures to `SafetyFilterError`.
176
+ ⚠️ **Naming mismatch worth flagging:** the provider is called "nano-banana-pro" but sends the `gpt-image-2-text-to-image` slug. Kie *also* offers real `nano-banana` and `seedream-4` image models — if Scene Frames wants Nano Banana quality, it must send the actual nano-banana slug, not this provider as-is.
177
+ - **`src/lib/meme/kie.ts`** — meme generator's image client. Same `gpt-image-2-text-to-image` slug, but sends `{ prompt, aspect_ratio:"1:1", resolution:"1K", output_format:"PNG" }`. Strict BYOK (member's own Kie key, no env fallback), 5-min poll timeout, one-shot 429 backoff.
178
+
179
+ **Endpoint shape confirmed in-repo:** `POST https://api.kie.ai/api/v1/jobs/createTask` + `GET https://api.kie.ai/api/v1/jobs/recordInfo?taskId=...`, Bearer auth, `resultJson.resultUrls[0]`. **This is the same transport a Video-node would use** — the Scene Frames stage can reuse this createTask+poll helper wholesale and only swap the model slug + input schema (and should pass `aspect_ratio`/`image_size` to models that honor them, unlike gpt-image-2).
180
+
181
+ Other Kie touch-points in the working tree (for reference): `convex/pipelineKeys.ts`, `convex/userKeys.ts`, `convex/lib/byok.ts` (BYOK key storage/resolution), `convex/doctor.ts` (key health check), `src/app/(dashboard)/settings/_components/pipeline-keys-tab.tsx` (Settings → Keys UI).
182
+
183
+ ---
184
+
185
+ ## Sources
186
+
187
+ Primary (Kie):
188
+ - https://docs.kie.ai/ (Getting Started — API pattern, rate limit 20/10s)
189
+ - https://docs.kie.ai/market/quickstart (unified createTask / recordInfo / callBackUrl)
190
+ - https://docs.kie.ai/market/common/get-task-detail
191
+ - https://docs.kie.ai/veo3-api/generate-veo-3-video , /veo3-api/quickstart , /veo3-api/extend-video (Veo 3.1)
192
+ - https://docs.kie.ai/market/kling/kling-3-0 , /market/kling/motion-control-v3 (Kling 3.0)
193
+ - https://docs.kie.ai/market/bytedance/seedance-2 , /market/bytedance/seedance-2-fast (Seedance 2.0)
194
+ - https://docs.kie.ai/market/sora2/... (Sora 2 — index confirmed; per-page params [verify])
195
+ - https://docs.kie.ai/market/hailuo/2-3-image-to-video-pro (Hailuo 2.3)
196
+ - https://docs.kie.ai/runway-api/quickstart (Runway)
197
+ - https://kie.ai/ , https://kie.ai/market , https://kie.ai/pricing , https://kie.ai/v3-api-pricing (403 to automated fetch — pricing via secondary corroboration)
198
+
199
+ Pricing corroboration (secondary, anchored to Kie's $0.005/credit):
200
+ - https://skywork.ai/skypage/en/Kie.ai-API...1976113187525816320 (credit rate $0.005; error codes 401/402/429/500)
201
+ - https://devtk.ai/en/blog/ai-video-generation-pricing-2026/
202
+ - https://fluxnote.io/guides/ai-video-model-pricing-comparison-2026
203
+ - https://evolink.ai/blog/best-ai-video-generation-models-2026-pricing-guide
204
+
205
+ Local code (this repo):
206
+ - Working tree: `src/lib/modules/providers/image-generator/kie-nano-banana.ts`, `src/lib/meme/kie.ts`
207
+ - Archive tag: `archive/pixar-v2:scout/src/pixar/kie-client.ts`, `archive/pixar-v2:scout/src/image-ads/image-gen.ts`
@@ -0,0 +1,217 @@
1
+ # Lip-Sync Alternatives — getting a CHOSEN voice out of the on-screen actor's mouth
2
+
3
+ **Research date:** 2026-07-14
4
+ **For:** Unblocking voice-paired talking-head scene clips after Kie's `gemini-omni-video` `audio_ids` path started returning "flagged by Website as violating content policies" on every render (GitHub issue #561).
5
+ **Goal:** A chosen voice — ideally an ElevenLabs voice the user already uses — spoken by the on-screen actor, lip-synced, in each per-scene clip (usually 9:16, 720p, 4–10 s), then stitched as today.
6
+ **Method:** Primary sources = first-party API docs (ai.google.dev, sync.so/docs, fal.ai model pages, developers.heygen.com, d-id.com, hedra.com, replicate.com) plus Kie's own pages. Kie's marketing pages (`kie.ai/*`) and `kie.ai/market` return **HTTP 403 to automated fetch**; several `docs.kie.ai/market/...` model pages 404 at the guessed path, so some Kie-specific slugs/prices are corroborated from mirror hosts (fal, WaveSpeed, Replicate, Atlas Cloud) that run the same upstream model and are flagged accordingly. Anything not pinned to a first-party doc in this session is marked **[unverified]**.
7
+ **Confidence labels:** `[docs]` = first-party API doc · `[mirror]` = same upstream model on another host's doc (fal/Replicate/WaveSpeed) · `[vendor]` = vendor marketing/help page · `[unverified]` = could not confirm from a primary source this session.
8
+
9
+ ---
10
+
11
+ ## TL;DR — recommendation table
12
+
13
+ The two integration shapes matter more than the model list:
14
+
15
+ - **RETARGET** = feed an *already-rendered* scene clip (video) + an audio track → model reanimates only the mouth, preserves background/body/camera. **Drops into the existing per-scene render → stitch flow as a new post-render step. No change to the video model.** This is the fit for our pipeline.
16
+ - **GENERATE** = feed an *image* (a portrait / first frame) + audio → model animates a talking head from scratch. This **replaces** the Kie video model for talking scenes (loses the motion/scene the video model produced).
17
+
18
+ | Rank | Path | Shape | Existing BYOK? | ~Cost, 9:16 720p, ~8 s | Voice source | Moderation risk | Verdict |
19
+ |---|---|---|---|---|---|---|---|
20
+ | **1** | **Kie `volcengine/video-to-video-lip-sync`** (retarget rendered clip) | RETARGET | ✅ **Kie BYOK exists — same jobs API** | not documented — surfaces via `creditsConsumed` `[docs]` | any audio file (our Voiceover node's ElevenLabs MP3s, ≤10 MB) | Low (edits our own footage) — **live-probe before building** | **Zero new provider; verified post-research (see addendum). Try first.** |
21
+ | **2** | **sync.so `lipsync-2`** (retarget rendered clip) | RETARGET | ❌ new provider (but built-in ElevenLabs TTS) | ~**$0.32** ($0.04/s) `[docs]` | video's own audio **or** ElevenLabs voiceId+script native in-API | Low (edits our own footage) | **Best quality reputation; fallback if Volcengine quality/pricing disappoints** |
22
+ | **2b** | **Kling Lip-Sync A2V** (`kwaivgi/kling-lip-sync`, retarget) via fal/Replicate | RETARGET | ❌ new provider (NOT in Kie's catalog — verified via docs index) | ~**$0.11–0.15**/run ($0.014/input-s, 5 s increments) `[mirror]` | any audio file (drop in ElevenLabs MP3) | Low | Cheapest retarget, but needs fal/Replicate BYOK |
23
+ | 3 | **fal `veed/lipsync`** / **`fal-ai/latentsync`** (retarget) | RETARGET | ❌ new provider | veed ~$0.24 ($0.15/5 s); latentsync **$0.20 flat ≤40 s** `[docs]` | any audio file | Low | Cheap retarget fallbacks; latentsync is the price floor |
24
+ | 4 | **Kie InfiniteTalk** (`infinitalk/image-to-talking-video`) | GENERATE | ✅ **Kie BYOK exists** | ~**$0.30**/clip (10 credits/5 s @720p) `[vendor]` | uploaded audio (ElevenLabs MP3), ≤15 s | Low–med | **Only option that reuses existing BYOK — but replaces the video model, image-driven** |
25
+ | 5 | **Kie OmniHuman 1.5** (`bytedance/omni-human`) | GENERATE | ✅ Kie BYOK exists | ~$0.12/s upstream `[mirror]` | uploaded audio | Low–med | Higher-fidelity generate-from-photo on existing BYOK |
26
+ | 6 | Hedra Character-3 | GENERATE | ❌ new provider | subscription credits, ~$15–75/mo | uploaded audio / text+TTS | Low | Best-in-class generate quality; sub model, not per-clip PAYG |
27
+ | 7 | HeyGen / D-ID photo-avatar | GENERATE | ❌ new provider | ~$0.05/s ($3/min) `[vendor]` | uploaded audio or TTS | Low | Presenter/UGC avatars; least "our footage" |
28
+ | — | **Google Gemini Omni direct** (bypass Kie) | GENERATE, **no audio input** | ❌ new provider | ~$0.10–0.75/s (Veo tiers) `[docs]` | **none — cannot supply a voice** | n/a | **Ruled out: API explicitly forbids audio upload & voice editing** |
29
+ | — | Seedance `reference_audio_urls` (Kie) | (not lip-sync) | ✅ Kie | — | voice-style *reference*, not spoken content | — | **Not a lip-sync/voice-content lever — see note** |
30
+
31
+ **Bottom line:** the goal ("chosen ElevenLabs voice, lip-synced, on the actor already in our rendered clip") is a **RETARGET** problem, and the video-generation APIs (including Gemini Omni direct) don't solve it. Rank 1–3 keep the Kie video model exactly as-is and add one post-render lip-sync call per scene, then mux/stitch. **sync.so is the standout** because it retargets our rendered clip *and* has ElevenLabs TTS built into the same request. If avoiding a brand-new provider is paramount, Kie InfiniteTalk (rank 4) is the only path on existing BYOK — but it's generate-from-image, so it changes what the talking scenes look like.
32
+
33
+ ---
34
+
35
+ ## Branch 1 — Google Gemini / Omni video API directly (bypass Kie)
36
+
37
+ **Source (first-party):** https://ai.google.dev/gemini-api/docs/omni · pricing https://ai.google.dev/gemini-api/docs/pricing
38
+
39
+ ### Does it accept audio input for the generated speech / lip-sync? **No.**
40
+ The Gemini Omni video docs state plainly `[docs]`:
41
+ - *"Uploading audio references is unsupported in the current version of the API."*
42
+ - *"Voice editing is not supported."*
43
+
44
+ The documented request accepts only: **text** (`{"type":"text","text":"…"}`), **images** (`{"type":"image","data":<base64>,"mime_type":"image/jpeg"}`), **videos for editing** (`{"type":"document","uri":<video_file_uri>}`), and **prior generated-video references** via a `previous_interaction_id` parameter. **There is no audio input parameter anywhere in the schema.** `system instructions`, `temperature`, `top_p`, and `negative prompts` are also unsupported (negatives must be embedded in the prompt). `[docs]`
45
+
46
+ **Consequence:** the first-party API **cannot** take an ElevenLabs voice, an uploaded audio file, or a voice character to drive speech/lip-sync. It generates whatever voice it wants natively. This is the same capability gap that Kie's `audio_ids` param was papering over — and going direct removes the param entirely. **Branch 1 does not meet the goal.**
47
+
48
+ ### Moderation — and why Kie's flag is Google-side
49
+ The Omni docs document these safety controls `[docs]`:
50
+ - *"Content safety filters are applied to both input prompts and generated video (and depend on your region)."*
51
+ - *"Prompts that violate usage policies will be blocked."*
52
+ - *"Uploading and editing images containing certain recognizable people is not supported."*
53
+ - *"Uploading and editing images containing minors is not supported in [the] EEA, Switzerland, and the United Kingdom."*
54
+ - English is *"fully supported"*; other languages *"have not been evaluated."*
55
+
56
+ The "flagged by **Website**" wording our probes saw, combined with "prompts that violate usage policies will be blocked" applying to the *underlying Gemini/Omni model*, is consistent with a **Google-side content-policy block on the audio/voice pathway**, not a Kie quirk — Kie's `audio_ids` (preset voice characters) likely routes into a voice feature Google's safety layer rejects for this prompt class, or Kie is bolting on a voice step the first-party model doesn't sanction. Since the first-party API forbids audio input outright, there is **no direct-API config that re-enables voice-paired renders**. `[docs]` + reasoned inference.
57
+
58
+ ### Access, pricing, availability
59
+ - **Video models on the Gemini API are the Veo family**, billed per second of output. Google's list rate for **Veo 3.1** is **$0.75/s** (~$6.00 / 8 s clip) on the Gemini API and Vertex; **Veo 3.0** was $0.50/s video-only / $0.75/s with audio (deprecated, shutdown 2026-06-30). A **standard-tier 720p** path bills ~**5,792 tokens/s of 720p video ≈ $0.10/s** [unverified exact tier mapping]. `[docs]` (pricing page) + `[vendor]` calculators.
60
+ - **Vertex AI vs Gemini API:** same Veo models, same "no audio upload" capability for generation; Vertex adds enterprise auth/quota but does **not** add an audio-input lip-sync mode [unverified beyond Veo parity].
61
+ - **vs Kie:** Kie's ~63 credits (~$0.32) per 4 s 720p clip is competitive with — often cheaper than — Google-direct Veo, and Kie's unified async job API is already integrated. Going direct means a **new "Google AI" BYOK provider**, a Files API upload step for image inputs, and Google's own async long-running-operation polling — **material new surface for zero gain on the voice goal.**
62
+
63
+ **Branch 1 verdict: ruled out.** The capability we need (supply-your-own-voice / lip-sync to given audio) is explicitly not in the first-party API. Do not build a Google-direct integration to solve #561.
64
+
65
+ ---
66
+
67
+ ## Branch 2 — lip-sync-to-audio models (render clip → ElevenLabs MP3 → retarget the mouth)
68
+
69
+ Ordered by fit. **RETARGET** models take our rendered clip; **GENERATE** models take a still image.
70
+
71
+ ### 2a. sync.so (Sync Labs) — `lipsync-2` / `lipsync-2-pro` / `sync-3` — **RETARGET** ✅ best fit
72
+ **Source (first-party):** https://sync.so/docs/api-reference/api/generate-api/create · https://sync.so/docs/models/lipsync · https://sync.so/docs/introduction
73
+
74
+ - **Shape:** retargets an **existing video** with new audio — *"retargets existing video with new audio, applying lipsync synchronization to match speaker mouth movements."* `[docs]`
75
+ - **Inputs (`CreateGenerationDto`):** an array requiring **exactly one visual input** (video `url` **or** `assetId`; image also accepted) **and one audio-or-text input** `[docs]`:
76
+ - Audio as `{ "url": … }` or `assetId`, **or**
77
+ - **TTS**: `{ "provider": "elevenlabs", "voiceId": <ElevenLabs voice id>, "script": <text>, "stability", "similarityBoost" }` — **native ElevenLabs integration in the same request.** `[docs]`
78
+ - **Models:** `sync-3`, `lipsync-2`, `lipsync-2-pro`, `lipsync-1.9.0-beta`, `react-1`. `[docs]`
79
+ - **Options:** `sync_mode` (bounce/loop/cut_off/silence/remap for duration mismatch), `temperature` (0–1, default 0.5, expressiveness), `active_speaker_detection`, `occlusion_detection_enabled`, `webhookUrl`. `[docs]`
80
+ - **API pattern:** **async** — POST returns `status: PENDING` → `PROCESSING` → `COMPLETED|FAILED|REJECTED`; poll or webhook. Long videos auto-chunked into 30–40 s segments (irrelevant for our 4–10 s clips). `[docs]`
81
+ - **Pricing:** **`lipsync-2` = $0.04/s**, `sync-3` = $0.133/s (at 25 fps). ~**$0.32 for an 8 s clip** on lipsync-2. `[docs]` (pricing page / cost-estimation endpoint available).
82
+ - **Moderation:** `REJECTED` state exists for policy violations [unverified what triggers it]; editing our *own* generated footage is far lower risk than generating a likeness.
83
+ - **Fit:** ⭐ Perfect. Keep the Kie video model; after each scene renders, call sync.so with `video_url = <rendered clip>` and either the ElevenLabs MP3 we already generate **or** `provider:elevenlabs, voiceId, script` and skip our own TTS step. Output replaces the scene clip pre-stitch.
84
+
85
+ ### 2b. Kling Lip-Sync — Audio-to-Video (`kwaivgi/kling-lip-sync`) — **RETARGET** ✅ cheap
86
+ **Sources:** fal API doc https://fal.ai/models/fal-ai/kling-video/lipsync/audio-to-video/api `[docs]` · Replicate https://replicate.com/kwaivgi/kling-lip-sync `[mirror]` · WaveSpeed https://wavespeed.ai/models/kwaivgi/kling-lipsync/audio-to-video `[mirror]`
87
+
88
+ - **Shape:** *"give it a clean voice track plus a video and it reanimates the mouth region… preserves the original background, body motion, and camera work."* Works on Kling-generated **or other-source** video. `[mirror]`
89
+ - **Inputs:** `video_url` + `audio_url` (also a text→TTS variant). `[docs]`
90
+ - **Video:** .mp4/.mov, ≤100 MB, **2–10 s** (some hosts list 2–60 s), **720p/1080p only**, width/height 720–1920 px. `[docs]`
91
+ - **Audio:** 2–60 s, ≤5 MB, MP3/WAV/AAC/OGG. `[docs]`
92
+ - **API pattern:** async queue + webhooks. `[docs]`
93
+ - **Pricing:** ~**$0.15/run minimum**, or **$0.014 per input-video-second rounded to the nearest 5 s** → ~$0.11 for a 4–8 s clip. `[mirror]` (WaveSpeed/fal)
94
+ - **Moderation:** marked "Commercial use / Partner"; no documented person-restriction policy. `[docs]`
95
+ - **Kie hosting:** **[unverified]** — Kie hosts multiple Kling models (`kling-3.0/video` etc.) but I could **not** confirm this session that Kie exposes the *video-to-video* `kling-lip-sync` retarget slug (its `docs.kie.ai/market/kling/lip-sync` path 404'd). **If BYOK-Kie already exposes it, this becomes the top pick** (existing provider + cheap + retarget). Worth a live probe against the Kie account.
96
+ - **Fit:** ⭐ Excellent and cheapest solid retarget. 10 s cap suits our clip length.
97
+
98
+ ### 2c. fal.ai catalog (retarget options)
99
+ **Source:** https://fal.ai/models/veed/lipsync · https://fal.ai/models/fal-ai/latentsync · https://fal.ai/models/fal-ai/sync-lipsync
100
+ - **`veed/lipsync`** — RETARGET (video→video), *"realistic lipsync from any audio."* **$0.15 / 5 s** (~$0.24/8 s). `[docs]`
101
+ - **`fal-ai/latentsync`** (ByteDance LatentSync, audio-conditioned latent diffusion) — RETARGET. **$0.20 flat for ≤40 s**, then $0.005/s → cheapest for our clip lengths. Real-life + anime. `[docs]`
102
+ - **`fal-ai/sync-lipsync` (1.9)** — RETARGET, **$0.70/min ≈ $0.012/s** (sync.so model, older). `[docs]`
103
+ - **`fal-ai/kling-video/lipsync/audio-to-video`** — the Kling retarget above, on fal. `[docs]`
104
+ - **Fit:** all RETARGET, all take our rendered clip + any audio (drop the ElevenLabs MP3). fal is a single BYOK that unlocks several — good hedge if we want to A/B lip-sync engines. latentsync is the price floor; veed is a quality step up.
105
+
106
+ ### 2d. Kie InfiniteTalk (`infinitalk/image-to-talking-video`) — **GENERATE** ✅ only path on existing BYOK
107
+ **Sources:** https://kie.ai/infinitalk `[vendor]` (403 to fetch; corroborated) · integration guide https://www.fromdev.com/2025/11/how-to-integrate-infinite-talk-api-using-kie-ai-a-step-by-step-guide.html · FairStack model index (price)
108
+ - **Shape:** MeiGen-AI InfiniteTalk — turns an **image + audio** into a talking avatar (sparse-frame video-dubbing framework, identity-preserving, "infinite" length). **Generate-from-image, not retarget-a-clip.** `[vendor]`
109
+ - **Inputs (via `POST https://api.kie.ai/api/v1/jobs/createTask`):** `image_url` (JPEG/PNG/WebP), `audio_url` (MP3/WAV/AAC/OGG, **≤15 s**), `prompt`, `resolution` **480p or 720p only**, `seed` (10000–1000000). `[mirror]` (integration guide reflecting Kie's schema)
110
+ - **Pricing:** first 5 s = **5 credits @480p / 10 @720p / 15 @1080p**, then per-second at the same rate → ~**$0.30/clip @720p** (FairStack lists "InfiniteTalk (Kie.ai) — $0.300/clip"). `[vendor]`
111
+ - **Fit:** ✅ **Only option that reuses the existing Kie BYOK key.** BUT it's image-driven: we'd feed a scene *frame* (or actor portrait) + the ElevenLabs MP3, and it **regenerates** the talking head — we lose whatever motion/scene the Kie video model produced. Good if talking scenes can be "portrait talks to camera"; wrong if the scene needs the video model's action. 15 s audio cap fits our 4–10 s clips.
112
+
113
+ ### 2e. Kie OmniHuman 1.5 (`bytedance/omni-human`) — **GENERATE**
114
+ **Sources:** https://kie.ai/omnihuman-1-5 · https://kie.ai/omni-human-api `[vendor]` (403; corroborated) · fal/upstream pricing `[mirror]`
115
+ - **Shape:** ByteDance OmniHuman 1.5 — single portrait **image + audio** → realistic talking video with natural lip-sync, expressions, lifelike/full-body motion. Generate-from-image. `[vendor]`
116
+ - **Pricing:** upstream ~**$0.12/s** (fal listing for OmniHuman). Kie bills by generated duration; exact Kie credit/s [unverified]. `[mirror]`
117
+ - **Fit:** Higher-fidelity generate-from-photo than InfiniteTalk, on existing Kie BYOK. Same caveat: replaces the video model for talking scenes. Kling AI Avatar 2.0 is a third Kie generate-from-image option (audio-driven, multilingual, up to 5 min; Kie benchmarks it above OmniHuman-1.5 and HeyGen). `[vendor]`
118
+
119
+ ### 2f. Runway (Act-Two / Lip Sync / Characters API)
120
+ **Sources:** https://help.runwayml.com/hc/en-us/articles/42311337895827 · https://runwayml.com/apps/add-dialogue · changelog `[vendor]`
121
+ - **Act-Two:** performance-capture (driving video → target character), auto audio-visual sync; you can **change the voice** within the interface. **Lip Sync** app extended to **45 s** (from 20 s). Characters API is **live for developers at dev.runwayml.com**. `[vendor]`
122
+ - **Shape:** closest Runway analog to retarget is Lip Sync / "Add Dialogue" (animate a video/image with a voice). API is available (Gen-4/Characters on dev.runwayml.com) but **per-second API pricing for Act-Two/Lip Sync was not published** this session. `[vendor]` / [unverified pricing]
123
+ - **Fit:** Plausible RETARGET/talking-photo path, but pricing opacity and a heavier API make it a second-tier choice vs sync.so/fal/Kling.
124
+
125
+ ### 2g. Hedra Character-3 — **GENERATE**
126
+ **Sources:** https://www.hedra.com/docs/pages/getting_started/quickstart · https://www.hedra.com/video-models/hedra-character-3 · https://www.hedra.com/plans `[vendor]`
127
+ - **Shape:** omnimodal — processes **image + text + audio simultaneously** → talking avatar with strong lip-sync, micro-expressions (blinks, eye shifts, head tilts), full-body motion. Generate-from-image. `[vendor]`
128
+ - **Access/pricing:** requires a **paid subscription** (API key + purchased API credits). Free (100 cr, watermarked); Basic $15/mo (1,500 cr); Creator $30/mo (5,400 cr); Professional $75/mo (14,400 cr). **Credit/subscription model, not clean per-clip PAYG.** `[vendor]`
129
+ - **Fit:** Best-in-class *generate* quality for talking heads, but subscription billing fits a per-user BYOK-PAYG pipeline poorly, and it's still generate-from-image (replaces the video model).
130
+
131
+ ### 2h. HeyGen API / D-ID — **GENERATE** (presenter avatars)
132
+ **Sources:** https://developers.heygen.com/ · https://help.heygen.com/en/articles/10060327 · https://www.d-id.com/pricing/api/ `[vendor]`
133
+ - **HeyGen:** Photo Avatar from a still → animates face, **syncs lips to your script or an uploaded audio file** ("dub or replace audio on a video with a provided audio file"). Pay-as-you-go since Feb 2026: **~$1 = 1 min @720/1080p**; engines from **$0.0167/s** (Avatar III Digital Twin) to **$0.05/s** (Avatar IV Photo Avatar) to $0.0667/s. Min top-up $5. `[vendor]`
134
+ - **D-ID:** talking-head from a photo + audio/TTS, API **~$0.05/s ($3/min)**. `[vendor]`
135
+ - **Fit:** These are *presenter/spokesperson* generators from a photo — they don't retarget our rendered scene, and outputs read as "avatar tool," which is off for naturalistic UGC scene action. Use only if a talking-portrait scene is acceptable and we want a polished presenter look. HeyGen's "replace audio on a video" mode is worth a second look as a possible retarget-ish path [unverified whether it accepts arbitrary external video].
136
+
137
+ ### 2i. Replicate-hosted options
138
+ **Source:** https://replicate.com/collections/lipsync `[docs]`
139
+ Replicate's lipsync collection hosts the same upstream models as first-party, each with a documented JSON schema and PAYG billing: **`sync/lipsync-2-pro`**, **`kwaivgi/kling-lip-sync`** (retarget), **`bytedance/omni-human`** (generate), **`pixverse-ai/lipsync`**, **`zsxkib/multitalk`** (multi-person conversational lipsync — multiple audio clips → back-and-forth). Good single-BYOK hedge (one Replicate key → several retarget + generate engines) but generally pricier/less predictable than fal for the same models.
140
+
141
+ ---
142
+
143
+ ## Seedance `reference_audio_urls` note (Kie `bytedance/seedance-2`)
144
+
145
+ Per Kie's Seedance 2.0 doc (already captured in `native-audio-dialogue.md`, source https://docs.kie.ai/market/... Seedance page): `reference_audio_urls` accepts **≤3 clips, 2–15 s, wav/mp3** and is a **voice/style *reference* lever — NOT a documented dialogue-content or lip-sync-to-given-audio field.** `[docs]` It biases the *character/timbre* of the model's natively-generated speech; it does **not** make the model speak a supplied MP3 verbatim, and it does not lip-sync to an external audio track. **It does not solve the goal** (a chosen ElevenLabs voice saying our exact lines, lip-synced). Treat Seedance native audio as "model invents a voice, loosely style-guided," same class of problem as gemini-omni — not a voice-control solution.
146
+
147
+ ---
148
+
149
+ ## Recommended path + integration sketch
150
+
151
+ ### Primary recommendation: add a post-render **RETARGET lip-sync step**, keep the Kie video model
152
+ The pipeline already produces per-scene clips and per-scene ElevenLabs MP3s (George default) — they're just not muxed/synced. The clean fix is a new stage between "scene clip rendered" and "stitch":
153
+
154
+ ```
155
+ storyboard → [Kie video model renders scene clip (silent or discard native audio)]
156
+ → [ElevenLabs TTS: scene.dialogue → MP3] (already exists)
157
+ → [LIP-SYNC RETARGET: clip + MP3 → mouth-synced clip] ← NEW
158
+ → [ffmpeg stitch] (already exists, now with real synced VO)
159
+ ```
160
+
161
+ This is **additive** — no change to the storyboard, the video-model picker, or the stitch stage — and it finally makes the existing ElevenLabs Voiceover node pay off.
162
+
163
+ **Engine choice, in order:**
164
+ 1. **sync.so `lipsync-2`** — retargets the rendered clip and can take **either** our ElevenLabs MP3 **or** an inline `provider:elevenlabs, voiceId, script` TTS block (letting us drop our own TTS call). Async job pattern mirrors Kie's (create → poll/webhook), so it slots into the existing async render machinery. ~$0.32/8 s clip. New BYOK: a sync.so API key. **Start here.**
165
+ 2. **Before committing to a new provider, live-probe whether BYOK-Kie already exposes `kwaivgi/kling-lip-sync` (video-to-video).** If yes, it's the cheapest retarget (~$0.11–0.15/clip) on the *existing* Kie key — zero new provider surface. `[unverified]` this session; a 1-call probe settles it.
166
+ 3. **fal (`veed/lipsync` or `fal-ai/latentsync`)** as a fallback/second engine — one fal BYOK unlocks several retarget models for A/B'ing quality; latentsync at $0.20/≤40 s is the price floor.
167
+
168
+ ### If a new provider is a hard no (must stay on existing Kie/ElevenLabs BYOK only)
169
+ Use **Kie InfiniteTalk** (`infinitalk/image-to-talking-video`) or **OmniHuman** (`bytedance/omni-human`): feed a **scene frame/portrait + the ElevenLabs MP3** → talking clip, on the existing Kie key (~$0.30/clip @720p, 720p cap, ≤15 s audio for InfiniteTalk). **Accept the tradeoff:** these *generate* the talking head from a still, so talking scenes become "portrait speaks to camera" and lose the video model's motion/action. Fine for direct-address UGC beats; wrong for scenes that need staged action.
170
+
171
+ ### Integration considerations (both paths)
172
+ - **Async + polling/webhook**, same as the current Kie render loop — reuse it. sync.so and Kie share the create→poll shape; sync.so adds a cost-estimation endpoint.
173
+ - **Resolution/duration:** retarget models cap at 720p/1080p and ~10 s (Kling) or auto-chunk (sync.so) — fine for our 4–10 s 9:16 720p clips. InfiniteTalk caps at 720p + 15 s audio.
174
+ - **Cost delta:** retarget adds ~$0.04/s (sync) or ~$0.014/s (Kling) *on top of* the ~$0.32/4 s Kie render — call it +$0.15–0.35/scene. A 6-scene ad adds roughly $1–2.
175
+ - **Moderation:** retargeting **our own rendered footage** is materially lower policy-risk than the gemini-omni `audio_ids` path that #561 hit, and far lower than uploading a real person's likeness — the whole reason this route dodges the block.
176
+ - **Voice fidelity:** all retarget engines take an arbitrary MP3, so the **user's exact ElevenLabs voice** is preserved end-to-end (we generate it, they lip-sync to it) — directly satisfying "a chosen ElevenLabs voice out of the actor's mouth."
177
+
178
+ ---
179
+
180
+ ## Source list (primary first)
181
+ - Gemini Omni API (no audio input, safety): https://ai.google.dev/gemini-api/docs/omni
182
+ - Gemini/Veo pricing: https://ai.google.dev/gemini-api/docs/pricing
183
+ - sync.so create-generation schema: https://sync.so/docs/api-reference/api/generate-api/create · models https://sync.so/docs/models/lipsync · intro https://sync.so/docs/introduction
184
+ - fal Kling lipsync A2V: https://fal.ai/models/fal-ai/kling-video/lipsync/audio-to-video/api
185
+ - fal veed/lipsync: https://fal.ai/models/veed/lipsync · latentsync: https://fal.ai/models/fal-ai/latentsync · sync-lipsync: https://fal.ai/models/fal-ai/sync-lipsync
186
+ - Replicate lipsync collection: https://replicate.com/collections/lipsync · kling-lip-sync: https://replicate.com/kwaivgi/kling-lip-sync
187
+ - WaveSpeed Kling lipsync (specs/price): https://wavespeed.ai/models/kwaivgi/kling-lipsync/audio-to-video
188
+ - Kie InfiniteTalk: https://kie.ai/infinitalk · integration guide: https://www.fromdev.com/2025/11/how-to-integrate-infinite-talk-api-using-kie-ai-a-step-by-step-guide.html
189
+ - Kie OmniHuman: https://kie.ai/omnihuman-1-5 · https://kie.ai/omni-human-api
190
+ - Hedra Character-3: https://www.hedra.com/video-models/hedra-character-3 · quickstart https://www.hedra.com/docs/pages/getting_started/quickstart · plans https://www.hedra.com/plans
191
+ - HeyGen API: https://developers.heygen.com/ · pricing https://help.heygen.com/en/articles/10060327-heygen-api-pricing-explained
192
+ - D-ID API pricing: https://www.d-id.com/pricing/api/
193
+ - Runway Act-Two: https://help.runwayml.com/hc/en-us/articles/42311337895827-Performance-Capture-with-Act-Two · add-dialogue https://runwayml.com/apps/add-dialogue
194
+ - Seedance `reference_audio_urls`: see workspace/references/native-audio-dialogue.md (Kie Seedance 2.0 doc)
195
+
196
+ ---
197
+
198
+ ## Post-research verification addendum (main session, 2026-07-14)
199
+
200
+ Two load-bearing claims were re-verified against primary sources after the research pass:
201
+
202
+ ### Kie DOES host a video-to-video lip-sync retarget model — `volcengine/video-to-video-lip-sync` `[docs]`
203
+ Found via Kie's docs index (https://docs.kie.ai/llms.txt); full doc: https://docs.kie.ai/market/volcengine/video-to-video-lip-sync.md
204
+
205
+ - **Shape:** RETARGET — required inputs are `mode` (`lite` = single-person frontal, faster; `basic` = complex scenes + scene segmentation), `video_url`, `audio_url`. Runs on the SAME `POST /api/v1/jobs/createTask` transport the pipeline already speaks, on the existing Kie BYOK key.
206
+ - **Fit:** our scene clips are single-person frontal talking heads (→ `lite`); audio accepts MP3 ≤10 MB — exactly what the existing Voiceover node's ElevenLabs synthesis produces per scene. `align_audio` loops video if audio outruns it; output is mp4 25 fps with duration matched to the audio.
207
+ - **Video constraints:** 360p–1080p (ours: 720p ✓), H.264, ≤500 MB, 24–60 fps.
208
+ - **Unknowns:** pricing is NOT documented (Kie convention: real cost surfaces via `creditsConsumed` on the record — live-probe it) and output quality is unassessed. Given the #561 surprise, run a live probe (rendered clip + ElevenLabs MP3) before building the pipeline leg.
209
+ - This supersedes the earlier "[unverified] Kie hosting of Kling lip-sync" row: Kie's docs index shows NO Kling A2V lip-sync slug — the Kling entries are `kling/ai-avatar-standard|pro` (GENERATE-from-image), plus `omnihuman-1-5` and `infinitalk/from-audio` (both GENERATE).
210
+
211
+ ### sync.so ElevenLabs TTS input — confirmed `[docs]`
212
+ https://sync.so/docs/api-reference/api/generate-api/create — generation request accepts `{type: "text", provider: {name: "elevenlabs"}, voiceId: <ElevenLabs voice id>, script}` alongside a `{type: "video", url}` retarget input; models `sync-3`, `lipsync-2`, `lipsync-2-pro`, `lipsync-1.9.0-beta`, `react-1`. (Note: our pipeline already synthesizes ElevenLabs MP3s in the Voiceover node, so the built-in TTS is a convenience, not a requirement — which strengthens the case for trying Kie/Volcengine first.)
213
+
214
+ ### Revised recommendation
215
+ 1. **Live-probe Kie `volcengine/video-to-video-lip-sync`** (existing BYOK, existing transport, existing ElevenLabs VO): render one talking-head clip (native audio OFF, mouth policy suppressed), synthesize one ElevenLabs line, submit lite-mode retarget, judge quality + read `creditsConsumed`.
216
+ 2. If quality or price disappoints → **sync.so `lipsync-2`** (new BYOK provider, ~$0.04/s, strongest reputation).
217
+ 3. Integration shape either way: Video node gains a "voiceover lip-sync" mode = per-scene silent-ish render → Voiceover MP3 → retarget call → retargeted clip replaces the raw clip in the stitch. The storyboard's speech-fit budget already paces voText to scene durations.