Manim Animation En

Polar Sponsor
爱发电 赞助
.NET 9.0

使用 Manim Community 和 manim-voiceover 创建带同步语音旁白和字幕的数学动画。用于用户想要创建数学教学视频时。

Manim动画: 动画+ Voiceover + 字幕生成器. 授权: ericksun( QQ).

功能概述

Manim动画: 动画+ Voiceover + 字幕生成器. 授权: ericksun( QQ).是一项面向实际任务的技能,主要用于Overview. 这一技能使用 Manim 社区生成数学/教育动画, 并带有 manim-voiceover。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。

核心要点

  • 使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。
  • 该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。
  • 从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。

使用与执行

实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。

结果检查与注意事项

执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。

Manim 动画:动画 + 语音旁白 + 字幕生成器

作者: ericksun(孙自翔)

概述

本技能基于 Manim Community 构建,用于生成数学/教育类动画,并通过集成 manim-voiceover 插件实现 TTS 语音旁白与同步字幕。所有处理均在本地完成,无需调用付费 API。

核心能力:

  • 🎬 动画生成:使用 Manim 创建数学公式、几何图形、图表等动画
  • 🎙️ 语音旁白:通过 manim-voiceover 插件集成 TTS,自动实现动画与语音的精准同步
  • 📝 字幕系统:支持场景内字幕(Manim Text)与外部 SRT 字幕(ffmpeg 烧录)双模式
  • 🔄 一键流水线:描述需求 → 生成代码 → 渲染视频 → 烧录字幕

TTS 引擎(推荐 gTTS):

  • gTTS(推荐):Google 免费 TTS,支持中文,无需 API Key
  • pyttsx3(备用):离线 TTS,无需网络连接
  • Azure/OpenAI/ElevenLabs(高音质):需提供付费 API Key

前置条件

🔍 一键环境检查

首次使用前,请运行环境检查脚本,验证所有依赖是否就绪:

python3 {SKILL_DIR}/scripts/check_environment.py

该脚本将检查以下项目:

  • ✅ Manim Community 安装状态(可执行 manim 命令)
  • ✅ manim-voiceover + gTTS 插件安装状态
  • ✅ FFmpeg 及 libx264 编码器(Manim 硬编码依赖,必需)
  • ✅ FFmpeg 及 libass(用于 SRT 字幕烧录)
  • ✅ Python 依赖包
  • ✅ 中文字体可用性

必需系统工具

  • Manim Community:pip install manim
  • FFmpeg(需包含 libx264 + libass):Manim 在视频渲染中硬编码使用 libx264 编码器;字幕烧录需 libass
    • macOS(Homebrew):brew install ffmpeg(默认包含 x264 和 libass)
    • macOS(Conda):conda install x264 -c conda-forge(⚠️ Conda 版本的 ffmpeg 默认不包含 libx264)
    • Linux:sudo apt install ffmpeg libx264-dev libass-dev
  • Python 3.9+ 及 pip

必需 Python 包

# 核心依赖
pip install manim

# 语音旁白 + TTS
pip install "manim-voiceover[gtts]"

可选(增强功能)

  • pyttsx3:离线 TTS(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 输出目录

完整工作流(共 4 步)

第 1 步:理解用户需求并生成 Manim 场景代码

根据用户描述,生成符合规范的 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 执行三项操作:

  1. 调用 TTS 引擎生成语音音频
  2. 自动计算语音总时长
  3. 提供 tracker.duration 供动画与语音对齐

字幕最佳实践:

  • 场景内字幕:使用 _make_subtitle() 辅助函数,在屏幕底部渲染白色粗体文字+深色背景
  • 防溢出:_make_subtitle() 自动检测字幕宽度,若超出画面范围则按比例缩放(scale_to_fit_width);长文本建议采用 font_size=22
  • 字幕同步:在 voiceover 块内的 首个 self.play() 中使用 FadeIn(sub),确保字幕与语音起始严格同步 —— 切勿延迟
  • 每个 voiceover 块开始时 FadeIn 字幕,结束后 FadeOut
  • 字幕文本必须与 voiceover 文本完全一致

⚠️ 避免双重字幕:若场景代码已使用 _make_subtitle() 渲染场景内字幕,则切勿同时启用 --burn_subtitles 烧录 SRT 字幕,否则将出现两层重叠字幕。请二选一:

  • 选项 A(推荐):在代码中渲染字幕(_make_subtitle()),不烧录 SRT
  • 选项 B:不在代码中渲染字幕,通过 --burn_subtitles 烧录 SRT

第 2 步:配置渲染参数

在场景文件同级目录下创建 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

第 3 步:渲染视频

manim render  

输出路径格式:media/videos///.mp4

第 4 步:烧录 SRT 字幕(可选)

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。

第 5 步:加速视频(可选)

使用 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 参数已自动处理此逻辑。

Manim 常用动画参考

创建/显示动画

  • 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) —— 背景矩形

已知问题与解决方案

⚠️ 缺失 libx264 编码器(最常见问题)

现象: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 版本。

setuptools 兼容性问题

manim-voiceover 依赖 pkg_resources,在 Python 3.12+ 上可能出现兼容性错误:

pip install "setuptools>=69.0,<72.0"

ffmpeg 缺失 libass

SRT 字幕烧录依赖 libass。macOS:

brew install ffmpeg
# 验证
ffmpeg -filters 2>&1 | grep subtitles

Linux:

sudo apt install libass-dev
# 可能需要重新编译 ffmpeg

gTTS 网络问题

gTTS 需访问 Google TTS 服务。若网络不可用,请切换至 pyttsx3 离线引擎:

from manim_voiceover.services.pyttsx3 import Pyttsx3Service
self.set_speech_service(Pyttsx3Service())

中文字体

Manim 使用系统字体渲染 Text 对象。请确保中文字体可用:

  • macOS:PingFang SC(系统内置)
  • Linux:sudo apt install fonts-noto-cjk
  • 指定字体:Text("文本", font="PingFang SC")

相关资源

  • GitHub 仓库:https://github.com/hzsunzixiang/manim-animation-skill
  • Manim 技术指南:references/manim_guide.md —— Manim + voiceover + 字幕的详细技术文档
  • 环境检查脚本:scripts/check_environment.py —— 一键依赖检查
  • 渲染流水线脚本:scripts/run_pipeline.py —— 一键渲染 + 字幕烧录

相关专题

更多
Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

2026.11.06

0

12

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

2026.11.06

0

13

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

2026.11.06

0

10

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

2026.11.05

0

12

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

2026.11.05

0

12

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

2026.11.04

0

16

XORM框架结构体映射与表结构同步
XORM框架结构体映射与表结构同步

本专题围绕XORM框架的结构体映射展开,说明表名与字段的命名策略、xorm标签常用属性、主键自增与时间字段自动填充,并演示Sync2自动建表、增量字段升级、索引声明与反向生成结构体的完整流程。

2026.11.04

0

15

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

2026.11.04

0

15

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

2026.11.04

0

16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习