使用指南
Kling 3.0 文生视频:带原生音频的短视频片段
大多数“文生视频”演示都止步于一段无声片段。hiapi 上的 kling-3.0/text-to-video 并非如此——它会在生成过程中直接渲染原生、口型同步的音频,并且是唯一支持最高 4K 的 Kling 3.0 档位。对于短视频内容(Reels、TikTok、Shorts)而言,这一组合——竖屏构图、真实环境音、无需单独的 TTS/配音环节——省去了整个后期制作步骤。
本文会走一遍实际工作流:先通过 /v1/tasks API 生成单个片段,再用异步代码扩展到批量片段,最后是你需要据此做预算的定价档位。
kling-3.0/text-to-video 相比 turbo 档位多了什么
hiapi 并行运行两个 Kling 3.0 视频系列:kling-3.0-turbo/text-to-video,以及本文介绍的裸 kling-3.0/text-to-video。turbo 档位更快,上限为 1080p,并且总是自带声音,没有开关可以控制。裸档位则用一部分速度换取:
- 原生同步音频——请求上的
sound布尔值。当为true时,hiapi.ai/会渲染与画面动作匹配的语音和环境音,而不是硬贴上去的配乐。 - 4K 上限——
resolution接受720p、1080p或4K,而 turbo 上限为 1080p。 - 相同的时长范围——两者均为
3-15秒,这恰好是短视频平台所奖励的窗口。
如果你需要无声背景循环,就使用这个档位并关闭 sound:720p 下为 $0.10/秒,低于 Turbo 的 $0.13/秒。如果片段需要听起来像有人对着镜头说话——大多数短视频内容都是如此——那么这个档位可以在一次请求中做到。
生成单个片段
该模型位于 hiapi 的异步 /v1/tasks 端点:提交任务,轮询完成状态,然后拉取输出 URL(它会过期,所以请立即下载)。
import os
import time
import requests
API_BASE = "https://api.hiapi.ai/v1/tasks"
TOKEN = os.environ["HIAPI_API_KEY"]
HEADERS = {"Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json"}
def create_clip(prompt: str, duration: int, resolution: str, aspect_ratio: str, sound: bool) -> str:
body = {
"model": "kling-3.0/text-to-video",
"input": {
"prompt": prompt,
"duration": duration,
"resolution": resolution,
"aspect_ratio": aspect_ratio,
"sound": sound,
},
}
resp = requests.post(API_BASE, headers=HEADERS, json=body, timeout=30)
resp.raise_for_status()
return resp.json()["data"]["taskId"]
def wait_for_clip(task_id: str, poll_every: int = 5, timeout: int = 600) -> str:
deadline = time.time() + timeout
while time.time() < deadline:
resp = requests.get(f"{API_BASE}/{task_id}", headers=HEADERS, timeout=30)
resp.raise_for_status()
data = resp.json()["data"]
if data["status"] == "success":
return data["output"][0]["url"]
if data["status"] == "fail":
raise RuntimeError(data.get("error"))
time.sleep(poll_every)
raise TimeoutError(f"task {task_id} did not finish in {timeout}s")
task_id = create_clip(
prompt="Vertical 9:16 short-form video clip: a creator filming a quick "
"product-review style take with a smartphone, energetic hand gestures, "
"natural indoor lighting, casual talking-to-camera framing, realistic "
"motion and lip movement, ambient room tone and speech audio synced to "
"the action",
duration=6,
resolution="720p",
aspect_ratio="9:16",
sound=True,
)
video_url = wait_for_clip(task_id)
这就是下方片段背后的确切提示词和设置——竖屏、6 秒、720p、音频开启($0.86)。
提示词:“垂直 9:16 短视频片段:创作者用智能手机拍摄一段快速的产品测评风格镜头,充满活力的手势,自然的室内照明,随意的对镜头说话构图,真实的动作和唇部运动,环境房间音和与动作同步的语音音频”
扩展到批量:用异步代码,而不是顺序循环
单个片段就是一次请求。一周的短视频内容则是十条或二十条。在 for 循环中逐个轮询每个任务可行,但它把本不需要串行的等待时间串行化了——API 很乐意接受并发提交。改用 asyncio 和 aiohttp 一起发出去:
import asyncio
import os
import aiohttp
API_BASE = "https://api.hiapi.ai/v1/tasks"
TOKEN = os.environ["HIAPI_API_KEY"]
HEADERS = {"Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json"}
async def create_task(session, prompt, duration=6, resolution="1080p",
aspect_ratio="9:16", sound=True):
body = {
"model": "kling-3.0/text-to-video",
"input": {"prompt": prompt, "duration": duration, "resolution": resolution,
"aspect_ratio": aspect_ratio, "sound": sound},
}
async with session.post(API_BASE, json=body) as resp:
resp.raise_for_status()
data = await resp.json()
return data["data"]["taskId"]
async def poll_task(session, task_id, poll_every=5, timeout=600):
loop = asyncio.get_event_loop()
deadline = loop.time() + timeout
while loop.time() < deadline:
async with session.get(f"{API_BASE}/{task_id}") as resp:
resp.raise_for_status()
data = (await resp.json())["data"]
if data["status"] == "success":
return data["output"][0]["url"]
if data["status"] == "fail":
raise RuntimeError(data.get("error"))
await asyncio.sleep(poll_every)
raise TimeoutError(f"task {task_id} timed out")
async def produce_batch(prompts: list[str]) -> list[str]:
async with aiohttp.ClientSession(headers=HEADERS) as session:
task_ids = await asyncio.gather(*(create_task(session, p) for p in prompts))
return await asyncio.gather(*(poll_task(session, tid) for tid in task_ids))
prompts = [
"Vertical 9:16 clip: creator unboxing a package on camera, excited reaction, "
"soft window light, speech synced to lip movement",
"Vertical 9:16 clip: creator walking through a city street talking to camera, "
"b-roll style framing, ambient street audio",
"Vertical 9:16 clip: creator demoing a skincare routine close-up, calm "
"narration audio, natural bathroom lighting",
]
urls = asyncio.run(produce_batch(prompts))
每个任务在服务端独立运行,所以三个片段的实际耗时接近一个片段的耗时,而不是三倍长。对于更大的批量,用 asyncio.Semaphore 限制并发,以免冲垮你自己的速率限制。
费用是多少
kling-3.0/text-to-video 的定价按分辨率和 sound 开关分档,而不是单一固定费率——不要套用 turbo 档位的固定每秒价格,这两条路由是分别定价的:
720p,无音频:$0.10/秒720p+sound:true:$0.143/秒1080p,无音频:$0.129/秒1080p+sound:true:$0.193/秒4K:$0.479/秒
一段 6 秒、带音频的 1080p 片段大约为 $1.16;上面的 720p 带音频片段为 $0.86。同样设置下 10 个片段的批量约为 $11.60——在排队大规模运行之前,值得对照你自己的 定价仪表盘 检查一下,因为每个字段(分辨率、时长、音频)都会独立影响总价。如果你要与其他 Kling 档位比较,请查看 Kling 3.0 定价页面 上的完整明细。
短视频制作注意事项
除了“打开音频”之外,还有几件事真正影响留存率:
- 将
duration保持在 6-10 秒。 模型支持最长 15 秒,但大多数短视频钩子在前几秒就抓住或失去观众——更紧凑的片段会迫使你写出更紧凑的提示词。 - 把音频写进提示词,不要想当然。 提示词文本中的“与动作同步的语音音频”或“环境街道噪音”会引导
sound:true实际渲染的内容——没有音频线索的提示词仍可能返回异常安静的片段。 aspect_ratio: "9:16"端到端使用。 不要生成 16:9 再裁剪;当你直接要求竖屏时,模型会为竖屏构图做不同的镜头编排(手部位置、头顶留白、背景深度)。- 批量生成同一钩子的变体,而不是不相关的片段。异步生成使得尝试一个钩子概念的 3-4 种措辞变体并选出最佳版本变得很便宜,而不是每个想法只提交一个提示词。
常见问题
kling-3.0/text-to-video 原生支持 9:16 吗,还是我需要裁剪 16:9 渲染结果?
原生支持——aspect_ratio 在请求中直接接受 9:16,模型从一开始就为竖屏构图镜头。
音频是真实对话/环境音,还是通用背景音轨? 它是根据场景生成的:当提示词描述有人在说话时,语音会与唇部运动同步;环境音(房间、街道等)会跟随提示词中描述的场景。它不是库存音乐床。
对于短视频用途,这与 kling-3.0-turbo 有何不同?
Turbo 更快,上限为 1080p。它没有 sound 字段,但片段总是自带声音。当你需要快速 b-roll 且其内置声音足够好时使用 turbo;当你需要无声输出,或片段需要听起来像特定内容(尤其是对镜头说话的内容)时,使用这个档位。
我能否生成一周的片段而不用逐个顺序等待? 可以——并发提交所有创建任务请求(参见上面的异步批量示例),然后也并发轮询它们。API 不要求一次只提交一个。
如果我不立即下载输出 URL 会怎样?
输出 URL 有时间限制(expireAt)。一旦任务报告 success,就立即下载字节并自行存储——不要把热链接 URL 放到任何持久位置。
完整字段参考和实时定价见 kling-3.0/text-to-video 模型页面。