技术教程 · 阅读约 9 分钟

用 Codex 搭一条视频制作流水线:从脚本到剪辑指令,30 行 Python 全自动

用 Codex 搭一条视频制作流水线:从脚本到剪辑指令,30 行 Python 全自动

很多人用 Codex 生成代码,但很少人想到用它来指挥视频制作流程。

上周看到 V2EX 上有人问 Codex 视频工厂的流程和插件,回复五花八门,但大多停留在"用 CapCut + GPT 改改文案"这个层面。今天直接给一套可以跑起来的方案:用 OpenAI 兼容接口,让模型帮你把一个主题拆解成分镜脚本 → 旁白文案 → CapCut 草稿 JSON,整条链路自动化。


真正的痛点在哪里

手动做一条 5 分钟的科普视频,光脚本来回改就要 2 小时。分镜、旁白、字幕时间轴,每一步都是重复的脑力消耗。

Codex 本质上是一个很强的结构化文本生成器,它不只能写代码,只要你把"视频制作流程"描述成结构化任务,它就能帮你输出机器可读的制作指令。


整体架构


主题关键词

    ↓

[Step 1] 生成分镜脚本(JSON)

    ↓

[Step 2] 为每个分镜生成旁白文案

    ↓

[Step 3] 输出 CapCut 草稿结构 / 剪映草稿 JSON

    ↓

[Step 4] 可选:调用 TTS 生成配音

我们用 Python + OpenAI SDK 实现前三步,代码加注释不超过 120 行,核心逻辑 30 行。


完整代码


import json

import os

from openai import OpenAI



# 改一行 baseURL,国内直连,无需梯子

client = OpenAI(

    api_key=os.environ.get("API_KEY", "your-api-key-here"),

    base_url="https://api2everything.xyz/v1"

)



MODEL = "gpt-4o"  # 也可以换成 claude-3-5-sonnet、deepseek-r1 等 300+ 模型





def generate_storyboard(topic: str, num_shots: int = 6) -> list[dict]:

    """Step 1: 生成分镜脚本"""

    prompt = f"""

你是一名专业视频导演。请为主题「{topic}」生成 {num_shots} 个分镜。

每个分镜用 JSON 对象表示,包含以下字段:

- shot_id: 序号(从 1 开始)

- duration_sec: 建议时长(秒)

- visual: 画面描述(20字以内)

- camera: 运镜方式(如:固定、推进、俯拍)

- b_roll_keyword: 可用于搜索 B-Roll 素材的关键词



只输出 JSON 数组,不要有任何多余文字。

"""

    response = client.chat.completions.create(

        model=MODEL,

        messages=[{"role": "user", "content": prompt}],

        temperature=0.7,

        response_format={"type": "json_object"}  # 强制 JSON 输出

    )

    # 模型返回的是 {"shots": [...]},取 shots 字段

    raw = json.loads(response.choices[0].message.content)

    return raw.get("shots", raw)  # 兼容不同返回结构





def generate_voiceover(shots: list[dict]) -> list[dict]:

    """Step 2: 为每个分镜生成旁白"""

    shot_list = "\n".join(

        f"分镜{s['shot_id']}({s['duration_sec']}秒):{s['visual']}"

        for s in shots

    )

    prompt = f"""

以下是视频分镜列表:

{shot_list}



请为每个分镜写一段口播旁白,要求:

1. 语气自然,像真人说话

2. 字数严格控制在该分镜时长 × 4 字以内(4字/秒语速)

3. 返回 JSON 数组,每项包含 shot_id 和 voiceover 字段



只输出 JSON 数组。

"""

    response = client.chat.completions.create(

        model=MODEL,

        messages=[{"role": "user", "content": prompt}],

        temperature=0.6,

        response_format={"type": "json_object"}

    )

    raw = json.loads(response.choices[0].message.content)

    return raw.get("voiceovers", raw)





