调用接口需要在「用户中心 → 开放平台」获取 API 密钥。

灵造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_你的密钥"

失败响应:

HTTPdetail含因
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}
  ]
}
字段类型说明
idint填给 voice_id 的值
namestring音色名
descriptionstring音色说明(音质、适合的内容类型)
audio_urlstring试听直链
categorystring后台配置的分类标签;当前预设音色多为 null(未分类)
is_presetbooltrue=平台预设,全体可用;false=你自己克隆的专属音色
sort_orderint推荐排序,越小越靠前
做数字人视频时,优先用 /open/digital-humans 里该形象的 voice_profile_id —— 那是与形象绑定的音色,口型贴合度最好。

背景音乐

GET /open/bgm
字段类型说明
idint填给 bgm_id / bgm_ids 的值
namestring曲目名
file_urlstring音频直链,可直接试听
durationfloat时长(秒)。比成片短也没关系,bgm_loop: true 会自动循环填满
categorystring大类,如「史诗大气」「轻快活泼」
tagsstring[]情绪标签数组,如 ["紧张","悬念","爆发"],便于按调性筛选
is_presetbooltrue=平台预设;false=你自己上传的
sort_orderint平台推荐排序,越小越靠前
传 bgm_ids(数组)时每条视频各自随机取一首,批量出片不会首首雷同。

片尾视频

GET /open/outros
字段类型说明
idint填给 outro_id / outro_ids 的值
titlestring片尾名称(如「竖版-免费领-v4」,名称里通常标明了适用比例)
descriptionstring补充说明
file_urlstring视频直链,可先预览
durationfloat时长(秒)。会追加在成片末尾,成片总长 = 正片 + 片尾
width / heightint片尾分辨率。与任务 resolution 比例不一致时系统会自动适配
传 outro_ids(数组)时每条视频随机取一个。

数字人形象

GET /open/digital-humans
字段类型说明
idint填给 digital_human_id 的值
namestring形象名称
descriptionstring形象说明(口播风格、适用场景)
file_urlstring形象样片直链
cover_urlstring封面图
durationfloat样片时长(秒)
is_presetbooltrue=平台预设,全体可用;false=你自己上传的专属形象
is_loopbool样片是否为无缝循环素材
voice_profile_idint该形象绑定的音色。没有特别偏好时,voice_id 就填它,口型与音色最贴合
pip_cropobject画中画默认裁剪框,head_duration: -3 时可直接拿来填 pip_config.crop

素材分组

GET /open/clip-groups?source=group   # 我的分组(默认)
GET /open/clip-groups?source=hot     # 平台热门分组
字段类型说明
idint填给 clip_group_id / clip_group_ids 的值
namestring分组名
descriptionstring分组说明
clip_countint组内可用片段数。太少会导致成片重复镜头多,建议 ≥30
is_hotbool是否为平台热门分组
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;不传该字段则系统在分组内自动挑选。

字段类型说明
idint填给 clip_group_clip_ids 数组的值
clip_indexint片段在原视频中的序号。这是展示用序号,不是 id,别混用
raw_video_idint来源原始视频 ID
start_time / end_timefloat该片段在原视频中的起止秒数
durationfloat片段时长(秒)
file_urlstring片段直链
cover_urlstring首帧缩略图
transcriptstring片段内的语音转写文本(没有人声则为空)
tagsstring[]画面标签

data 为分页结构 {total, page, page_size, items},page_size 最大 500。 本人分组与平台热门分组都可以查。

任务分组

GET /open/groups

给作品归类用(就是网页端「我的作品」里的作品分类),对应创建任务时的 group_id。

字段类型说明
idint填给 group_id 的值
namestring分类名,如「电商」「科技」「美食」
is_presetbooltrue=平台预设分类;false=用户在网页端自建的
sort_orderint排序

不传 group_id 则任务归入「未分类」。任务详情会回显 group_name 便于核对。

封面模板

GET /open/cover-templates?portrait=true
字段类型说明
template_idstring填给 cover_config.template_id 的值
namestring模板名,如「对话气泡·冷静沉底」
imagestring排版示意图。挑模板就看这个——注意它只演示版式,实际大字是按你的文案生成的
is_randombool是否为「随机模板」哨兵项

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_idstring填给 subtitle_template_id 的值
namestring模板中文名
descstring一句话说明该模板的视觉风格
entrancesstring[]该模板会按句轮换的字幕特效(见下表)
has_sfxbool是否支持字幕音效(配合 enable_subtitle_sfx)
bottom_percentfloat该模板的默认字幕高度,即 subtitle_bottom_percent 不传时的实际取值
videostring示例 MP4 直链,选模板前建议先看这个
is_randombool是否为「随机模板」哨兵项

可选模板(接口按此顺序返回)

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"}

创作任务

三类视频任务的公共字段:

