一条 60 秒短视频,过去要写脚本、找素材、剪辑、配音、打字幕、做封面,一个人熬一整晚; 现在同样一条片子,40 分钟能出初稿。差距不在"有没有 AI",而在你有没有把它放对位置。

一、先破除一个误区:AI 不是"一键出片"

打开任何一款号称"一键生成短视频"的工具,你会发现同一个规律:演示视频里都是风景、萌宠、语录——这些恰恰是最不需要叙事能力的题材。

真实业务里的短视频要解决的问题是"让人看完、看懂、记住、行动"。这四个字,AI 目前只能帮你解决前半段。

先把能力边界摆清楚,能省下你 80% 的试错时间:

AI 在短视频制作中的能力边界:能做什么、不能做什么

环节 AI 现在能做(可用) AI 现在做不好(别指望)
选题 按人群/痛点批量出选题、给标题、判断赛道饱和度 判断你所在行业的"隐性规矩"
脚本 输出结构完整的口播稿、分镜表、钩子句 写出带个人辨识度的表达风格
素材 文生图、图生视频、数字人口播、AI 配乐 生成你公司的真实产品、真实场景
剪辑 自动粗剪、按节奏卡点、去废片、横竖屏转换 理解"这条片子想让谁下单"
配音字幕 高自然度 TTS、自动打轴、关键词高亮 方言、行业黑话的准确发音
封面标题 批量出封面方案、标题多版本 A/B 判断哪个封面在你的号上更灵
发布分发 多平台一次成稿、格式适配 平台风控与流量池的判断

一句话原则:AI 负责"把 60 分的稿子 30 分钟内做出来",你负责"把它抬到 85 分"。


二、完整操作:用 AI 做一条短视频的七步

下面这七步是我实际跑通的流程,每一步都给出"做什么、用什么、怎么下提示词、什么标准算过关"。

AI 短视频生产七步法:从选题到分发

第 1 步:定位与选题——别从"我想说什么"开始

从"谁会看、他在什么场景下看"开始。

做法:把你的目标客户列成一句话(例如"30 岁上下、正在考虑给厂区上监控的工程负责人"),然后让 AI 从这个人群的具体场景里挖选题。

提示词模板:

你是短视频选题策划。我的受众是【人群描述】,他们最头疼的三件事是【痛点A/B/C】。
请围绕"选型/避坑/验收"三个角度,各给我 5 个短视频选题,
要求:每个选题必须是一个具体场景(有人、有事、有时间地点),不要泛泛的行业概念。
输出表格:选题 | 目标人群 | 痛点 | 预期完播钩子(前3秒说什么)。

过关标准:你能一眼指出"这条是给谁看的"。指不出来,就重做。

新手最容易卡在这里——不是没素材,是没有"具体的人"。选题一旦具体,脚本会自己长出来。


第 2 步:脚本与分镜——从一句话到可拍摄的分镜表

做法:先定结构,再填内容。短视频的骨架永远是三段:钩子(0–3 秒)→ 干货(3–45 秒)→ 行动(最后 5 秒)。

提示词模板:

基于选题「【选题】」,写一条 60 秒短视频脚本。
结构固定为:钩子(0-3s) / 主体(3-45s,分3个小点) / 结尾行动(45-60s)。
口播稿控制在 220 字以内(中文语速约 4 字/秒,留出停顿)。
再输出一张分镜表:镜号 | 时间 | 画面描述 | 口播 | 屏幕字幕 | 素材类型(实拍/图文/生成)。

关键技巧:让 AI 把"屏幕字幕"也一起写出来。字幕是短视频的第二条信息线,只看不听的人靠它。

过关标准:把口播稿掐着秒表念一遍,超时就砍——不是砍内容,是砍修饰语。


第 3 步:素材生产——AI 生图、生视频、数字人怎么选

三种素材路线,成本与效果差异极大:

