既然入了 Manim 的坑,就得做好“死磕”的准备(附文字重叠与乱码泪血经验)

0 阅读4分钟

最近心血来潮,想做几个技术视频发 B 站。

看了一圈工具,觉得剪辑软件太麻烦,正好自己会点 Python,就盯上了 Manim。大名鼎鼎的 3Blue1Brown 都在用,我想着这玩意儿肯定好使,“代码即视频”,听着就极客范儿十足。

结果呢?刚上手的那几天,我差点没把键盘砸了。

今天不聊高深的数学动画原理,就聊聊我作为一个新手,在用 Manim 做视频时遇到的两个“巨坑”,以及我是怎么爬出来的。

坑一:被中文乱码支配的恐惧

我最开始的想法很单纯:我要在视频里写个中文标题。

我照着官方文档,用了 Tex 类。代码一跑,报错。好不容易配好了环境,不报错了,结果画面出来全是方块。

我就纳闷了,我就想显示个“你好世界”,怎么就这么难?

后来我反应过来了,Manim 默认是用 LaTeX 编译文本的。LaTeX 这东西,对中文的支持本来就得挑环境。我要是为了做个视频,去把电脑里的 TeX 环境重装一遍,那这一天啥也别干了。

其实,退一步海阔天空。

我发现 Manim 里有个 Text 类(注意不是 Tex)。这玩意儿它不走 LaTeX 编译,直接调系统字体。

Python

# 舒服了,直接调用系统字体
t = Text("终于能显示中文了", font="SimHei", color=RED)

只要指定个中文字体,比如黑体或者微软雅黑,渲染速度快得飞起,而且绝对不会乱码。

说实话,除非你是要写那种极其复杂的数学公式,否则真没必要死磕 LaTeX。我现在视频里 90% 的文字都是用 Text 搞定的。既省事,又稳当。

坑二:文字和音频的“车祸现场”

解决了显示问题,我又遇到了新问题:节奏感

我给视频加了 TTS 配音。一开始,我把所有动画都写成 Write 或者 Transform,然后一股脑堆在 construct 函数里。

结果视频生成出来一看: 配音还没念完“我们可以看到”,屏幕上的代码已经跑完了; 或者上一句字幕还在屏幕上赖着不走,下一句字幕直接叠在上面,乱成一锅粥。

这就是典型的音画不同步。

我试过好多办法,最后发现最稳妥的办法还是——手动挡控制

  1. 别太依赖 Transform 虽然 Transform 看着炫酷,但如果前后两段文字结构差得远,变起来会乱飞。对于大段的解说词,我后来全改成 FadeInFadeOut 了。淡入淡出虽然朴素,但是干净,不容易穿帮。
  2. 算好时间账 音频有多长,心里得有数。我现在的做法是,根据音频的时长,在代码里死算 wait 的时间。 比如这句话念完要 3 秒,那我就乖乖 self.wait(3)。虽然写代码的时候麻烦点,得一句句去对时间,但生成出来的视频节奏感特别好,读起来顺口,看着也舒服。
  3. VGroup 是排版神器 以前我傻乎乎地去调每个文字的坐标,后来发现 VGroup 加上 .arrange() 才是正解。它能自动帮你把文字按顺序排好,间距还能自己调。这省去了我大量调参的时间。

一点小感想

Manim 这东西,入门门槛确实有点高。它不像剪辑软件那样所见即所得,你得在脑子里先过一遍画面,然后把它翻译成代码。

但这几天折腾下来,我觉得挺值的。

当看到那些复杂的逻辑被代码清晰地演示出来时,那种爽感确实无可替代。虽然中间踩了不少坑,比如文字重叠、比如环境配置,但把这些问题一个个解决掉的过程,本身也挺有意思的。

这是我写的第一篇 Manim 相关的博客,要是大家觉得有用,或者也遇到了类似的坑,欢迎在评论区聊聊。咱们一起排雷,早日做出那种丝滑的大片。