不知道大家有没有发现,最近有一个叫Manim的动画库特别火?它是3Blue1Brown(那个用惊艳动画讲数学的YouTube频道)的创始人GrantSanderson用Python写的数学动画引擎。短短几年,它已经成为技术圈和数学教育领域的"网红工具"——用代码就能做出那
不知道大家有没有发现,最近有一个叫 Manim 的动画库特别火?
它是 3Blue1Brown(那个用惊艳动画讲数学的 YouTube 频道)的创始人 Grant Sanderson 用 Python 写的数学动画引擎。
短短几年,它已经成为技术圈和数学教育领域的"网红工具"——用代码就能做出那种丝滑流畅、知识点一目了然的教学动画。
但问题也随之而来:Manim 虽然强大,完整的视频制作流程却相当繁琐。
从写场景脚本 → 渲染视频 → 配音旁白 → 合成音频 → 添加字幕 → 生成封面... 这一套下来,光是命令行就要敲好几遍,更别说还要调参、调节奏。
那有没有办法,让 AI 一次性把这些流程"封装"起来?你只需要告诉它"我要做一个讲解二次函数顶点式的视频",它就能自动把脚本、分镜、代码、渲染命令、旁白合成全给你搞定?
当然可以。这就是 Skill 的用武之地。
简单说,Skill 是 AI 能力的插件化封装。
想象一下:你的 AI 助手本身是一个通用大脑,但它可以通过加载不同的 Skill 来获得特定领域的"专业技能"。比如:
每个 Skill 都是一个独立的模块,包含:
这样一来,AI 就不再是"一个只会聊天的模型",而是一个可以不断扩展能力的智能代理。
接下来,我们以 manim-video-teacher 这个 Skill 为例,手把手教你如何从零构建一个视频制作领域的专属 Skill。
在动手写代码之前,先想清楚这个 Skill 要解决什么问题。
对于 manim-video-teacher,我们的目标很明确:
帮助用户用中文提示词,自动生成完整的 Manim 教学视频。
具体来说,用户只需要给出一个需求(比如"做一个 60 秒讲解二次函数顶点式的视频"),Skill 就要能产出:
经验之谈:Skill 的定位要足够聚焦,不要试图做一个"万能工具"。专注一个场景,把它做到极致,比做一个大而全的东西更实用。
一个规范的 Skill 通常长这样:
manim-video-teacher/
├── SKILL.md # 核心描述文件(AI 用的说明书)
├── README.md # 用户使用文档
└── scripts/ # 工具脚本集合
├── tts_generate.py # 旁白生成
├── concat_audio.py # 音频拼接
├── mux_av.py # 音视频合成
├── make_cover.py # 封面生成
└── pipeline.py # 一键执行全部流程
为什么这样设计?
SKILL.md 是给 AI 看的,描述这个 Skill 的能力边界和使用方式scripts/ 目录放可执行脚本,AI 可以调用它们完成具体任务这是整个 Skill 最关键的文件。它决定了 AI 能否正确理解并使用这个 Skill。
一个好的 SKILL.md 应该包含以下几部分:
---
name: manim-video-teacher
description: 专注于使用 Manim 生成动画教学视频的完整流程与专业建议...
---
用一两句话说明这个 Skill 能帮用户达成什么。
## 快速目标
用用户的中文提示语,产出可执行的 Manim 方案:脚本/分镜/代码/渲染命令...
告诉 AI 该按什么步骤执行任务:
## 工作流程
1. 把用户提示语改写成教学脚本(结构化段落)
2. 为每段脚本给出分镜(画面目标、关键动画、旁白要点)
3. 设计视觉语言(颜色/字号/对齐/高亮规则)
4. 生成 Manim 代码(Scene 结构清晰、变量命名明确)
5. 给出渲染命令与参数建议
6. 用脚本生成旁白音频,并同步产出字幕
7. 用脚本合成视频与音频,必要时嵌入字幕
8. 用脚本生成单独封面图
9. 简要解释关键教学设计选择
为了让 AI 输出质量稳定的内容,给出模板是很好的做法:
## 教学脚本模板
用短句、可口播的节奏:
1. 引入:问题/现象/动机(1-2 句)
2. 定义:核心概念(1-3 句)
3. 机制:关键步骤或推导(分 2-5 步)
4. 示例:用 1 个具体例子验证
5. 总结:一句话回扣重点
如果涉及编程,给出代码风格规范:
## Manim 代码约定
- 使用 `Scene` 或 `MovingCameraScene`,保持单场景可复用
- 把复杂动画拆成小函数(如 `show_definition()`)
- 用 `VGroup` 组织元素,统一对齐与间距
- 用 `FadeIn/FadeOut/Transform` 传达逻辑过渡
告诉 AI 如何调用封装好的脚本:
可用脚本:
- `scripts/tts_generate.py`:把旁白文本转为音频,可用 `--subs-output subs.srt` 输出字幕
- `scripts/concat_audio.py`:合并多段旁白
- `scripts/mux_av.py`:合成视频与音频,可用 `--subs subs.srt` 嵌入字幕
- `scripts/make_cover.py`:生成 16:9 封面图
- `scripts/pipeline.py`:一键执行语音、合成与封面生成
示例:
```bash
python scripts/pipeline.py \
--video manim.mp4 \
--tts-file narration.txt \
--subs-output subs.srt \
--cover-title "二次函数顶点式" \
--cover-subtitle "60 秒掌握" \
--output output.mp4
核心原则:SKILL.md 写得越详细、越具体,AI 的输出就越符合预期。它本质上是给 AI 的一份"专业培训手册"。
Skill 的价值最终要靠脚本落地。对于视频制作场景,我们需要以下几个核心脚本:
用 edge-tts 把文字转成语音,同时生成 SRT 字幕:
import argparse
import subprocess
from pathlib import Path
def generate_tts(text_file: Path, output_audio: Path, subs_output: Path = None):
"""调用 edge-tts 生成旁白和字幕"""
# 读取文本
text = text_file.read_text(encoding="utf-8")
# 调用 TTS(示例用 edge-tts)
cmd = [
"edge-tts",
"--voice", "zh-CN-XiaoxiaoNeural",
"--text", text,
"--write-media", str(output_audio)
]
if subs_output:
cmd.extend(["--write-subtitles", str(subs_output)])
subprocess.run(cmd, check=True)
用 ffmpeg 把视频、音频、字幕合并成最终成品:
def mux_video(video_path, audio_path, output_path, subs_path=None):
"""合成视频与音频,可选嵌入字幕"""
cmd = ["ffmpeg", "-y", "-i", str(video_path), "-i", str(audio_path)]
if subs_path:
cmd.extend([
"-i", str(subs_path),
"-map", "0:v",
"-map", "1:a",
"-map", "2:s",
"-c:v", "copy",
"-c:a", "aac",
"-c:s", "mov_text"
])
else:
cmd.extend(["-c:v", "copy", "-c:a", "aac"])
cmd.extend([str(output_path)])
subprocess.run(cmd, check=True)
用 Pillow 生成符合 16:9 比例的封面图:
from PIL import Image, ImageDraw, ImageFont
def create_cover(title: str, subtitle: str, output_path: Path):
"""生成 1920x1080 的封面图"""
img = Image.new("RGB", (1920, 1080), color="#1a1a2e")
draw = ImageDraw.Draw(img)
# 绘制标题和副标题
# ...(具体实现省略)
img.save(output_path)
这是最重要的脚本——它把上面所有步骤串联起来,用户只需要一个命令就能跑完整个流程:
def run_pipeline(video, tts_file, cover_title, cover_subtitle, output):
"""一键执行:TTS → 合成 → 封面"""
# Step 1: 生成旁白和字幕
audio_path = Path("output/audio.mp3")
subs_path = Path("output/subs.srt")
generate_tts(Path(tts_file), audio_path, subs_path)
# Step 2: 生成封面
cover_path = Path("output/cover.png")
create_cover(cover_title, cover_subtitle, cover_path)
# Step 3: 合成最终视频
mux_video(Path(video), audio_path, Path(output), subs_path)
封装技巧:每个脚本只做一件事,但提供灵活的参数。这样既可以单独使用,也可以被 pipeline 统一调度。
为了让用户能方便地安装你的 Skill,写一个自动化安装脚本是标准做法:
#!/usr/bin/env bash
# scripts/install_skill.sh
# 自动检测目标目录(支持 CODEX_HOME、环境变量、本地目录等)
# 复制 Skill 到目标位置
# 打印安装成功信息
# 用法示例:
# ./scripts/install_skill.sh --dest ~/codex/skills
# ./scripts/install_skill.sh --list # 预览安装位置
这个脚本会:
CODEX_HOME,fallback 到 ~/.codex/skills)--force 强制覆盖安装--list 预览安装位置(安装前先确认)README.md 是给人类用户看的,要做到:
# Manim Video Teacher Skill
一个帮你用 Manim 生成教学视频的 Skill。
## 快速开始
1. 安装依赖:`pip install -r requirements.txt`
2. 运行 pipeline:
```bash
python manim-video-teacher/scripts/pipeline.py \
--video media/videos/your_scene/1080p60/YourScene.mp4 \
--tts-file examples/narration.txt \
--cover-title "二次函数顶点式" \
--cover-subtitle "60 秒掌握" \
--output output.mp4
当你完成了这个 Skill 之后,用户只需要这样一段提示词:
"用 Manim 做一个 60 秒讲解二次函数顶点式的视频,画面简洁,讲解节奏适中。"
AI 就能自动:
整个过程,用户不需要懂 Manim、不需要会 ffmpeg、不需要写任何代码——这就是 Skill 的魔力。
| 步骤 | 关键动作 |
|---|---|
| 1. 定位 | 聚焦一个具体场景,不要贪大求全 |
| 2. 结构 | 规范目录结构(SKILL.md + scripts/) |
| 3. 描述 | SKILL.md 写得足够详细、具体 |
| 4. 脚本 | 每个脚本做一件事,但可组合使用 |
| 5. 安装 | 提供自动化安装脚本 |
| 6. 文档 | README.md 让用户能快速上手 |
Manim 让我们看到了"用代码做动画"的无限可能。而 Skill 机制,则把这种可能性扩展到了用自然语言指挥 AI 完成一整套复杂流程。
如果你也有某个领域的专业技能想要"AI 化",不妨试试把它封装成一个 Skill。
也许下一个爆款,就是你做的。
Happy Coding! 🎬
最后,欢迎大佬一起来优化:github.com/lispking/video-skills
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!