素材路线 适用题材 优点 坑
文生图 + 图生视频 概念解释、数据可视化、氛围空镜 成本最低,风格统一 画面"动起来"很轻微,别指望复杂动作
数字人口播 知识科普、产品讲解、口播号 一次录音可复用,能批量 口型与情绪偏僵,长段落容易出戏
实拍 + AI 辅助 工程现场、产品演示、真人 IP 可信度更高 AI 只做剪辑/字幕/配音,别让它生成主体画面

经验值:一条 60 秒片子,3–5 秒一个画面切换是舒适区;AI 生成的静止画面不要超过 4 秒,超过就会让观众感觉"卡住了"。

提示词模板(文生图):

【主体】在【场景】中,【光线/时间】,【镜头:中景/特写/航拍】,
【风格:写实/科技感/扁平插画】,画面干净,留出上方 1/3 空白放字幕。
画面比例 9:16。

重要:AI 生成的画面不要出现文字。让模型画文字,十有八九是乱码。文字留给字幕层,后期加。


第 4 步:智能剪辑——把"粗剪"交给机器

做法:把素材(实拍 + 生成图 + 音乐)丢进剪辑工具,先让它做三件事:

  1. 自动粗剪:按语音停顿切段,删掉长静音与废片;
  2. 自动卡点:根据音乐节拍给转场定位;
  3. 批量规格:一次导出 9:16 / 1:1 / 16:9 三个版本。

过关标准:粗剪版本你自己静音看一遍能不能看懂。看不懂 → 是分镜的问题,不是剪辑的问题,回第 2 步。


第 5 步:配音与字幕——决定"专业感"的隐形分水岭

三个硬指标:

  • 语速:知识类 4–4.5 字/秒,带货口播 5–6 字/秒。太快没人听懂,太慢划走。
  • 停顿:每个小点之间留 0.3–0.5 秒,给观众"消化"的空隙。
  • 字幕:一行不超过 15 个字,禁止把整段话糊在屏幕下方;关键词用颜色或加粗突出。

做法:先用 TTS 把口播跑一遍听语速,再用自动打轴生成字幕,最后手工改掉同音错字(专业名词必改)。


第 6 步:封面与标题——决定 5% 播放量的地方

短视频的封面不是"配图",它是第二个标题。

  • 封面文字:不超过 12 个字,能独立说清"这条视频给我什么好处";
  • 三种高转化封面结构:
  • 数字型:「3 个坑」「5 分钟」;
  • 对比型:「这么做 vs 那么做」;
  • 结论型:「XX 其实不用买贵的」。
  • 标题:把封面文字换个说法,形成"互补"而不是"重复"。

提示词模板:

我是做【行业】的短视频账号。这条视频讲【核心内容】。
请给我 8 个封面文案(≤12字)和 8 个配套标题(≤20字),
要求:封面文案和标题不重复、互相补充;风格口语化,不要夸张承诺。
最后标出你最推荐的 3 组,并说明推荐理由。

第 7 步:发布与分发——格式适配 + 素材自托管

到这里片子已经成了。剩下的两件事最容易被忽略,却直接决定"能不能被看见":

  1. 平台规格适配:竖屏 9:16(1080×1920)、封面比例按平台要求单独导出;
  2. 配图与封面自托管:把文章的封面图、正文配图落到自己的域名下,而不是引用第三方图床地址。

第 2 条就是接下来要讲的技术部分——也是很多人文章发出去"图片变裂图"的根因。


三、技术指南:图片上传接口的完整用法

讲到这一节,前提是你的内容要同时发自有站点 + 公众号两处。

如果只发公众号,你把图传进公众号素材库就行;但只要你还要发到自己的站点,就必须解决一个问题:图片不能依赖别人的服务器。

素材自托管:为什么必须先传图、再推文

3.1 为什么必须自托管?

