HiAPI
博客

使用指南

Kling 3.0 文生视频:带原生音频的短视频片段

2026年11月3日
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 模型页面。

立即开始构建持久 AI 产物

获取 API 密钥,通过一个基于任务(task)的 API 调用图像、视频和音频模型。

阅读 API 文档