实时视频
边看边生成、可无限延续的视频 —— POST /v1/videos/live 以约 5 秒为一段推送视频,每段都紧接上一段继续,你可以随时改变接下来发生的事。事件、引导、价格与限制。
POST /v1/videos/live 开启一段实时视频:一个服务器推送事件(SSE)流,每隔几秒送来一段新的约 5 秒 mp4。每段都从上一段的最后一秒接着往下走——连同动作一起,而不只是一张静帧——按顺序播放就是一个连续镜头;它始终跟随当前的提示词,而提示词可以在运行中随时更改。可以给它一张起始画面(首帧),并设置一位导演——一个聊天模型,负责写出每一个下一镜头,并在播放中接受你的指示。不写代码也可以在 Playground 里试用,还可以用图像模型画出首帧。
模型#
| 模型 | 价格 | 生成内容 |
|---|---|---|
ltx-live | 每生成 1 秒视频 $0.019,每个会话最低 $0.42 | LTX-2.5,横屏 704×384 或竖屏 384×704,24 fps,带声音。渲染比实时更快:每段 5 秒约用 3 秒。整段直播都保持首帧中的人物和场景。 |
它运行在我们自己的 GPU 上,属于 creative-hosted 渠道组,并受 LTX 条款约束:每个请求都要设置 consent: true,表示接受这些条款并对遵守它们负责。
开始一个视频流#
curl -N https://lovelyrouter.com/v1/videos/live \
-H "Authorization: Bearer $LOVELY_API_KEY" \
-H "content-type: application/json" \
-d '{"model": "ltx-live", "prompt": "A fox trots through fresh snow at dusk, the camera tracking beside it", "seconds": 120, "consent": true}'请求体(JSON,或把 image 作为文件的 multipart)
modelstring必填ltx-live。
promptstring必填画面里是谁或什么、正在发生什么:主体、动作、地点、光线、镜头。最多 1,000 个字符;提示词越短,渲染越快。
secondsnumber默认 60最多生成多少秒视频,5–600。到达后流结束;你停止或断开连接时也会提前结束。
sizestring默认 704x384704x384(横屏)或 384x704(竖屏)。
imagefile or string起始画面(首帧):文件、http(s) URL 或 data: URL。PNG、JPEG 或 WebP,最大 15 MB;会按 size 从中心裁剪。可以用任意图像模型生成一张再传入。它还会作为整段直播的参考:无论播多久,人物的脸、衣着和房间都保持首帧中的样子(不传首帧时,以第一段为准)。
directorstring or object负责写出每一段提示词的聊天模型:直接传模型 id,或 {"model": "…", "instructions": "…"},附上风格和故事说明(最多 2,000 个字符)。见导演。
voicefile or string说话人的声音:一段音频(WAV、MP3、M4A、Ogg、FLAC 或 WebM,最大 15 MB),以文件、http(s) URL 或 data: URL 传入。使用其中前约 5 秒的说话声;每一段都用这个声音说话。见声音。
keep_voiceboolean默认 true未传 voice 时:第一个有说话声的分段里的声音会保留给之后的每一段。设为 false:每段各自生成声音。
camerastring默认 free设为 fixed 即为一个固定机位的镜头:摄像机从不移动或切换,场景保持不变。见固定镜头。
seedinteger可复现的分段:第 n 段使用 seed + n。
consentboolean必填true:你接受 LTX 条款。
事件#
| 事件 | 时机 | 数据 |
|---|---|---|
session | 最先 | 会话对象,另含 seconds_per_chunk、price_per_second 和 price_min(每个会话最低收费) |
status | GPU 启动中(state: "starting")、导演写作中("directing")或某段渲染较久("rendering")时,约每 10 秒一次;导演出错时一次("director_error",视频继续使用上一个提示词) | state、chunk、waiting_s、error |
next | 导演写好某个后续分段的提示词时 | index、prompt、by |
chunk | 每约 5 秒视频一个 | index、url(mp4)、prompt(这一段跟随的提示词)、by(director 或 you)、seconds、total_seconds、render_s、charge_usd(目前累计) |
end | 最后 | reason(max_seconds、stopped、client_left、insufficient_quota、error)、error、seconds、charge_usd |
没有预热的 GPU 时,第一段会慢一些:GPU 启动最多约一分钟,期间会收到 status 事件。之后每段到达的速度都比播放稍快。先缓冲两段再开始播放,每段播完接着播下一段 —— 用两个 <video> 元素轮换即可无缝播放。
分段 URL 不需要 API key(每段都有不可猜测的路径),保留 7 天。
导演#
设置 director 后,由一个聊天模型写出每一段的提示词:在一段渲染时,它像收到“继续”一样写出下一段:根据你的 prompt(故事)、目前为止的视频(最近最多 15 个镜头,你的指示标在给出的位置)以及你之后说的话——保持同样的人物、场景和风格,并让情节每个镜头都往前推进一点。每段提示词写明画面里有什么、发生了什么、镜头怎么动、听到什么——模型会同时生成声音。台词放在引号里并注明谁在说,每段约 10 个词(约 5 秒能说完的量);较长的讲话会从上一段停下的地方接着分到后面几段。它的调用通过你的 key 进行,和普通聊天调用一样:按该模型的价格计费,并出现在你的日志里。用一个又快又便宜的模型就足够。它每次调用写两个镜头,每次调用有约 10 秒(两个分段)的时间,否则视频会暂停等待——claude-haiku-5.5 约需 6 秒。它只提前几段写:当有一个已完成的分段在等待播放时,下一次调用会等到那一段开始播放;新的指示会让尚未拍摄的镜头立刻重写——所以你的指示几秒内就能看到。
curl -N https://lovelyrouter.com/v1/videos/live \
-H "Authorization: Bearer $LOVELY_API_KEY" -H "content-type: application/json" \
-d '{"model": "ltx-live", "prompt": "A woman walks home through a rainy city at night", "seconds": 300,
"director": {"model": "claude-haiku-5.5", "instructions": "Slow, moody, film noir"}, "consent": true}'播放中告诉它接下来该发生什么:
curl https://lovelyrouter.com/v1/videos/live/LIVE_ID/direct \
-H "Authorization: Bearer $LOVELY_API_KEY" -H "content-type: application/json" \
-d '{"message": "A stray dog starts following her"}'指示会体现在它写的下一个提示词中。之后它留在“目前为止的视频”里你给出的位置:它带来的改变会持续(新的地点、氛围或语言),一次性的事件只发生一次。如果指示在某段提示词写好之后才到,会在那一段开始前重写提示词。每个会话最多接受 100 条指示,它们会列在会话对象中。
固定镜头#
设置 "camera": "fixed" 后,整段直播是一个固定机位的镜头——适合对着镜头讲话的人、一个房间、一扇窗。导演会被告知:无论故事或你的指示怎么说,摄像机都不移动、不切换,场景不变,只有人在动。发给模型的每个提示词(导演写的和你自己通过 POST …/prompt 写的)末尾都会加上 "Static camera, locked-off shot.",除非已经写明。chunk 事件报告的是实际发送的提示词。
长时间的固定镜头会慢慢损失背景:每段都从上一段结束的地方开始,小的损失会累积。固定镜头时,每段起始的画面会被清理——人物和发生变化的部分保留,其余部分取自开始时保存的干净房间画面。视频本身不做改动,所以房间保留自身的细微动态。如果构图变了,会重新保存干净画面。
声音#
每个分段各自生成声音,所以一个说话的人每隔几秒就会换一个声音。默认会保留第一个有说话声的分段里的声音:之后的每一段都以这段音频作为说话人的声音。传入 voice 可以自己指定——约 5 秒清晰的说话声,单个说话人。"keep_voice": false 关闭此功能。
改变接下来发生的事#
curl https://lovelyrouter.com/v1/videos/live/LIVE_ID/prompt \
-H "Authorization: Bearer $LOVELY_API_KEY" -H "content-type: application/json" \
-d '{"prompt": "It starts to snow harder; the fox stops and looks up"}'下一个开始渲染的分段会逐字使用新提示词(正在渲染的那段保持原样);如果有导演,它之后会从这里接着写。LIVE_ID 是 session 事件里的 id,或响应头 x-lovely-request-id。
POST /v1/videos/live/LIVE_ID/stop 会在当前分段完成后结束会话。断开连接也会结束会话。
会话对象#
GET /v1/videos/live/LIVE_ID 返回会话对象:id、object: "video.live"、model、status(live、stopping、ended)、prompt、size、seconds(目前已生成)、max_seconds、chunks(目前所有分段的 URL)、camera、voice(keep、upload 或 off)、director、directions、end_reason、error、charge_usd(结束后)。
价格#
按生成的视频秒数计费,每个会话有最低收费(ltx-live 为 $0.42,约合 22 秒视频:启动 GPU 并让它待命要花这么多)。导演的调用另按聊天调用计费。会话开始时,会从余额中预留它最多可能花费的金额 —— seconds × 单价(不低于最低收费);余额不足时预留更少,预留用完后视频流以 insufficient_quota 结束。会话结束时释放预留,已生成的秒数作为一次调用计入你的日志。因我们的错误而结束的会话,只收取已生成视频的费用,不适用最低收费。
限制#
- 每个账户同时只能有一个进行中的会话。第一个结束前,第二个会被拒绝并返回
429。 - 每个模型由少量 GPU 提供服务;全部占用时,新会话会收到
503和retry-after。 - 每个会话最长 600 秒。想继续就再开一个 —— 把上一段的最后一帧作为
image传入,即可接着拍同一个镜头。