公众号的图片地址(mmbiz.qpic.cn)带防盗链:只要请求头里带着别的站点的 Referer,它返回给你的不是原图,而是一张 140×140 的占位图——上面写着"此图片来自微信公众平台,未经允许不可引用"。

这就是"本地看着好好的,放到网站上全是糊图/裂图"的真正原因。

所以正确的顺序是固定的:先传图 → 拿到自己的 URL → 再推文。

3.2 接口速览

项目 值
地址 POST https://ai.xalcy.cn/api/upload.php
请求类型 multipart/form-data
单张上限 5 MB
单次张数 10 张
像素上限 4000 万像素(防像素炸弹)
支持格式 JPEG / PNG / GIF / WebP
存放位置 public/assets/uploads/(不存在自动创建)
URL 前缀 https://ai.xalcy.cn/assets/uploads/

3.3 鉴权:为什么不能照抄推文接口的签名?

这是整个接口唯一需要动脑的地方。

推文接口是 application/json,服务端能从 php://input 读到完整的请求体,所以签名对象就是"时间戳 + 原始请求体"。

但上传接口是 multipart/form-data——请求体会被 PHP 直接消费进 $_FILES,php://input 是空的,根本拿不到可以签名的原始报文。所以这里换了一个签名对象:文件内容的 sha256。

两种接口的签名对象差异:JSON 签报文,multipart 签文件摘要

X-Api-Key:    <API_KEY>
X-Timestamp:  <Unix 秒级时间戳>
X-Signature:  HMAC-SHA256( 时间戳 + "." + sha256(文件1) [+ "." + sha256(文件2) ...] , API_SECRET )

两个细节别搞错:

  • sha256 的拼接顺序必须与文件上传顺序一致;
  • 每个 sha256 固定 64 位十六进制,所以拼接结果不会有歧义;
  • 时间戳有效期 300 秒,过期直接拒签(防重放)。

联调阶段如果嫌算签名麻烦,可以临时用 Authorization: Bearer <API_SECRET> 免签名调用——但正式脚本一定要用 HMAC,因为 Bearer 一旦泄露等同于把写权限交出去。

3.4 三种调用方式

① curl(最快验证)

curl -X POST https://ai.xalcy.cn/api/upload.php \
  -H "Authorization: Bearer $API_SECRET" \
  -F "files[]=@cover.jpg" \
  -F "files[]=@detail-01.jpg" \
  -F "name=ai-video-guide" \
  -F "alt=用 AI 做短视频"

② Python(推荐给自动化流程)

import os, hashlib, hmac, time, requests

API_URL    = "https://ai.xalcy.cn/api/upload.php"
API_KEY    = os.environ["AIXALCY_API_KEY"]
API_SECRET = os.environ["AIXALCY_API_SECRET"]

def upload_images(paths, name="", alt=""):
    ts = str(int(time.time()))
    # 签名对象 = 时间戳 + "." + 各文件内容的 sha256(顺序须与上传顺序一致)
    digests = [hashlib.sha256(open(p, "rb").read()).hexdigest() for p in paths]
    base    = ts + "." + ".".join(digests)
    sig     = hmac.new(API_SECRET.encode(), base.encode(), hashlib.sha256).hexdigest()

    handles = [open(p, "rb") for p in paths]
    try:
        files = [("files[]", (os.path.basename(p), h, "image/jpeg"))
                 for p, h in zip(paths, handles)]
        data = {k: v for k, v in (("name", name), ("alt", alt)) if v}
        r = requests.post(API_URL, timeout=120, files=files, data=data, headers={
            "X-Api-Key": API_KEY, "X-Timestamp": ts, "X-Signature": sig})
        r.raise_for_status()
        return r.json()
    finally:
        for h in handles:
            h.close()

res = upload_images(["cover.jpg", "detail-01.jpg"], name="ai-video-guide", alt="用 AI 做短视频")
for f in res["files"]:
    print(f["url"])   # → 直接写进正文 <img src> 与 cover_image
    print(f["html"])  # → 或直接粘贴这个 <img> 片段

