+
60
-

python如何调用openai的api实现知识讲解类动画讲解视频的合成?

python如何调用openai的api实现知识讲解类动画讲解视频的合成?

通过ai返回多个镜头的json元素(文本,旁白,时间,svg),最后python合成一个视频输出?

网友回复

+
24
-

用 OpenAI 生成分镜脚本与配音,再用 Manim 的 LaggedStart 批量、有节奏地呈现字幕/公式,实现讲解视频的自动生成。

流程概览

生成脚本与分镜:OpenAI 产出 JSON(每个场景包含标题、要点、公式、朗读文本、动画节奏参数)

文本转语音:OpenAI TTS(gpt-4o-mini-tts)生成每个场景的配音

Manim 渲染:用 LaggedStart 让每个场景的元素依次出现,并与配音对齐

合成导出:直接在 Manim 中 add_sound 对上时间轴,或用 moviepy 后期合成

依赖安装

Manim(建议 conda):conda install -c conda-forge manim ffmpeg

PIP 依赖:pip install openai pydub

字体/LaTeX:中文用 Noto Sans CJK/思源黑体;若用 MathTex 渲染公式,需要系统装 TeX(如 TeX Live)

一、脚本与配音生成(ai_gen.py)

作用:给一个主题,得到结构化分镜 JSON,并为每个场景生成独立配音音频,自动记录时长用于对齐

运行前:导出 OPENAI_API_KEY 环境变量

# ai_gen.py
import os, json, sys
from pathlib import Path
from pydub import AudioSegment
from openai import OpenAI

client = OpenAI()
OUT_DIR = Path("ai_out")
AUDIO_DIR = OUT_DIR / "audio"
OUT_DIR.mkdir(exist_ok=True, parents=True)
AUDIO_DIR.mkdir(exist_ok=True, parents=True)

SYSTEM = "你是一个面向科普视频的分镜脚本生成器,输出严格的JSON。"

SCHEMA_HINT = """
请仅输出 JSON(不要加解释、不要代码块)。结构:
{
  "title": "视频总标题",
  "scenes": [
    {
      "title": "场景标题",
      "lag_ratio": 0.15,
      "anim_time": 3.0,
      "elements": [
        {"type": "text", "content": "要点1", "pos": "left"},
        {"type": "formula", "content": "E=mc^2"}
      ],
      "voiceover": "本场景的配音全文,口语化,10-20秒。"
    }
  ]
}
要求:
- 场景数 2-4 个,每场景 2-5 个 elements,适合 30-90 秒短视频。
- 文字简洁、直观;尽量避免生僻字。
- formula 用 LaTeX 可选(如 \\frac, ^2 等),不含中文。
"""

def gen_script(topic: str):
    prompt = f"主题:{topic}\n{SCHEMA_HINT}"
    resp = client.chat.completions.create(
        model="gpt-4o-mini",
        temperature=0.7,
        messages=[
            {"role":"system","content": SYSTEM},
            {"role":"user","content": prompt}
        ],
        response_format={"type": "json_object"}
    )
    data = resp.choices[0].message.content
    return json.loads(data)

def tts_to_file(text: str, out_path: Path, voice="alloy"):
    out_path.parent.mkdir(parents=True, exist_ok=True)
    # 使用 OpenAI TTS(gpt-4o-mini-tts)
    with client.audio.speech.with_streaming_response.create(
        model="gpt-4o-mini-tts",
        voice=voice,
        input=text
    ) as response:
        response.stream_to_file(out_path)

def main():
    topic = "为什么天空是蓝色的"
    if len(sys.argv) > 1:
        topic = " ".join(sys.argv[1:])
    script = gen_script(topic)

    # 为每个场景生成配音并记录时长
    for i, sc in enumerate(script["scenes"], s...

点击查看剩余70%

我知道答案,我要回答