工具 API
使用现有 API 密钥调用视频净化、分镜提示词和文字转语音。
基础地址为 https://aihub-admin.aimix.pro/api-platform/v1,请求头使用 Authorization: Bearer YOUR_API_KEY。视频工具需要密钥的视频权限,TTS 需要音频权限;原有不限制权限的密钥可直接调用。网站积分与 API 积分使用独立余额。
| 工具 | 创建接口 | 查询接口 | 计费单位 |
|---|---|---|---|
| 去字幕 / 指定区域去水印 | POST /video/remove-subtitles 或 /video/remove-watermark | 创建返回的 statusUrl | 每 30 秒向上取整 |
| 视频转提示词 | POST /video-to-prompt | GET /tasks/{taskId} | 每 30 秒向上取整 |
| 文字转语音 | POST /tts/synthesize | 同步返回 | 每 100 字符向上取整 |
GET /tools 返回当前配置的 API 单位价格、规格、cleanupAvailability 与 ttsAvailability。可用状态检查配置及价格,不代表实时供应商健康检查。未配置的引擎 / 服务在在线调试中禁用,调用时在扣费前返回 503。原 GET /pricing 保留。视频净化由后端探测真实时长,例如 31 秒按两个单位计费;PRO 按选中矩形尺寸分档,未指定区域时按原视频尺寸分档。微软 TTS 沿用现有零积分规则。
成功响应为 {code:1000,message,data}。同时检查 HTTP 状态与 code。400 表示参数错误,401 为密钥问题,402 为 API 余额不足,403 为权限不足,409 为幂等冲突,429 为限流,503 为服务配置缺失。
视频净化与 TTS 支持可选 Idempotency-Key(1–128 个可打印字符)。同一用户、应用、租户、接口、键及参数,在 24 小时内返回已完成的原响应;参数不一致或原请求仍在执行 / 状态不确定时返回 409。丢失响应后不要自动换键重试付费 POST。视频转提示词保留原有提交行为,不支持这次新增的幂等功能。
本地视频使用临时媒体上传:先获取预签名地址,再 PUT 文件,把返回的 fileUrl 作为 videoUrl。视频净化会将临时素材绑定到任务,现有清理任务处理终态素材及过期未使用上传。
每 5–10 秒查询一次,直到 ready 或 failed。净化接口返回的是作品任务 ID,内部映射到 common_task;查询校验用户、应用与租户归属。查询不会再次扣费。停止客户端轮询不会取消后台任务,可用原任务 ID 继续查询。
const origin = "https://aihub-admin.aimix.pro";
const url = new URL(created.data.statusUrl, origin);
if (url.origin !== origin) throw new Error("Invalid status URL");
for (;;) {
const response = await fetch(url, {headers: {Authorization: `Bearer ${process.env.PIXMIND_API_KEY}`}});
const result = await response.json();
if (!response.ok || result.code !== 1000) throw new Error(result.message);
if (result.data.status === "failed") throw new Error(result.data.error?.message);
if (result.data.status === "ready") { console.log(result.data); break; }
await new Promise(resolve => setTimeout(resolve, 5000));
}import os, time, requests
headers = {"Authorization": "Bearer " + os.environ["PIXMIND_API_KEY"]}
url = "https://aihub-admin.aimix.pro/api-platform/v1/video/cleanup/tasks/123"
for _ in range(1440):
response = requests.get(url, headers=headers, timeout=30)
response.raise_for_status()
result = response.json()
if result["code"] != 1000: raise RuntimeError(result["message"])
task = result["data"]
if task["status"] == "failed": raise RuntimeError(task["error"]["message"])
if task["status"] == "ready":
print(task)
break
time.sleep(5)