字段类型默认说明
descriptionstring必填主题或固定文案,1–3000 字
use_fixed_copyboolfalsetrue = description 即最终文案,AI 不改写正文
humanizeboolfalse去 AI 味引擎(仅 AI 生成文案时有效)
voice_idint—朗读音色,见 /open/voices
tts_languagezh | ennull留空按文案自动判断
tts_speedfloat1.00.8–1.2
tts_emotionstringnull朗读情绪,见下方「朗读情绪」
bgm_id / bgm_idsint / int[]null多选时每条视频随机取一首
bgm_volumeint251–200(相对原声百分比)
bgm_loopbooltruefalse = 只播一遍
quantityint10 / 3生成条数。上限随任务类型与时长变化,见下方「时长档位与数量上限」
resolutionstring1080x1920形如 宽x高
target_durationint15目标时长(秒)。AI 写文案时只能取固定档位,见下方「时长档位与数量上限」
video_bitrate1M|2M|4M1M(动画 2M)码率。动画视频例外:主体画面由渲染服务直出固定高画质,该值只作用于片尾拼接与封面烧录的重编码
outro_id / outro_idsint / int[]null片尾,多选时随机取一个
cover_configobjectnull{"template_id": "xx"},见 /open/cover-templates
group_idintnull归入某个任务分组
keep_foreverboolfalse永久保留成品。默认 false,成品只保留 1 天;true 则不再自动清理(见下方「成品保留期」)
enable_titleboolfalse顶部大标题烧录
title_textsstringnull每行一条,按条分配;留空则用 AI 提取
title_font_sizefloat5.0相对画面高度百分比 0.1–10
title_y_percentfloat8.0距顶部百分比
title_font_colorstring#ffffff十六进制色值
enable_subtitleboolfalse逐句字幕
subtitle_template_idstringnull字幕模板,见 /open/subtitle-templates;留空=经典字幕(无动效)
enable_subtitle_sfxboolfalse字幕音效开关;与高亮词同步(每个高亮必响,同词至少隔 4s),经典字幕同样支持
subtitle_bottom_percentfloatnull字幕距画面底部的百分比(6–70,越大越靠上);不传=用所选模板的默认高度
subtitle_font_keystringnull字幕字体覆盖,取值见 GET /open/subtitle-fonts;不传=跟随模板默认字体。细笔画字体会自动补描边保证可读性
subtitle_font_scalefloatnull字幕字号系数(0.7–1.5);在所选模板算完字号后再乘一道,不传/1.0=用模板默认字号。英文与横屏各自的缩放照常生效,本系数叠在它们之后
transition_typestringnull转场,如 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动画视频数字人(前缀模式)
15s1000 / 500 / 250200≤100
20s750 / 375 / 188150≤100
30s500 / 250 / 125100≤100
60s250 / 125 / 6350≤100
120s125 / 63 / 3225≤100
300s50 / 25 / 13—≤50
600s25 / 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_styleauto|karaoke|table|poster|terminal|timelineauto视觉样式:智能匹配 / 卡点字幕 / 表格 / 海报 / 终端 / 时间轴。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_idint必填形象,见 /open/digital-humans
head_duration5 | 8 | 10 | -1 | -2 | -35正数=开头口播秒数;-1=全程口播;-2=片段中插;-3=画中画
pip_configobjectnull画中画配置(head_duration=-3 时必填):{"crop": {...}, "shape": "circle", "size": 0.3, "pos": {...}, "border": false}
clip_sourcees|group|hot|fluides数字人之外那段画面从哪来。es 全库检索 / hot 热门分组 / fluid AI 动画都不用自备素材,只有 group 用你自己的分组
fluid_style同上auto动画样式(clip_source=fluid 与 interlude_anim 共用)
interlude_animboolfalse穿插动画讲解:素材来源(es/group/hot)或全程口播(head_duration=-1)+ 实际配音≥20s 时,每约 60s 随机插入 1~2 段整屏动画卡(取当刻旁白做图文动效,约 5s 旁白 + 2s 停留展示)。不满足条件自动忽略;单段渲染失败只跳过该段,不影响出片
clip_group_id / clip_group_idsint / int[]nullclip_source=group/hot 时的分组
clip_group_clip_idsint[]null精确指定片段
prefer_similar_ratiobooltrue优先选画面比例接近的片段
auto_crawlboolfalse保留字段(数字人任务当前不触发自动下载)

最省事的三种起步方式(都不用准备素材):

  • 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_sourcees|group|hotes画面从哪来。es 全库检索、hot 热门分组都不用自备素材;group 才是你自己的分组(混剪没有 fluid,纯动画请用 /open/fluid-tasks)
clip_group_id / clip_group_ids / clip_group_clip_ids—null同数字人
mute_originalboolfalse是否静音原片声音
prefer_similar_ratiobooltrue同上
auto_crawlboolfalse素材不足时自动去下载素材(仅 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
参数说明
status0 待处理 / 1 处理中 / 2 已完成 / 3 部分失败 / 4 全部失败 / 5 下载素材中
group_id任务分组;0 表示未分组
content_typevideo / fluid / digital_human(image 为网页端创建的图文任务,API 不支持创建)
only_apitrue = 只看通过 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"))