def build_capcut_draft(shots: list[dict], voiceovers: list[dict]) -> dict:

    """Step 3: 拼装成类 CapCut 草稿结构"""

    # 建立 shot_id -> voiceover 映射

    vo_map = {v["shot_id"]: v["voiceover"] for v in voiceovers}



    tracks = []

    cursor = 0  # 时间游标,单位:毫秒



    for shot in shots:

        duration_ms = shot["duration_sec"] * 1000

        tracks.append({

            "type": "video",

            "shot_id": shot["shot_id"],

            "start_ms": cursor,

            "end_ms": cursor + duration_ms,

            "b_roll_keyword": shot.get("b_roll_keyword", ""),

            "camera_note": shot.get("camera", "固定"),

            "subtitle": vo_map.get(shot["shot_id"], ""),

        })

        cursor += duration_ms



    return {

        "draft_name": "AI生成草稿",

        "total_duration_ms": cursor,

        "tracks": tracks

    }





def run_pipeline(topic: str):

    print(f"\n🎬 开始生成:{topic}\n")



    print("📋 Step 1: 生成分镜脚本...")

    shots = generate_storyboard(topic, num_shots=6)

    print(f"   生成了 {len(shots)} 个分镜")



    print("🎙 Step 2: 生成旁白文案...")

    voiceovers = generate_voiceover(shots)



    print("🗂 Step 3: 构建草稿 JSON...")

    draft = build_capcut_draft(shots, voiceovers)



    output_path = f"draft_{topic[:10].replace(' ', '_')}.json"

    with open(output_path, "w", encoding="utf-8") as f:

        json.dump(draft, f, ensure_ascii=False, indent=2)



    print(f"\n✅ 完成!草稿已保存到:{output_path}")

    print(f"   总时长:{draft['total_duration_ms'] / 1000:.1f} 秒")

    return draft





if __name__ == "__main__":

    run_pipeline("量子计算入门:叠加态是什么")


跑起来后输出长这样


{

  "draft_name": "AI生成草稿",

  "total_duration_ms": 42000,

  "tracks": [

    {

      "type": "video",

      "shot_id": 1,

      "start_ms": 0,

      "end_ms": 7000,

      "b_roll_keyword": "量子计算机芯片特写",

      "camera_note": "推进",

      "subtitle": "你有没有想过,一台计算机可以同时是开机和关机的状态?"

    },

    ...

  ]

}

这个 JSON 可以直接用脚本导入剪映草稿(剪映草稿格式是公开的),或者作为 After Effects / Premiere 自动化脚本的输入。


几个实用的扩展方向

换模型降成本:脚本生成这类任务对推理能力要求不高,把 MODEL 换成 deepseek-v3 或 gemini-2.0-flash,效果接近,token 成本能再降一半。

加 TTS 这一步:在 Step 3 之后调用 OpenAI TTS 或 Edge TTS,把旁白文案转成音频文件,连配音都省了。

批量生产:把 run_pipeline 包一个循环,从 CSV 读主题列表,一晚上跑几十条视频脚本不是梦。


关于 API 成本

这套流程每条视频大概消耗 2000-3000 个 token,用 gpt-4o 官方价格大约是 ¥0.15 左右。如果你量大,或者想用 Claude / Gemini 做对比测试,每次都去官网充值并不现实,而且国内访问官方 API 本身就是个障碍。

我现在用的是无量Api,国内直连,支持 OpenAI / Claude / Gemini / DeepSeek 等 300+ 模型,改一行 base_url 就能切换,价格比官方便宜约 65%,SVIP 还有 7.7 折。注册就送 ¥1 余额,余额永久不过期,拿来测试这套流程完全够用。


你在用 Codex / GPT 做视频自动化有什么卡住的地方,欢迎评论区说,看到都回。觉得有用的话点个赞,后续可以继续写剪映草稿导入、TTS 接入那几步的细节。