③ PHP 命令行客户端

# 用站点自带的客户端,签名与重试都封装好了
php scripts/upload_client.php cover.jpg detail-01.jpg --name=ai-video-guide --alt="用 AI 做短视频"
php scripts/upload_client.php cover.jpg --json      # 只输出 JSON,便于脚本解析
php scripts/upload_client.php cover.jpg --dry-run   # 只打印签名与文件清单,不发送

3.5 返回值:四个字段各有各的用途

{
  "success": true, "count": 2, "failed": 0,
  "files": [{
    "name":  "ai-video-guide-01.jpg",
    "path":  "/assets/uploads/ai-video-guide-01.jpg",
    "url":   "https://ai.xalcy.cn/assets/uploads/ai-video-guide-01.jpg",
    "html":  "<img src=\"https://ai.xalcy.cn/assets/uploads/ai-video-guide-01.jpg\" alt=\"\" width=\"1200\" height=\"675\" loading=\"lazy\">",
    "markdown": "![](https://ai.xalcy.cn/assets/uploads/ai-video-guide-01.jpg)",
    "size": 184320, "mime": "image/jpeg",
    "width": 1200, "height": 675, "sha256": "9f2c1b..."
  }],
  "errors": []
}
字段 怎么用
url 绝对地址,直接写进 cover_image 或正文 <img src>
path 站内相对路径,适合存库或做批量替换
html / markdown 直接粘贴的片段,已带 width/height,避免页面跳动(CLS)
sha256 内容指纹,用来判断"这张图是不是已经传过了"

注意:上传接口不做幂等。同一张图重复上传会得到不同文件名;要去重就自己比对 sha256。而文章入库的幂等由推文接口的 source_id 保证,重试不会产生重复文章。

3.6 完整流程串起来

① AI 写完文章(Markdown / HTML)
        ↓
② 配图落到本地(微信 CDN 图必须下载、AI 生图直接存盘)
        ↓
③ POST /api/upload.php          ← 拿 url / html / markdown
        ↓
④ 把 URL 写进文章:正文 <img src="…"> + 封面字段 cover_image
        ↓
⑤ POST /api/push.php            ← 文章入库(HMAC 签"时间戳.原始请求体")
        ↓
⑥ 前台立即可见;后台「媒体库」可查看 / 删除图片

两条铁律:

  • 顺序不能反:先推文、后传图,正文里的图片地址就成了无效路径,只会产生脏数据;
  • 封面与正文首图不能是同一张:多数模板会把封面单独渲染在正文顶部,如果正文第一张图又和封面同源,页面顶部就会出现两张一模一样的图。构建文章时记得把正文里与封面同源的那张首图去掉。

3.7 服务端三层限制与安全(运维提醒)

层 参数 建议值
Nginx / OpenResty client_max_body_size 60m
PHP post_max_size 64M
PHP upload_max_filesize 8M

三层里任何一层不放大,请求都会被提前拦掉。

另外两件必做的事:

  • 上传目录禁止执行脚本(把 nginx-uploads-snippet.conf 贴进站点配置,Apache 用已内置的 .htaccess);
  • 扩展名由服务端按真实 MIME 决定,不采信客户端文件名——所以 shell.php.jpg 这类双扩展名攻击天然无效。

体积建议:单张压到 1600px 宽以内、200KB 左右,兼顾加载速度与流量成本。


四、常见问题与注意事项

AI 短视频制作避坑速查:8 个高频问题

4.1 内容与创作侧

