技术教程 · 阅读约 8 分钟

用 LLM 自动生成 STEM 讲座视频?我用 30 行 Python 复刻了 Academa 的核心逻辑

用 LLM 自动生成 STEM 讲座视频?我用 30 行 Python 复刻了 Academa 的核心逻辑


最近 HN 首页出现了一个项目叫 Academa,核心功能是:给定一个 STEM 主题,自动生成长达数十分钟的讲座视频,包括脚本、语音、字幕。

评论区炸了。有人说"这不就是 AI 版 MIT OpenCourseWare 吗",有人说"质量根本不行"。

但我注意到一个更有趣的问题:它的核心 pipeline 并不复杂。本质上是:

主题 → 大纲生成 → 分段脚本 → TTS → 视频合成

前两步完全可以用 API 搞定,而且成本极低。今天我们就把这个 pipeline 拆开,用 Python 实现一个可运行的"AI 讲座脚本生成器"。


核心 Pipeline 拆解


输入主题

  ↓

[Step 1] 生成课程大纲(章节 + 要点)

  ↓

[Step 2] 逐章生成讲师口播脚本(自然语言,带过渡句)

  ↓

[Step 3] 输出结构化 Markdown,可直接送 TTS

Step 1 和 Step 2 都是 LLM 任务,区别在于 prompt 设计。


完整代码(可直接运行)


import os

import json

from openai import OpenAI



client = OpenAI(

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

    base_url="https://api2everything.xyz/v1",  # 国内直连,无需代理

)



OUTLINE_PROMPT = """你是一位经验丰富的大学教授。

请为以下主题生成一份结构清晰的讲座大纲,包含 4-6 个章节,每章 3-4 个要点。

以 JSON 格式返回,结构如下:

{{"chapters": [{{"title": "章节标题", "points": ["要点1", "要点2"]}}]}}



主题:{topic}"""



SCRIPT_PROMPT = """你是一位大学讲师,正在录制在线课程。

请为以下章节生成自然流畅的口播脚本(约 300 字),要求:

- 用第一人称,像真人讲课

- 包含过渡句和举例

- 避免过于书面化



章节标题:{title}

核心要点:{points}"""





def generate_outline(topic: str) -> dict:

    resp = client.chat.completions.create(

        model="gpt-4o-mini",  # 也可换 deepseek-chat,更便宜

        messages=[{"role": "user", "content": OUTLINE_PROMPT.format(topic=topic)}],

        response_format={"type": "json_object"},

        temperature=0.7,

    )

    return json.loads(resp.choices[0].message.content)





def generate_chapter_script(title: str, points: list[str]) -> str:

    points_text = "\n".join(f"- {p}" for p in points)

    resp = client.chat.completions.create(

        model="gpt-4o-mini",

        messages=[

            {

                "role": "user",

                "content": SCRIPT_PROMPT.format(title=title, points=points_text),

            }

        ],

        temperature=0.8,

    )

    return resp.choices[0].message.content





def generate_lecture(topic: str, output_file: str = "lecture.md"):

    print(f"正在为主题「{topic}」生成讲座脚本...\n")



    print("Step 1: 生成大纲...")

    outline = generate_outline(topic)

    chapters = outline.get("chapters", [])

    print(f"  → 共 {len(chapters)} 章\n")



    result = [f"# {topic}\n\n---\n"]



    for i, chapter in enumerate(chapters, 1):

        title = chapter["title"]

        points = chapter["points"]

        print(f"Step 2.{i}: 生成「{title}」脚本...")



        script = generate_chapter_script(title, points)

        result.append(f"## 第{i}章:{title}\n\n{script}\n\n---\n")



    full_text = "\n".join(result)

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

        f.write(full_text)



    print(f"\n完成!脚本已保存至 {output_file}")

    print(f"总字数约:{len(full_text)} 字")

    return full_text





if __name__ == "__main__":

    generate_lecture("量子纠缠与量子计算基础")


运行效果

生成一个 4 章的量子计算讲座,大概长这样:


正在为主题「量子纠缠与量子计算基础」生成讲座脚本...



Step 1: 生成大纲...

  → 共 5 章



Step 2.1: 生成「什么是量子比特」脚本...

Step 2.2: 生成「叠加态与干涉」脚本...

...



完成!脚本已保存至 lecture.md

总字数约:2847 字

整个过程大概 15-20 秒,费用不到 ¥0.05(用 gpt-4o-mini)。


几个值得注意的细节

1. response_format={"type": "json_object"} 是关键

大纲那步必须用 JSON mode,否则模型会在 JSON 外面包一堆废话,解析就炸了。这是 OpenAI API 里一个容易踩的坑。

2. 模型选择影响质量和成本

| 模型 | 质量 | 每次调用成本(约) |

|------|------|------------------|

| gpt-4o | 最高 | ~¥0.15 |

| gpt-4o-mini | 够用 | ~¥0.01 |

| deepseek-chat | 中文极好 | ~¥0.005 |

中文 STEM 内容推荐 deepseek-chat,性价比最高,只需把 model 参数改一下即可,base_url 不变。

3. 扩展到视频只差 TTS 这一步

脚本生成后,可以接:

  • openai.audio.speech.create() → 生成 MP3
  • ffmpeg + 静态 PPT 截图 → 合成视频

这就是 Academa 做的事,核心并不神秘。


关于 API 成本

如果你在国内用 OpenAI 官方 API,除了需要代理,价格也是按美元结算。

我自己用的是无量Api(api2everything.xyz),支持 OpenAI / Claude / Gemini / DeepSeek 等 300+ 模型,国内直连不需要代理,价格比官方便宜约 65%。代码里的 base_url 换成他们的地址,其他一行不改,注册还送 ¥1 体验额度,余额永久有效。

对于这种批量生成脚本的场景,成本差异很明显——同样的任务,用无量跑下来大概是官方的三分之一。


下一步可以做什么

  • 加一个 CLI 参数,支持从命令行传入主题
  • 接入 TTS,直接输出 MP3 音频
  • 用 asyncio 并行生成多章节,速度提升 3-4 倍
  • 加入"苏格拉底式提问"prompt,让脚本更有互动感

如果你跑通了或者遇到问题,欢迎在评论区留言。对 TTS 接入那部分感兴趣的,点个赞,下篇写音频合成。

无量Api 注册链接(国内直连,送¥1体验):

  • Zhihu 读者:https://api2everything.xyz/?utm_source=zhihu&utm_medium=article&utm_campaign=daily&aff=wqUb
  • V2EX 读者:https://api2everything.xyz/?utm_source=v2ex&utm_medium=article&utm_campaign=daily&aff=wqUb