创建Kubernetes讲解视频
输出是一个MP4讲座视频:图形化、动画化、几乎没有文字,无字幕。
参数 voiceover=on|off(默认 on)。 on 使用本地Kokoro TTS语音进行旁白;off 生成无声视频,绝不安装或加载Kokoro。
参数 setup: 仅安装,不生成视频。执行下面的“检查环境”步骤,然后停止。
两个文件夹。 SKILL 是技能的基础目录(存放此文件的文件夹)。它包含 .venv/、icons/、references/ 和 scripts/。OUT 是 <用户工作目录>/<主题>,每个视频创建一次。场景文件、media/ 和最终的 MP4 都位于 OUT 中,绝不在 SKILL 中(更新或删除技能会删除 SKILL)。使用绝对路径;不要依赖当前目录。
技能附带内容
icons/:官方Kubernetes社区图标(带标签集合,CC-BY-4.0)。仅使用这些图标表示Kubernetes组件和资源。 切勿重新绘制、改色为其他内容,或用通用形状替换此处有图标的组件。对于没有图标的概念(CSR、证书、数据包、iptables规则),使用参考中的简单形状,如Doc和Packet。references/node_join.py:一个完整、经过批准的示例(kubeadm节点加入)。模仿其风格、调色板和辅助类。references/kokoro_service.py:连接到manim-voiceover的Kokoro-82M。references/kit.py:共享调色板、辅助工具以及Explainer基场景和voiced(Scene)。新场景从此导入。scripts/setup.sh [voiceover=on|off] [--yes]:报告缺少的内容并打印安装计划(macOS、Arch、Debian/Ubuntu);仅当带有--yes时才安装。
| 文件 | 组件 | 文件 | 组件 | 文件 | 组件 |
|---|---|---|---|---|---|
| api | kube-apiserver | pod | Pod | cm | ConfigMap |
| etcd | etcd | rs | ReplicaSet | secret | Secret |
| sched | kube-scheduler | deploy | Deployment | pv | PersistentVolume |
| c-m | kube-controller-manager | sts | StatefulSet | pvc | PersistentVolumeClaim |
| c-c-m | cloud-controller-manager | ds | DaemonSet | sc | StorageClass |
| kubelet | kubelet | job | Job | ns | Namespace |
| k-proxy | kube-proxy | cronjob | CronJob | sa | ServiceAccount |
| control-plane | 控制平面节点 | svc | Service | role / c-role | Role / ClusterRole |
| node | 工作节点 | ep | Endpoints | rb / crb | RoleBinding / ClusterRoleBinding |
| hpa | HorizontalPodAutoscaler | ing | Ingress | quota | ResourceQuota |
| crd | CustomResourceDefinition | netpol | NetworkPolicy | limits | LimitRange |
Manim会丢弃这些SVG中嵌入的文本,并且api、c-m、sched、kubelet、k-proxy共享相同的齿轮图形。始终使用 Icon(name, label) 辅助程序为图标添加标签。
工作流程
1. 检查环境
运行 bash SKILL/scripts/setup.sh voiceover=<on|off>。如果它输出 Ready.,则继续。否则它会输出缺少的内容和计划(首次在此机器上运行):向用户展示该计划,并在安装前请求确认。
- 确认后,使用
--yes再次运行。它很慢(torch、系统包),因此在后台或使用长超时运行。 - 如果计划中包含
sudo行,而你无法输入密码:将命令提供给用户自行运行(! bash SKILL/scripts/setup.sh voiceover=<on|off> --yes)。 - Kokoro是免费的、Apache-2.0许可(适用于付费课程)、离线且接近商业品质;如果用户不想要,建议使用
voiceover=off。
2. 商定故事板
如果未给出主题,请询问主题。然后在聊天中提出一个故事板并等待批准,因为渲染需要几分钟:
- 6–12个节拍,每个节拍包含:1–3个字的步骤标签、屏幕上移动的内容、一句旁白。
- 通过运动讲述故事:盒子中的图标、弧线上的数据包、状态的颜色变化。屏幕上只有短标签。
- 事实必须符合当前Kubernetes版本。如果不确定某个细节,请如实说明,不要猜测。
3. 编写场景
模仿 references/node_join.py:
- 一个
NARRATION字典(节拍 → 句子)作为类属性,每个节拍对应一个方法;Explainer.construct在with self.voice(line)内部循环遍历它们。 - 编写
OUT/<主题>.py,包含from references.kit import *,继承Explainer,并在底部添加<名称>Voiced = voiced(<名称>)。节拍函数为def beat(self, i)。无声的<名称>和有声的<名称>Voiced来自同一代码。 - 切勿将场景文件命名为标准库模块(
operator.py会破坏Python的导入)。 - 重用调色板(深色
#0b1220、K8s蓝色#326ce5、金色令牌、蓝绿色网络、琥珀色NotReady、绿色Ready)以及辅助程序Icon、Packet、Doc、Step、Pill、send。 - 类应保持小型,代码尽量精简。
- 术语的拼写方式应与旁白中的发音一致:kubeadm → "kube admin"、etcd → "et-cee-dee"、kubectl → "kube control"。
4. 预览,然后渲染
从 OUT 目录运行manim:PYTHONPATH=SKILL SKILL/.venv/bin/manim --media_dir OUT/media ...。
- 预览:
... -ql <主题>.py <名称>,然后使用ffmpeg提取约8帧生成一张联系表,查看一次。修复重叠、标签裁剪以及暗淡或不可读的文字。 - 最终渲染:
voiceover=off时运行... -qh <主题>.py <名称>,voiceover=on时运行<名称>Voiced。将OUT/media/videos/<主题>/1080p60/<名称>.mp4复制到OUT/<主题>.mp4。 - 当
voiceover=on时,确认MP4包含音频流(使用ffprobe)。 - 完成后打开MP4(macOS上使用
open;Linux上使用xdg-open,或者如果没有显示器,则只打印路径)。
报告MP4的绝对路径、时长、需要留意的地方(非常见术语的发音),并提醒用户图标需要注明“Kubernetes社区图标,CC BY 4.0”(结尾画面已显示)。语音选项:af_heart(默认)、am_michael、am_fenrir;通过 voiced(<名称>, voice="am_michael") 传入一个。