使用 Manim Community 和 manim-voiceover 创建带同步语音旁白和字幕的数学动画。用于用户想要创建数学教学视频时。
Manim动画: 动画+ Voiceover + 字幕生成器. 授权: ericksun( QQ).是一项面向实际任务的技能,主要用于Overview. 这一技能使用 Manim 社区生成数学/教育动画, 并带有 manim-voiceover。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。
执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
作者: ericksun(孙自翔)
本技能基于 Manim Community 构建,用于生成数学/教育类动画,并通过集成 manim-voiceover 插件实现 TTS 语音旁白与同步字幕。所有处理均在本地完成,无需调用付费 API。
核心能力:
TTS 引擎(推荐 gTTS):
首次使用前,请运行环境检查脚本,验证所有依赖是否就绪:
python3 {SKILL_DIR}/scripts/check_environment.py
该脚本将检查以下项目:
manim 命令)pip install manimlibx264 编码器;字幕烧录需 libassbrew install ffmpeg(默认包含 x264 和 libass)conda install x264 -c conda-forge(⚠️ Conda 版本的 ffmpeg 默认不包含 libx264)sudo apt install ffmpeg libx264-dev libass-dev# 核心依赖 pip install manim # 语音旁白 + TTS pip install "manim-voiceover[gtts]"
pip install "manim-voiceover[pyttsx3]")pip install manim "manim-voiceover[gtts]" # macOS(Homebrew)——推荐,已含 libx264 + libass brew install ffmpeg # macOS(Conda)——需额外安装 x264,否则 Manim 渲染将因 UnknownCodecError: libx264 失败 conda install x264 -c conda-forge # 验证 ffmpeg 是否支持 libx264 和 libass ffmpeg -codecs 2>&1 | grep libx264 # 应显示:encoders: libx264 ffmpeg -filters 2>&1 | grep subtitles # 应显示:subtitles filter
用户描述需求后,可通过流水线脚本一键执行全流程:
python3 {SKILL_DIR}/scripts/run_pipeline.py
--scene_file
--scene_name
--quality high
--burn_subtitles
常用参数说明:
| 参数 | 默认值 | 说明 |
|---|---|---|
--scene_file |
必需 | Manim 场景 Python 文件路径 |
--scene_name |
必需 | 场景类名 |
--quality |
high |
渲染质量:low/medium/high/production |
--burn_subtitles |
False | 是否使用 ffmpeg 烧录 SRT 字幕 |
--speed |
1.35 |
播放速度倍率(例如 1.35 表示 1.35 倍速;设为 1.0 即禁用加速) |
--preview |
False | 渲染完成后是否自动打开预览 |
--output_dir |
./output |
输出目录 |
根据用户描述,生成符合规范的 Manim 场景 Python 文件。代码应遵循以下模式:
无语音旁白模式(仅动画):
from manim import *
class MyScene(Scene):
def construct(self):
title = Text("标题", font_size=48, color=BLUE)
self.play(Write(title))
self.wait(1)
语音旁白模式(动画 + 语音 + 字幕):
from manim import *
from manim_voiceover import VoiceoverScene
from manim_voiceover.services.gtts import GTTSService
class MyScene(VoiceoverScene):
def _make_subtitle(self, text_str):
"""创建带深色背景的底部居中字幕。"""
sub = Text(text_str, font_size=22, color=WHITE, weight=BOLD)
# 防止字幕超出左右边界
max_width = config.frame_width - 1.0 # 每侧预留 0.5 单位边距
if sub.width > max_width:
sub.scale_to_fit_width(max_width)
sub.to_edge(DOWN, buff=0.4)
bg = BackgroundRectangle(sub, color=BLACK, fill_opacity=0.6, buff=0.15)
return VGroup(bg, sub)
def construct(self):
self.set_speech_service(GTTSService(lang="en"))
sub_text = "欢迎观看演示"
with self.voiceover(text=sub_text) as tracker:
sub = self._make_subtitle(sub_text)
title = Text("Demo", font_size=48)
self.play(Write(title), FadeIn(sub), run_time=tracker.duration)
self.play(FadeOut(sub))
self.wait(0.3)
关键模式 —— voiceover 上下文管理器:
with self.voiceover(text="语音文本") as tracker:
# tracker.duration = TTS 语音时长(秒)
# 此区块内所有动画将自动与语音同步
self.play(SomeAnimation(), run_time=tracker.duration)
with self.voiceover(text=...) as tracker 执行三项操作:
tracker.duration 供动画与语音对齐字幕最佳实践:
_make_subtitle() 辅助函数,在屏幕底部渲染白色粗体文字+深色背景_make_subtitle() 自动检测字幕宽度,若超出画面范围则按比例缩放(scale_to_fit_width);长文本建议采用 font_size=22self.play() 中使用 FadeIn(sub),确保字幕与语音起始严格同步 —— 切勿延迟FadeIn 字幕,结束后 FadeOut⚠️ 避免双重字幕:若场景代码已使用 _make_subtitle() 渲染场景内字幕,则切勿同时启用 --burn_subtitles 烧录 SRT 字幕,否则将出现两层重叠字幕。请二选一:
_make_subtitle()),不烧录 SRT--burn_subtitles 烧录 SRT在场景文件同级目录下创建 manim.cfg:
[CLI] quality = high_quality preview = False [ffmpeg] video_codec = h264
质量对照表:
| 质量等级 | 命令行标志 | 分辨率 | FPS | manim.cfg 对应值 |
|---|---|---|---|---|
| Low | -ql | 480p | 15 | low_quality |
| Medium | -qm | 720p | 30 | medium_quality |
| High | -qh | 1080p | 60 | high_quality |
| Production | -qp | 2160p | 60 | production_quality |
manim render
输出路径格式:media/videos/
manim-voiceover 会自动在视频所在目录生成 .srt 字幕文件。使用 ffmpeg 烧录:
ffmpeg -y -i-vf "subtitles= :force_style='FontSize=22,PrimaryColour=&H00FFFFFF,OutlineColour=&H00000000,Outline=2,BackColour=&H80000000,BorderStyle=4,MarginV=30'" -c:a copy
⚠️ 双重字幕陷阱:若场景 Python 代码已通过 _make_subtitle() 渲染了场景内字幕,则切勿再烧录 SRT 字幕,否则将出现两层重叠字幕。
注意:ffmpeg 需启用 libass 支持。macOS 下 brew install ffmpeg 通常已包含;Conda 环境可能需要额外执行 conda install x264 -c conda-forge。
使用 ffmpeg 加速视频,默认 1.35 倍速:
SPEED=1.35 ffmpeg -y -i-filter_complex "[0:v]setpts=PTS/${SPEED}[v];[0:a]atempo=${SPEED}[a]" -map "[v]" -map "[a]"
注意:加速应作为最终输出步骤。若场景代码中已含场景内字幕(_make_subtitle),则加速输入应使用原始视频(而非已烧录 SRT 的版本),以避免双重字幕。run_pipeline.py 的 --speed 参数已自动处理此逻辑。
Write(text) —— 逐字写出文本Create(mobject) —— 绘制图形对象FadeIn(mobject) / FadeOut(mobject) —— 淡入/淡出DrawBorderThenFill(mobject) —— 先绘制边框再填充Transform(source, target) —— 形态渐变(morph)ReplacementTransform(source, target) —— 替换式渐变TransformMatchingShapes(source, target) —— 形状匹配渐变mobject.animate.to_edge(UP) —— 移至画面边缘mobject.animate.shift(RIGHT * 2) —— 平移mobject.animate.scale(2) —— 缩放Rotate(mobject, angle=PI) —— 旋转Text("文本", font_size=48, color=BLUE) —— 文本对象MathTex(r"e^{i\pi}+1=0") —— LaTeX 公式Circle(radius=1, color=RED) —— 圆形Square(side_length=2, color=GREEN) —— 正方形Arrow(start, end) —— 箭头NumberPlane() —— 坐标平面Axes(x_range, y_range) —— 坐标轴VGroup(obj1, obj2) —— 垂直分组group.arrange(RIGHT, buff=0.5) —— 水平排列BackgroundRectangle(obj, color=BLACK, fill_opacity=0.6) —— 背景矩形现象:UnknownCodecError: libx264
根本原因:Manim 在 scene_file_writer.py 中硬编码使用 libx264 编码器(无法通过 config/cfg 覆盖),而 conda 环境中的 ffmpeg 编译时启用了 --disable-gpl,因此未包含 GPL 授权的 libx264。
解决方案:
# Conda 环境(最常见场景) conda install x264 -c conda-forge # 安装后,conda-forge 版 ffmpeg 将自动重新链接 x264 库 # 验证 ffmpeg -codecs 2>&1 | grep libx264 # 输出应包含:encoders: libx264 libx264rgb
注意:brew install ffmpeg 默认内置 x264,但 conda 环境优先使用其自带的 ffmpeg,不会调用 Homebrew 版本。
manim-voiceover 依赖 pkg_resources,在 Python 3.12+ 上可能出现兼容性错误:
pip install "setuptools>=69.0,<72.0"
SRT 字幕烧录依赖 libass。macOS:
brew install ffmpeg # 验证 ffmpeg -filters 2>&1 | grep subtitles
Linux:
sudo apt install libass-dev # 可能需要重新编译 ffmpeg
gTTS 需访问 Google TTS 服务。若网络不可用,请切换至 pyttsx3 离线引擎:
from manim_voiceover.services.pyttsx3 import Pyttsx3Service self.set_speech_service(Pyttsx3Service())
Manim 使用系统字体渲染 Text 对象。请确保中文字体可用:
sudo apt install fonts-noto-cjkText("文本", font="PingFang SC")references/manim_guide.md —— Manim + voiceover + 字幕的详细技术文档scripts/check_environment.py —— 一键依赖检查scripts/run_pipeline.py —— 一键渲染 + 字幕烧录相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 134.1万人学习
共49课时 | 82.6万人学习
最新文章