输入一个选题,系统自动写文案、配画面、生成视频、加字幕配音,最后吐出一条能直接发的短视频。这篇把这条流水线讲透。
写在前面
短视频是当下流量最大的内容形态,但产能是个老大难——一条像样的口播/混剪短视频,从选题、写脚本、找素材、配音、剪辑、加字幕,全套下来好几个小时。批量做号的人,卡的就是这个产能。
好消息是,这条链路上的每一环,现在都有对应的 AI 模型能接管:文案有大模型,画面有文生图,动起来有图生视频,配音有 TTS。真正的工程难点,是把这些分散的模型,串成一条能一键跑通的流水线。 这篇就带你搭这套系统,并在中途接入 4sapi.com 这个中转 API统一调度全部模型。
一、先理清楚:一条短视频是怎么"流水"出来的
一个选题
↓
① 文案脚本 选题 → 分镜脚本(每段:口播文案 + 画面描述)
↓
② 画面生成 每段画面描述 → 关键帧图片(文生图)
↓
③ 视频片段 关键帧 → 带动效的视频片段(图生视频)
↓
④ 配音 口播文案 → 配音音频(TTS)
↓
⑤ 合成成片 片段 + 配音 + 字幕 → 一条完整短视频
这条线把四类模型全用上了:①文本、②文生图、③图生视频、④语音。四类模型分散在不同厂商——这正是要引入中转 API 的原因,也是这条流水线最适合用统一网关的场景。
二、架构设计:五段流水线 + 一个中转网关
┌──────────────────────────┐
输入选题 ──→ │ Pipeline 流水线总控 │
└─────────────┬────────────┘
│ 顺序流转
┌──────────┬──────────┬───────┼───────┬──────────┐
↓ ↓ ↓ ↓ ↓ ↓
[脚本] [文生图] [图生视频] [配音] [字幕] [合成]
└──────────┴──────────┼───────┴───────┴──────────┘
↓
┌──────────────────────────┐
│ 统一 API 网关 (4sapi) │ ← 文本/图像/视频/语音全走这
└──────────────────────────┘
关键设计点:这条线四类模型全要用,是统一网关价值最大的场景。 如果挨个对接官方 API,光是文本、图像、视频、语音四家账号和四套鉴权就够喝一壶。统一走中转网关后:
- 一个 Key 调四类模型:文本、图像、视频、语音,全是 OpenAI 兼容格式;
- 每一环都能独立换模型:文案换个更会写的、画面换个更好看的,各改一个
model 参数互不影响;
- 整条线消耗集中算账:一条视频要调好几类模型,成本全在一个后台看得清。
网关选 4sapi.com,文本/文生图/图生视频/语音模型都能统一调用,正好覆盖全链路。
三、中途接入 4sapi:三步把网关接通
第一步:拿 Key、记住 BaseURL
注册 4sapi.com,后台创建令牌(sk-xxxxxxxx),记下接口地址:
放进环境变量,别硬编码:
bash
# .env
FOURSAPI_BASE_URL=https://4sapi.com/v1
FOURSAPI_KEY=sk-你的令牌
第二步:封装统一客户端(四类调用全在这)
这条流水线四类模型都要用,索性把它们都封装进同一个网关模块:
python
# gateway.py —— 一个网关,吃下文本/图像/视频/语音
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["FOURSAPI_KEY"],
base_url=os.environ["FOURSAPI_BASE_URL"], # 指向中转网关
)
def chat(model, messages, **kw):
return client.chat.completions.create(
model=model, messages=messages, **kw).choices[0].message.content
def gen_image(prompt, size="1080x1920"): # 竖屏短视频用 9:16
return client.images.generate(
model="flux-dev", prompt=prompt, size=size).data[0].url
def img_to_video(image_url, motion, seconds=4):
return client.post("/videos/generations", body={
"model": "kling-v1", "image": image_url,
"motion": motion, "duration": seconds,
})["video_url"]
def tts(text, voice="zh-male-1"):
return client.audio.speech.create(
model="tts-1", voice=voice, input=text).content
第三步:发请求验证连通
python
if __name__ == "__main__":
print(chat("gpt-4o-mini",
[{"role": "user", "content": "回复两个字:通了"}]))
四类调用共用一个客户端,连通后整条流水线就都能跑了。本质仍是「改 base_url + 配 Key」。
四、关键环节实现
4.1 脚本 Agent —— 选题变分镜脚本
让模型直接输出结构化分镜,每段同时给口播文案和画面描述,下游好对接:
python
import json
def script_agent(topic):
prompt = f"""你是短视频编导。把选题扩写成 5-8 段分镜脚本,输出 JSON 数组。
每段含字段:narration(口播文案,口语化), visual(画面英文描述,用于文生图),
motion(运镜:推/拉/摇/移)。选题:{topic}"""
raw = chat("gpt-4o",
[{"role": "user", "content": prompt}],
response_format={"type": "json_object"})
return json.loads(raw)["scenes"]
4.2 画面 + 视频 Agent —— 让每段活起来
每段先文生图出关键帧,再图生视频加运镜。竖屏短视频务必用 9:16 尺寸:
python
def visual_agent(scene):
# 统一画风后缀,让整条片子视觉连贯
prompt = f"{scene['visual']}, cinematic, vertical 9:16, vivid color"
frame = gen_image(prompt) # 文生图
clip = img_to_video(frame, scene["motion"]) # 图生视频
return clip
4.3 配音 + 字幕 Agent —— 声音和字一起上
口播文案合成配音,同时直接拿文案当字幕(省掉语音转写这一步):
python
def audio_agent(scene):
voice_audio = tts(scene["narration"]) # 配音
subtitle = scene["narration"] # 文案即字幕
return voice_audio, subtitle
4.4 合成 Agent —— 片段、配音、字幕合成成片
python
def compose_agent(clips, audios, subtitles):
# 用 ffmpeg/moviepy 把每段视频 + 配音对齐,叠加字幕,顺序拼接
# 这里给出思路,实际用 moviepy 的 concatenate + CompositeVideo
final = video_toolkit.merge(
video_clips=clips,
audio_tracks=audios,
subtitles=subtitles,
bgm="bgm/light.mp3", # 可选:垫一段背景音乐
)
return final # 输出 mp4
五、串起来:一句话到一条成片
python
def make_short_video(topic):
scenes = script_agent(topic) # ① 脚本
clips, audios, subs = [], [], []
for sc in scenes:
clips.append(visual_agent(sc)) # ②③ 画面+视频
a, s = audio_agent(sc) # ④ 配音+字幕
audios.append(a); subs.append(s)
return compose_agent(clips, audios, subs) # ⑤ 合成
文本、图像、视频、语音——四类模型全走同一个 4sapi 网关,一个 Key。这就是这条流水线最爽的地方:业务代码里你几乎感觉不到背后接了四类完全不同的模型。
六、前端:输入选题,看着它一段段长出来
jsx
function ShortVideoMaker() {
const [topic, setTopic] = useState("");
const [scenes, setScenes] = useState([]); // 每段的实时状态
async function run() {
const res = await fetch("/api/video", {
method: "POST", body: JSON.stringify({ topic }),
});
// SSE 回报每段进度:脚本✓ → 画面✓ → 视频✓ → 配音✓ → 合成✓
}
return (
<div>
<input value={topic} onChange={e => setTopic(e.target.value)}
placeholder="输入选题,比如:3 个被低估的通勤好物" />
<button onClick={run}>一键生成短视频</button>
<SceneTimeline scenes={scenes} /> {/* 分段进度可视化 */}
</div>
);
}
安全提醒:图生视频是整条线里最贵最慢的一环,一条成片要跑好几段视频生成。上线前务必加用户鉴权 + 单次时长上限 + 配额限制。另外,自动生成的内容要过合规审核,口播文案别让模型编造虚假信息或夸大宣传。
七、几条实战经验
- 脚本必须输出结构化 JSON。口播、画面、运镜一段段分好字段,后面四个环节才能无缝对接,自然语言脚本解析全是坑。
- 先出图、让用户筛一轮,再做视频。图生视频又贵又慢,关键帧先全生成出来让人挑,满意了再统一进视频环节,省下大把无效算力。
- 画风后缀全局统一。和批量出图一个道理,统一后缀让整条片子的镜头看起来是一套的,不至于东一榔头西一棒。
- 文案直接当字幕。既然口播文案是自己生成的,直接拿来做字幕,省掉一道语音转写,还不会有识别错误。
- 每个环节包重试 + 超时。视频生成偶发超时很常见,给每段调用裹一层重试,别一段失败整条片子崩。
写在最后
搭一条 AI 短视频流水线,难的不是单独调通哪个模型,而是把文本、图像、视频、语音四类能力,编排成一条能一键跑完的稳定链路。
脚本结构化、画面统一风、视频按段跑、声字一起合——四类模型各管一段,一个网关统一接入,剩下的就是把流程串顺。
中途接入 4sapi,把"对接四家不同模型厂商"这件最脏的活,收敛成了一个 base_url、一个 Key。这条线模型种类最多,也最能体现统一网关的价值:复杂度全挡在网关后面,流水线只管把活按顺序传下去。
本文代码为说明思路的简化示意,具体模型名称、接口字段请以 4sapi.com 官方文档为准。涉及付费接口,请做好用量控制与内容合规。