灵造AI(中巨量)开放平台 API 文档
版本: 1.1 | 更新日期: 2026-08-28
概述
本文档描述灵造智能体接口(即中巨量-灵造AI 开放平台 API),让你用程序调用平台的内容生产能力:
💡 不想写代码? 主流 AI 客户端(WorkBuddy、Codex / ChatGPT、Claude Code、 Claude 桌面端、Cursor 等)都支持 MCP——填一个地址加密钥就能让 AI 帮你出片, 下一节「接入 AI Agent」就是完整接入步骤(含各客户端配置与一句话安装)。 需要自己写代码调接口的,从「认证」往下看。
| 能力 | 接口 | 要不要自己准备素材 |
|---|---|---|
| 动画视频(文案 → 动效短视频) | POST /open/fluid-tasks | 不用,纯文字动效 |
| 数字人视频(形象口播 + 画面) | POST /open/digital-human-tasks | 可以不用,见下 |
| 视频混剪(画面 + 配音 + 字幕) | POST /open/tasks | 可以不用,见下 |
配套还有配置查询(音色 / 背景音乐 / 片尾 / 数字人 / 素材分组 / 封面模板)、任务进度与产出查询、任务删除、账户积分查询。
零素材也能出片
只有想用自己的素材时才需要上传。画面来源(clip_source)四选一,其中三种都不用你准备任何东西:
clip_source | 画面从哪来 | 要自备素材吗 |
|---|---|---|
es(默认) | 全库检索:平台共享素材库 + 你自己的素材,按文案关键词自动匹配 | 不用 |
hot | 平台整理的热门素材分组,按主题打好包,直接指定分组 ID 即可 | 不用 |
fluid | 不用实拍素材,画面改由 AI 生成文字动效卡 | 不用 |
group | 你自己在网页端「素材管理」建的分组 | 需要 |
数字人视频还有一种更省事的做法:head_duration: -1(全程口播),整条只有数字人在讲,压根不涉及画面素材。
开箱即用的预设资源
下面这些平台都已备好,调接口拿 ID 直接用,不需要自己上传或克隆:
| 资源 | 数量 | 取值接口 |
|---|---|---|
| 数字人形象 | 27 个 | GET /open/digital-humans |
| 朗读音色 | 43 个 | GET /open/voices |
| 背景音乐 | 80 首 | GET /open/bgm |
| 热门素材分组 | 17 组 / 3200+ 片段 | GET /open/clip-groups?source=hot |
| 封面模板 | 42 个 | GET /open/cover-templates |
| 字幕模板 / 字体 | 10 个 / 10 款 | GET /open/subtitle-templates、/open/subtitle-fonts |
| 片尾视频 | 平台预设 + 你自己上传的 | GET /open/outros |
数量会随平台上新增加,以接口返回为准。想用自己的音色/形象,在网页端上传或克隆后同样从这些接口取到。
接口根地址:https://ai-mix.chuhaibang.com/api/v1/open
在线文档:https://ai-mix.chuhaibang.com/open-api | AI Skill:https://ai-mix.chuhaibang.com/open-api/skill (两个页面都免登录,可直接分享给对接的开发者)
接入 AI Agent(MCP / Skill)
不想自己写代码调接口,直接让 AI 帮你出片——按你用的 AI 工具选一条:
| 方式 | 作用 | 接入成本 | 去哪看 |
|---|---|---|---|
| MCP Server | 让 AI 能调灵造的能力 | 填一个 URL + 密钥 | MCP 接入 |
| 灵造 Skill 能力包 | 让 AI 知道怎么调才对(任务选型、素材来源、成本控制) | 一句话让 AI 自己装 | Skill 说明 |
两者建议一起用:MCP 是调用通道,Skill 是使用方法。三条路(MCP / Skill / 本文的 HTTP 接口) 调的是同一套后端,产出完全一致,随时可以换。
本文以下内容是给自己写代码调接口的人看的。
认证
所有接口都要带请求头:
| 请求头 | 说明 |
|---|---|
X-Api-Key | 在「用户中心 → 开放平台」点「获取 API 密钥」生成,形如 lz_xxxxxxxx... |
curl "https://ai-mix.chuhaibang.com/api/v1/open/account" -H "X-Api-Key: lz_你的密钥"失败响应:
| HTTP | detail | 含因 |
|---|---|---|
| 401 | 缺少 X-Api-Key | 没带请求头 |
| 401 | 无效的 API 密钥 | 密钥错误或已被重置 |
| 403 | 账号已被禁用 | 账号被平台停用 |
密钥安全:密钥请尽可能在服务端使用;怀疑泄漏时可在用户中心点「重置」,旧密钥立即失效。
统一响应格式
成功(HTTP 200):
{ "code": 0, "message": "ok", "data": { } }失败(HTTP 4xx / 5xx):
{ "detail": "错误描述" }常用状态码:
| 状态码 | 含义 |
|---|---|
| 200 | 成功 |
| 400 | 参数校验失败 / 业务错误(素材不足等) |
| 401 | 密钥无效 |
| 402 | 积分不足(detail 含所需与剩余积分) |
| 403 | 越权(引用他人素材、访问他人任务)或账号被禁用 |
| 404 | 资源不存在 |
| 422 | 请求体字段类型/取值不合法(FastAPI 校验,detail 为数组) |
计费规则
API 与网页端共用同一份积分(永久积分 + 当月月度积分)。创建任务时先校验余额, 建任务成功后立即扣除;建任务失败不扣费。积分流水会带「· 开放平台API」后缀,便于对账。
| 任务类型 | 计价公式(系数由平台配置,见用户中心「订阅管理」) |
|---|---|
| 视频混剪 | ceil(目标时长 / 8 × 系数) × 数量 |
| 数字人视频 | ceil(目标时长 / 15 × 系数) × 数量 |
| 动画视频 | ceil(目标时长 / 15 × 系数) × 数量 |
提交前建议先查 GET /open/account 的 total_credits。积分不足时返回:
{ "detail": "积分不足:本次需要 120,剩余 45" }资源归属与配额
- 音色 / 背景音乐 / 片尾 / 数字人:可用「平台预设(已上架)」+「你自己上传的」; 引用他人上传的返回 403,引用已下架预设返回 400。
- 素材分组(
clip_group_ids):只能用自己的分组,或平台标记的热门分组(clip_source=hot)。 - 任务查询 / 删除:只能操作自己的任务(含网页端创建的)。
- 存储、社媒账号数等配额与网页端一致,超限时相关接口返回 403。
成品保留期 ⚠️
通过 API 创建的任务,成品默认只保留 1 天,之后由系统每日定时任务整批硬删—— DB 记录与磁盘文件(成品视频、封面、配音)一并删除,不可恢复。
这么设计是因为 API 能批量出片,不清理会迅速堆满存储配额。
| 想要的效果 | 怎么做 |
|---|---|
| 拿到链接就下载走(推荐) | 什么都不用做,用完即弃 |
| 成品长期留在平台 | 提交任务时传 "keep_forever": true |
{
"description": "...",
"voice_id": 1,
"keep_forever": true
}keep_forever: true的成品会持续占用你的存储配额,且不再自动清理。 批量场景请自行控制数量,或改为「下载到自己的存储后调DELETE /open/tasks/{id}删除」。 存储超限会导致素材上传等接口返回 403。
其它说明:
- 保留期与
keep_forever都只对 API 创建的任务生效;网页端/小程序创建的任务走各自的策略,在那两端传该字段无效。 - 已被提取为模板广场模板的批次不会被清理。
- 保留天数由平台配置,如需调整请联系平台运营。
- 任务详情/列表会回显
keep_forever,可据此确认设置是否生效。
账户
查询账户与积分
GET /open/account响应 data(节选):
| 字段 | 说明 |
|---|---|
plan_code / plan_name | 当前套餐(如 pro / 企业版) |
period / status / expires_at | 计费周期、订阅状态、到期时间(永久版为 null) |
total_credits | 可用积分合计(永久 + 当月月度),提交前看这个 |
permanent_credits | 永久积分余额 |
monthly_credits_remaining | 当月月度积分余额 |
monthly_credits_reset_at | 月度积分重置时间 |
storage_bytes_used / storage_bytes_limit | 存储用量 / 上限(字节) |
domestic_accounts_used / _limit、overseas_accounts_used / _limit | 社媒账号数用量 |
配置查询
以下接口都是 GET,无参数(除标注外),返回列表。
💡 不想调接口找 ID? 在「用户中心 → 开放平台」打开开发者模式,创作页面的数字人、 音色、背景音乐、片尾、素材分组旁会直接显示 #ID,点一下即可复制。朗读音色
GET /open/voices{
"code": 0, "message": "ok",
"data": [
{"id": 1, "name": "女声-甜美", "audio_url": "https://.../voices/x.wav", "is_preset": true, "sort_order": 10}
]
}| 字段 | 类型 | 说明 |
|---|---|---|
id | int | 填给 voice_id 的值 |
name | string | 音色名 |
description | string | 音色说明(音质、适合的内容类型) |
audio_url | string | 试听直链 |
category | string | 后台配置的分类标签;当前预设音色多为 null(未分类) |
is_preset | bool | true=平台预设,全体可用;false=你自己克隆的专属音色 |
sort_order | int | 推荐排序,越小越靠前 |
做数字人视频时,优先用/open/digital-humans里该形象的voice_profile_id—— 那是与形象绑定的音色,口型贴合度最好。
背景音乐
GET /open/bgm| 字段 | 类型 | 说明 |
|---|---|---|
id | int | 填给 bgm_id / bgm_ids 的值 |
name | string | 曲目名 |
file_url | string | 音频直链,可直接试听 |
duration | float | 时长(秒)。比成片短也没关系,bgm_loop: true 会自动循环填满 |
category | string | 大类,如「史诗大气」「轻快活泼」 |
tags | string[] | 情绪标签数组,如 ["紧张","悬念","爆发"],便于按调性筛选 |
is_preset | bool | true=平台预设;false=你自己上传的 |
sort_order | int | 平台推荐排序,越小越靠前 |
传 bgm_ids(数组)时每条视频各自随机取一首,批量出片不会首首雷同。片尾视频
GET /open/outros| 字段 | 类型 | 说明 |
|---|---|---|
id | int | 填给 outro_id / outro_ids 的值 |
title | string | 片尾名称(如「竖版-免费领-v4」,名称里通常标明了适用比例) |
description | string | 补充说明 |
file_url | string | 视频直链,可先预览 |
duration | float | 时长(秒)。会追加在成片末尾,成片总长 = 正片 + 片尾 |
width / height | int | 片尾分辨率。与任务 resolution 比例不一致时系统会自动适配 |
传 outro_ids(数组)时每条视频随机取一个。数字人形象
GET /open/digital-humans| 字段 | 类型 | 说明 |
|---|---|---|
id | int | 填给 digital_human_id 的值 |
name | string | 形象名称 |
description | string | 形象说明(口播风格、适用场景) |
file_url | string | 形象样片直链 |
cover_url | string | 封面图 |
duration | float | 样片时长(秒) |
is_preset | bool | true=平台预设,全体可用;false=你自己上传的专属形象 |
is_loop | bool | 样片是否为无缝循环素材 |
voice_profile_id | int | 该形象绑定的音色。没有特别偏好时,voice_id 就填它,口型与音色最贴合 |
pip_crop | object | 画中画默认裁剪框,head_duration: -3 时可直接拿来填 pip_config.crop |
素材分组
GET /open/clip-groups?source=group # 我的分组(默认)
GET /open/clip-groups?source=hot # 平台热门分组| 字段 | 类型 | 说明 |
|---|---|---|
id | int | 填给 clip_group_id / clip_group_ids 的值 |
name | string | 分组名 |
description | string | 分组说明 |
clip_count | int | 组内可用片段数。太少会导致成片重复镜头多,建议 ≥30 |
is_hot | bool | 是否为平台热门分组 |
source | 返回 | 配套的 clip_source | 要自备素材吗 |
|---|---|---|---|
group(默认) | 你自己在网页端建的分组 | "group" | 需要 |
hot | 平台整理的热门素材分组 | "hot" | 不用 |
热门素材分组是平台按主题打包好的公共素材库(如「AI科技」「汽车素材」「大海风景」「旅游风景」等 17 组、 合计 3000+ 片段),全体用户可直接使用。没有自己的素材时, 用 source=hot 取一个(或多个)分组 ID 填进 clip_group_ids,配 clip_source: "hot" 就能出片; 多个分组会合并成一个候选池,片段更丰富、成片重复度更低。
两者的 clip_source 必须和分组来源对应:拿 source=hot 的 ID 去配 clip_source: "group" 会报 403。
自己的分组与其中片段的维护(上传、下载链接、智能拆条、去水印)在网页端「素材管理」完成。
分组内片段(分页)
GET /open/clip-groups/{group_id}/clips?page=1&page_size=20用于需要精确指定用哪几条片段时取 clip_group_clip_ids;不传该字段则系统在分组内自动挑选。
| 字段 | 类型 | 说明 |
|---|---|---|
id | int | 填给 clip_group_clip_ids 数组的值 |
clip_index | int | 片段在原视频中的序号。这是展示用序号,不是 id,别混用 |
raw_video_id | int | 来源原始视频 ID |
start_time / end_time | float | 该片段在原视频中的起止秒数 |
duration | float | 片段时长(秒) |
file_url | string | 片段直链 |
cover_url | string | 首帧缩略图 |
transcript | string | 片段内的语音转写文本(没有人声则为空) |
tags | string[] | 画面标签 |
data 为分页结构 {total, page, page_size, items},page_size 最大 500。 本人分组与平台热门分组都可以查。
任务分组
GET /open/groups给作品归类用(就是网页端「我的作品」里的作品分类),对应创建任务时的 group_id。
| 字段 | 类型 | 说明 |
|---|---|---|
id | int | 填给 group_id 的值 |
name | string | 分类名,如「电商」「科技」「美食」 |
is_preset | bool | true=平台预设分类;false=用户在网页端自建的 |
sort_order | int | 排序 |
不传 group_id 则任务归入「未分类」。任务详情会回显 group_name 便于核对。
封面模板
GET /open/cover-templates?portrait=true| 字段 | 类型 | 说明 |
|---|---|---|
template_id | string | 填给 cover_config.template_id 的值 |
name | string | 模板名,如「对话气泡·冷静沉底」 |
image | string | 排版示意图。挑模板就看这个——注意它只演示版式,实际大字是按你的文案生成的 |
is_random | bool | 是否为「随机模板」哨兵项 |
portrait=true(默认)取竖屏示意图,portrait=false 取横屏;两种比例的模板 ID 是同一套, 做横屏视频时用 portrait=false 预览更准。真实封面大字由系统按每条视频的文案自动提取,不需要你传文字。
返回的第一项是「随机封面模板」(template_id 为 __random__、is_random: true): 传它则每条视频各自随机取一个真实模板,适合批量出片时避免封面雷同。
{"cover_config": {"template_id": "__random__"}}字幕模板
GET /open/subtitle-templates?portrait=true响应字段
| 字段 | 类型 | 说明 |
|---|---|---|
template_id | string | 填给 subtitle_template_id 的值 |
name | string | 模板中文名 |
desc | string | 一句话说明该模板的视觉风格 |
entrances | string[] | 该模板会按句轮换的字幕特效(见下表) |
has_sfx | bool | 是否支持字幕音效(配合 enable_subtitle_sfx) |
bottom_percent | float | 该模板的默认字幕高度,即 subtitle_bottom_percent 不传时的实际取值 |
video | string | 示例 MP4 直链,选模板前建议先看这个 |
is_random | bool | 是否为「随机模板」哨兵项 |
可选模板(接口按此顺序返回)
template_id | 名称 | 风格 | 默认高度 |
|---|---|---|---|
__random__ | 随机字幕模板 | 每条视频各自随机取一个真实模板 | 25% |
__classic__ | 经典字幕(白字黑边) | 白字黑边无动效。不传 subtitle_template_id 时的默认效果 | 8% |
boxed | 底框字幕 | 半透黑圆角底框 + 马善政毛笔白字 | 25% |
punch | 随机特效 | 粗黑大字 + 黄色高亮;十来种特效随机轮换,每句换一种 | 25% |
stacked | 聚焦叠压 | 前半句白字铺垫、后半句高亮字压上来,前半退居次要;三段句首段转红 | 25% |
literary | 文艺留白 | 斜体暖米色;全篇上浮淡入,只有金句字间距收紧并配一声音效 | 25% |
goldline | 金句大字 | 厚重方体 + 金色描边;平句快速逐字放大,金句整句转金、由小到大 | 25% |
handwrite | 手写温柔 | 楷体细描边;平句上浮淡入,金句整句由大缩小、回弹落定 | 25% |
sweet | 逐字出现 | 圆体粗描边 + 粉橙双高亮,字一个个蹦出来 | 25% |
typing | 打字机 | 得意黑斜体单行 + 光标逐字敲出,金句整句转浅黄 | 25% |
全部模板都支持字幕音效(has_sfx: true)。「默认高度」为竖屏值,横屏时模板 18% / 经典 6%。
字幕特效(entrances 的取值)
| 值 | 效果 |
|---|---|
char_pop / char_burst | 逐字弹出 / 快速逐字放大 |
char_typing | 打字机(带光标) |
spacing_in | 字间距由宽收紧 |
slide_left / slide_right / slide_up / slide_down | 四向滑入 |
slide_blur | 滑入 + 重拖影 |
fade_up | 上浮淡入 |
scale_pop / zoom_out | 中间放大弹入 / 中间缩小落定 |
blur_in | 由虚聚焦 |
spin_in | 旋转弹入 |
stretch_in | 横向展开 |
plain | 直接出现。仅 ["plain"] 表示无特效(经典字幕即是) |
特效在同一模板内按句轮换(全程一种会显得单调),含高亮词的重点句固定用该模板最强的那种。 这些是模板的固有属性,不能单独指定——你只需选模板。
stacked(聚焦叠压)的规则与其它模板不同:它把一句拆成主副两段——前段白字先铺垫, 后段用高亮色缩放变大压上来,同时前段淡下去。按句在三种句式间轮换:
overlay:后段直接盖在前段上(略偏右下、字号略小),前段原地变浅stack_up:前段缩小上移让位,后段大字落在原处,两者不重叠trio:三段句——首段转红居中,后两段白字同时从左上/右下滑入压住它
短句(一块)走常规居中出现,不做叠压。
除 __classic__ 外,字幕默认位于距画面底部 25%(竖屏 / 横屏 18%),避开手机端底部的 评论条与进度条;经典字幕保持原来的贴底位置(竖屏 8% / 横屏 6%)。 用 subtitle_bottom_percent(6–70)可以自己挪,越大越靠上; 用 subtitle_font_scale(0.7–1.5)在模板默认字号上整体放大/缩小。
第一项同样是「随机字幕模板」(__random__)。不传 subtitle_template_id 则用经典字幕 (白字黑边、无动效)。字幕文字取自文案,高亮词由 AI 自动挑选,都不需要你传。
enable_subtitle_sfx 开启后,音效与高亮严格同步:每个高亮词出现的瞬间必响一声, 每次从音效池里随机换一个音色。频率控制在高亮本身——同一个高亮词至少隔 4 秒才会 再次高亮/响(不同词互不影响,该出现就出现)。经典字幕同样适用。 stacked(聚焦叠压)的强调是每句都有的红/黄字,落点至少隔 6 秒; boxed(底框字幕)没有词级高亮,仍是每 3~4 句响一次。
字幕字体
GET /open/subtitle-fonts响应字段:key(填给 subtitle_font_key)/ name(字体中文名)/ image(静态样张 PNG)。
10 款字体全部可免费商用:
key | 字体 | 适合 |
|---|---|---|
black | 思源黑体(粗) | 通用,任何题材都不出错 |
serif | 思源宋体(粗) | 知识、观点、品牌向 |
smiley | 得意黑(斜体) | 潮流、快节奏、口播带货 |
huangyou | 庆科黄油体 | 活泼、生活方式 |
kuaile | 站酷快乐体 | 亲子、萌宠、轻松内容 |
wenkai | 霞鹜文楷 | 文艺、叙事、慢节奏 |
xiaowei | 站酷小薇 | 清新、女性向 |
mashan | 马善政毛笔楷书 | 国风、书法感 |
longcang | 龙藏手写体 | 手写随笔感 |
xiaxing | 演示夏行楷 | 行楷,兼顾书法感与可读性 |
不传 subtitle_font_key 则用所选模板自己的默认字体。 把细笔画字体(毛笔/手写类)换进无描边的模板时,系统会自动补 2.0 描边防止亮背景下看不清。
{"enable_subtitle": true, "subtitle_template_id": "punch", "enable_subtitle_sfx": true, "subtitle_font_key": "mashan"}创作任务
三类视频任务的公共字段:
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
description | string | 必填 | 主题或固定文案,1–3000 字 |
use_fixed_copy | bool | false | true = description 即最终文案,AI 不改写正文 |
humanize | bool | false | 去 AI 味引擎(仅 AI 生成文案时有效) |
voice_id | int | — | 朗读音色,见 /open/voices |
tts_language | zh | en | null | 留空按文案自动判断 |
tts_speed | float | 1.0 | 0.8–1.2 |
tts_emotion | string | null | 朗读情绪,见下方「朗读情绪」 |
bgm_id / bgm_ids | int / int[] | null | 多选时每条视频随机取一首 |
bgm_volume | int | 25 | 1–200(相对原声百分比) |
bgm_loop | bool | true | false = 只播一遍 |
quantity | int | 10 / 3 | 生成条数。上限随任务类型与时长变化,见下方「时长档位与数量上限」 |
resolution | string | 1080x1920 | 形如 宽x高 |
target_duration | int | 15 | 目标时长(秒)。AI 写文案时只能取固定档位,见下方「时长档位与数量上限」 |
video_bitrate | 1M|2M|4M | 1M(动画 2M) | 码率。动画视频例外:主体画面由渲染服务直出固定高画质,该值只作用于片尾拼接与封面烧录的重编码 |
outro_id / outro_ids | int / int[] | null | 片尾,多选时随机取一个 |
cover_config | object | null | {"template_id": "xx"},见 /open/cover-templates |
group_id | int | null | 归入某个任务分组 |
keep_forever | bool | false | 永久保留成品。默认 false,成品只保留 1 天;true 则不再自动清理(见下方「成品保留期」) |
enable_title | bool | false | 顶部大标题烧录 |
title_texts | string | null | 每行一条,按条分配;留空则用 AI 提取 |
title_font_size | float | 5.0 | 相对画面高度百分比 0.1–10 |
title_y_percent | float | 8.0 | 距顶部百分比 |
title_font_color | string | #ffffff | 十六进制色值 |
enable_subtitle | bool | false | 逐句字幕 |
subtitle_template_id | string | null | 字幕模板,见 /open/subtitle-templates;留空=经典字幕(无动效) |
enable_subtitle_sfx | bool | false | 字幕音效开关;与高亮词同步(每个高亮必响,同词至少隔 4s),经典字幕同样支持 |
subtitle_bottom_percent | float | null | 字幕距画面底部的百分比(6–70,越大越靠上);不传=用所选模板的默认高度 |
subtitle_font_key | string | null | 字幕字体覆盖,取值见 GET /open/subtitle-fonts;不传=跟随模板默认字体。细笔画字体会自动补描边保证可读性 |
subtitle_font_scale | float | null | 字幕字号系数(0.7–1.5);在所选模板算完字号后再乘一道,不传/1.0=用模板默认字号。英文与横屏各自的缩放照常生效,本系数叠在它们之后 |
transition_type | string | null | 转场,如 fade / dissolve / pixelize;留空随机 |
⚠️ 动画视频(/open/fluid-tasks)只接受上表的一个子集。它的画面是整屏文字动效, 没有素材片段可转场、也不叠加另一层字幕,因此下列字段对它无效:enable_title/title_*、enable_subtitle/subtitle_*、transition_type、prefer_similar_ratio、clip_*、digital_human_id/head_duration/pip_config。 传了不会报错,会被静默忽略——别照着混剪的参数去调动画视频接口,否则会以为开了字幕其实没有。 动画视频实际支持的字段就是「1. 动画视频」小节列出的那些。
时长档位与数量上限
target_duration 在 AI 写文案(use_fixed_copy=false)时只能取固定档位,传其它值报 422:
| 任务类型 | 可选时长档位(秒) |
|---|---|
| 视频混剪 | 8 / 15 / 20 / 30 / 60 / 120 / 300 / 600 |
| 数字人视频 | 15 / 20 / 30 / 60 / 120 / 300 / 600(无 8s) |
| 动画视频 | 15 / 20 / 30 / 60 / 120(无 300/600) |
固定文案模式(use_fixed_copy=true)不受档位限制,按文案朗读时长取任意秒数(混剪/数字人 1–600,动画 15–600)。
quantity 上限随时长(和画质)收紧,防止一次占满渲染队列:
| 时长 | 混剪 1M / 2M / 4M | 动画视频 | 数字人(前缀模式) |
|---|---|---|---|
| 15s | 1000 / 500 / 250 | 200 | ≤100 |
| 20s | 750 / 375 / 188 | 150 | ≤100 |
| 30s | 500 / 250 / 125 | 100 | ≤100 |
| 60s | 250 / 125 / 63 | 50 | ≤100 |
| 120s | 125 / 63 / 32 | 25 | ≤100 |
| 300s | 50 / 25 / 13 | — | ≤50 |
| 600s | 25 / 13 / 7 | — | ≤25 |
数字人的「全程口播 / 片段中插 / 画中画」(head_duration 为 -1/-2/-3)另有更紧的配额: 15–20s≤50、30s≤40、60s≤20、120s≤10、300s≤4、600s≤2。 超限直接返回 422 并在 detail 里写明当前组合的上限,不会扣积分。
创建成功统一返回:
{
"code": 0, "message": "ok",
"data": {"task_id": 123, "title": "秋季护肤要点", "quantity": 5, "status": 0, "content_type": "fluid"}
}朗读情绪
tts_emotion 控制整段朗读的语气,两种写法:
- 预设情绪名:
开心/平静/惊讶/悲伤/愤怒/忧郁/恐惧/厌恶——走情绪向量,效果最稳。 - 自定义描述:任意一句话,如
像朋友聊天一样轻松随意、播音腔沉稳有力——走模型的文本描述情绪。
留空 = 不指定,跟随参考音本身的语气(与不传该字段行为一致)。
段内情绪切换(精准情绪控制,选填):use_fixed_copy=true 时,可在 description 里 用成对标签把要变语气的句子包起来:
今天的销量又破纪录了,[开心]真的太棒了![/开心]我们来看下具体数据。标签内按该情绪朗读,标签外一律用 tts_emotion——闭合即复位,不需要额外的复位写法。 标签名可写预设情绪名,也可以写自定义描述(如 [像朋友聊天一样]…[/像朋友聊天一样])。
标签本身不会被念出来,也不会进入字幕、分发文案和字数/时长计费(按剥掉标签后的正文算)。 不写标签就整段用 tts_emotion。仅中文朗读(tts_language=zh)支持——英文台词是译文, 标签在翻译前已剥离。
必须成对才生效:只写[开心]没有[/开心]的话,它就是普通正文, 方括号里的字会被念出来——所以要么补上闭合标签,要么别用方括号。 也正因为只认成对,[限时]五折这类正常写法不会被误判成标记。
1. 动画视频(推荐入门,无需素材)
POST /open/fluid-tasks专属字段:
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
fluid_style | auto|karaoke|table|poster|terminal|timeline | auto | 视觉样式:智能匹配 / 卡点字幕 / 表格 / 海报 / 终端 / 时间轴。auto 由 LLM 按文案内容选版式 |
支持的字段就这些(其余一律静默忽略,见上方公共字段表后的提示):
| 用途 | 字段 |
|---|---|
| 文案 | description、use_fixed_copy、humanize |
| 配音 | voice_id、tts_language、tts_speed、tts_emotion、tts_emotion_alpha |
| 音乐 | bgm_id / bgm_ids、bgm_volume、bgm_loop |
| 片尾 | outro_id / outro_ids |
| 画面 | fluid_style、resolution、video_bitrate、cover_config |
| 批量 | quantity、target_duration |
| 归类 | group_id、keep_forever |
横屏传 "resolution": "1920x1080" 即可,版式会按比例重新排布。
curl -X POST "https://ai-mix.chuhaibang.com/api/v1/open/fluid-tasks" \
-H "X-Api-Key: lz_你的密钥" -H "Content-Type: application/json" \
-d '{
"description": "三个方法让短视频完播率翻倍",
"voice_id": 1,
"fluid_style": "karaoke",
"quantity": 2,
"target_duration": 30
}'2. 数字人视频
POST /open/digital-human-tasks专属字段:
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
digital_human_id | int | 必填 | 形象,见 /open/digital-humans |
head_duration | 5 | 8 | 10 | -1 | -2 | -3 | 5 | 正数=开头口播秒数;-1=全程口播;-2=片段中插;-3=画中画 |
pip_config | object | null | 画中画配置(head_duration=-3 时必填):{"crop": {...}, "shape": "circle", "size": 0.3, "pos": {...}, "border": false} |
clip_source | es|group|hot|fluid | es | 数字人之外那段画面从哪来。es 全库检索 / hot 热门分组 / fluid AI 动画都不用自备素材,只有 group 用你自己的分组 |
fluid_style | 同上 | auto | 动画样式(clip_source=fluid 与 interlude_anim 共用) |
interlude_anim | bool | false | 穿插动画讲解:素材来源(es/group/hot)或全程口播(head_duration=-1)+ 实际配音≥20s 时,每约 60s 随机插入 1~2 段整屏动画卡(取当刻旁白做图文动效,约 5s 旁白 + 2s 停留展示)。不满足条件自动忽略;单段渲染失败只跳过该段,不影响出片 |
clip_group_id / clip_group_ids | int / int[] | null | clip_source=group/hot 时的分组 |
clip_group_clip_ids | int[] | null | 精确指定片段 |
prefer_similar_ratio | bool | true | 优先选画面比例接近的片段 |
auto_crawl | bool | false | 保留字段(数字人任务当前不触发自动下载) |
最省事的三种起步方式(都不用准备素材):
head_duration: -1—— 全程口播,整条只有数字人在讲,不涉及画面素材clip_source: "fluid"—— 数字人开场 + AI 生成的文字动效画面clip_source: "hot"+clip_group_ids—— 数字人开场 + 平台热门素材(分组 ID 从/open/clip-groups?source=hot取)
留空 clip_source 走默认的 es 全库检索也可以,平台共享素材库会按文案自动匹配画面。
3. 视频混剪
POST /open/tasks专属字段:
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
clip_source | es|group|hot | es | 画面从哪来。es 全库检索、hot 热门分组都不用自备素材;group 才是你自己的分组(混剪没有 fluid,纯动画请用 /open/fluid-tasks) |
clip_group_id / clip_group_ids / clip_group_clip_ids | — | null | 同数字人 |
mute_original | bool | false | 是否静音原片声音 |
prefer_similar_ratio | bool | true | 同上 |
auto_crawl | bool | false | 素材不足时自动去下载素材(仅 clip_source=es 生效):true 时任务先置 status=5(下载中),下载完成自动续跑 |
素材不足且 auto_crawl=false 时返回 400:
{
"detail": {
"code": "INSUFFICIENT_CLIPS",
"message": "可用片段不足(12/30)",
"keywords": ["护肤", "秋季"],
"clip_count": 12,
"min_clips": 30
}
}任务查询
任务列表
GET /open/tasks?page=1&page_size=20&status=2&content_type=fluid&only_api=true| 参数 | 说明 |
|---|---|
status | 0 待处理 / 1 处理中 / 2 已完成 / 3 部分失败 / 4 全部失败 / 5 下载素材中 |
group_id | 任务分组;0 表示未分组 |
content_type | video / fluid / digital_human(image 为网页端创建的图文任务,API 不支持创建) |
only_api | true = 只看通过 API 创建的任务(默认含网页端创建的) |
data 为分页结构 {total, page, page_size, items},items[] 含 id / title / status / quantity / total_done / total_failed / content_type / cover_url / created_at 等。
任务详情(含全部产出)
GET /open/tasks/{task_id}{
"code": 0, "message": "ok",
"data": {
"task": {"id": 123, "status": 2, "quantity": 2, "total_done": 2, "total_failed": 0, "content_type": "fluid"},
"jobs": [
{
"id": 8801, "job_index": 0, "status": 4,
"script_text": "……成片文案……",
"distribute_copy": "……可直接用于发布的文案……",
"output_url": "https://.../output/xxx.mp4",
"cover_url": "https://.../output/xxx.jpg",
"duration": 30.2,
"image_urls": null
}
]
}
}jobs[].status:0 待处理 / 1 生成台词中 / 2 检索素材中 / 3 合成中 / 4 已完成 / 5 失败。 判断成功要用4(0–3 都是进行中的阶段),失败看5的error_msg。- 成片取
output_url;封面取cover_url。 task会原样回显提交时的全部创作参数(subtitle_template_id/bgm_ids/outro_ids/cover_config/interlude_anim/head_duration…),可用来核对参数是否按预期生效; 其中voice_name/bgm_name/digital_human_name/group_name/clip_group_name是配套的名称,省得再查一次列表接口。task.title由 AI 按成片文案生成。提交瞬间返回的title是description的前 30 字截断, 文案生成完成后会被覆盖——需要正式标题请在轮询到jobs[].status=4后再读。- 视频编码为 H.265(HEVC),1080×1920 / 25fps。个别老旧播放器或平台若不支持,需自行转码。
- 所有 URL 都是公网可直接下载的直链。
- 成品默认只保留 1 天(见「成品保留期」),请及时下载;需要长期留存就在提交时传
keep_forever: true。
产出分页列表
GET /open/tasks/{task_id}/jobs?page=1&page_size=20批量很大(几百条)时用这个,避免详情接口一次返回过多数据。
删除任务
DELETE /open/tasks/{task_id}删除任务及其产出文件,不可恢复,已消耗积分不退。
典型流程
1. GET /open/account # 看积分够不够
2. GET /open/voices # 选音色,拿 voice_id
GET /open/clip-groups # (需要素材的任务)选素材分组
3. POST /open/fluid-tasks # 提交任务,拿 task_id
4. GET /open/tasks/{task_id} # 每 10~30s 轮询一次
→ task.status == 2 取 jobs[].output_url
→ task.status == 3/4 看 jobs[].error_msg
5. 下载成品(默认 1 天后自动清理;要长期保留见「成品保留期」)轮询建议:视频类生成耗时与 quantity × target_duration 正相关,通常几分钟到几十分钟; 间隔 15–30 秒即可,不要 1 秒一次。
Python 示例
import time
import requests
BASE = "https://ai-mix.chuhaibang.com/api/v1/open"
HEADERS = {"X-Api-Key": "lz_你的密钥", "Content-Type": "application/json"}
def post(path: str, payload: dict) -> dict:
r = requests.post(f"{BASE}{path}", json=payload, headers=HEADERS, timeout=30)
if r.status_code != 200:
raise RuntimeError(f"HTTP {r.status_code}: {r.text}")
return r.json()["data"]
def get(path: str, **params) -> dict:
r = requests.get(f"{BASE}{path}", params=params, headers=HEADERS, timeout=30)
if r.status_code != 200:
raise RuntimeError(f"HTTP {r.status_code}: {r.text}")
return r.json()["data"]
# 1) 余额与音色
print("积分:", get("/account")["total_credits"])
voice_id = get("/voices")[0]["id"]
# 2) 提交动画视频任务(不需要素材)
task = post("/fluid-tasks", {
"description": "三个方法让短视频完播率翻倍",
"voice_id": voice_id,
"fluid_style": "karaoke",
"quantity": 2,
"target_duration": 30,
"enable_subtitle": True,
})
task_id = task["task_id"]
# 3) 轮询到完成
while True:
detail = get(f"/tasks/{task_id}")
status = detail["task"]["status"]
if status in (2, 3, 4):
break
print("处理中:", detail["task"]["total_done"], "/", detail["task"]["quantity"])
time.sleep(20)
# 4) 取结果
for job in detail["jobs"]:
if job["status"] == 2:
print(job["output_url"])
print("发布文案:", job.get("distribute_copy"))
else:
print("失败:", job.get("error_msg"))