问题 现象 原因 处理
完播率上不去 前 3 秒就掉一半人 开头在自我介绍或铺垫 把结论/冲突提到第 1 句,删掉所有"大家好"
画面像 PPT 观众说"有点闷" 单画面停留过久 3–5 秒切一次;AI 静图不超过 4 秒
字幕看不懂 专业词出错、一屏字太多 自动打轴未校对 一行 ≤15 字;专业名词逐个核对
配音像机器人 听着别扭 语速、停顿不自然 4–4.5 字/秒,小点之间留 0.3–0.5 秒
AI 画面有乱码文字 图上出现鬼画符 让模型直接生成文字 画面不出现文字,文字全部后期加
数字人口型出戏 长段落越听越假 单段过长 单段控制在 15 秒内,中间插空镜
多个平台画质被压 发出去变糊 一次导出多平台 9:16 单独导出,码率留足,别多次转码
账号被限流 播放量长期异常低 搬运/未标注 AI 生成内容 用自有素材,按平台要求标注 AI 生成

4.2 技术与发布侧(图片接口相关)

问题 报错 / 现象 原因与处理
签名不通过 bad_signature 十有八九是"照抄了推文接口的签名"——上传接口签的是文件 sha256,不是请求体
签名过期 expired 时间戳超过 300 秒。检查服务器时间是否同步
只传了 Key missing_signature 有 X-Api-Key 没带 X-Signature;补上签名或用 Bearer
请求体过大 payload_too_large 超过 post_max_size。响应里会附带实际配置值与调整建议
没收到文件 no_file 字段名必须是 files[] 或 file
超出张数 too_many_files 单次超过 10 张,拆成两批
上传目录写入失败 上传目录不可写:assets/uploads 调整属主/权限,PHP 进程用户常见为 www / www-data / nginx
站点上图片变裂图 显示"未经允许不可引用" 引用了微信 CDN 外链。全部换成自托管 URL 后重推

三条最容易踩的坑,单独强调:

  1. 别用 URL 末段判断图片是否重复。微信图片地址形如 .../{尺寸}?wx_fmt=png&from=appmsg,末段几乎全是同一个值——比重复要比较完整 URL,或者直接比 sha256。
  2. 核验图片必须带上站点的 Referer。不带 Referer 用命令行测是正常的,一放到网页上就变成占位图。测的时候要把 Referer 加上去,才知道用户真正看到的是什么。
  3. 批量核验不要并行。几百个请求同时打过去会把连接打满,产生一堆假的"失败"。串行 + 每次间隔 0.1–0.2 秒,结果才可信。

五、一页速查:从 0 到发布

【创作】
□ 定受众:一句话说清"这条给谁看"
□ 出选题:从具体场景切入,不要行业概念
□ 写脚本:钩子3s + 主体42s + 行动5s,口播 ≤220字
□ 出分镜:画面 / 口播 / 字幕 / 素材类型 四列齐全
□ 备素材:实拍 + AI 生图/生视频/数字人,3–5s 一切
□ 粗剪:静音看一遍,看不懂就回分镜
□ 配音字幕:4–4.5字/秒,一行≤15字,名词必校对
□ 封面标题:≤12字封面 + ≤20字标题,互补不重复

【发布】
□ 导出规格:9:16 单独导出,封面按平台要求
□ 配图自托管:下载第三方便 → POST /api/upload.php → 拿 url
□ 写入文章:正文 <img src=url>,cover_image = url
□ 去掉正文首图(与封面同源那张),避免页面顶部重复
□ 推送入库:POST /api/push.php,带 source_id 保证幂等
□ 核验:带 Referer 复测图片、检查无外链残留

写在最后

AI 把短视频的制作成本压到了一个前所未有的低点,但它没有把"想清楚给谁看"这件事变简单。

真正的分水岭从来不是工具,而是你有没有一套可复用、可核验的流程: 选题具体到人、脚本卡到秒、素材握在自己手里、发布前逐项打勾。

流程一旦成型,AI 才真正变成你的产能。

你现在的短视频卡在哪一步?是选题、脚本,还是剪辑?欢迎在留言区说说,我挑典型的出下一期。

#短视频制作 #AI视频剪辑 #AIGC #数字人 #内容运营 #自媒体干货 #图片自托管 #技术指南