文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。
Manim Voiceover 是一个为 Manim 打造的专注于语音旁白的插件:
- 直接在 Python 中添加语音旁白: 无需使用视频编辑器,即可为 Manim 视频添加语音旁白。
- 在渲染期间录制旁白: 通过简单的命令行界面(参见
RecorderService
),可使用麦克风在渲染过程中录制语音旁白。 - 使用 AI 生成旁白: 利用多种免费及付费服务,开发时可直接使用 AI 自动生成的配音。
- 动画逐词时间标记: 实现动画与语音旁白的逐词时间标记同步,即根据语音旁白中特定词语触发相应的动画效果。即使是录制的音频,此功能也能实现。这得益于 OpenAI Whisper 技术的支持。
快速入门
在继续之前,请按照安装部分的步骤安装 Manim Voiceover,并确保其正常运行。
基本用法
要使用 Manim Voiceover,只需从插件中导入 VoiceoverScene
类:
from manim_voiceover import VoiceoverScene
让你的场景继承自 VoiceoverScene
:
class MyAwesomeScene(VoiceoverScene):
def construct(self):
...
你也可以从多个场景类继承:
from manim.scene.moving_camera_scene import MovingCameraScene
class MyAwesomeScene(MovingCameraScene, VoiceoverScene):
def construct(self):
...
只要父类的变量或方法不冲突,这应该可以正常工作。
Manim Voiceover 可以使用各种文本到语音引擎,有些是专有的,有些是免费的。一个好的起点是 gTTS,它使用 Google Translate API。我们发现,由于其跨平台兼容性,这是开始使用该库的最佳选择——然而它仍然需要互联网连接。
from manim_voiceover import VoiceoverScene
from manim_voiceover.services.gtts import GTTSService
class MyAwesomeScene(VoiceoverScene):
def construct(self):
self.set_speech_service(GTTSService())
添加旁白的逻辑非常简单。将动画包装在一个调用 self.voiceover()
的 with
块中:
with self.voiceover(text="我讲话的时候会画出这个圆。") as tracker:
... # 在这里动画化需要动画化的内容
Manim 将动画化 with
块中的所有内容。如果旁白在动画结束时还没有完成,Manim 将等待它完成。此外,你可以使用 tracker
对象来获取旁白的总时长或剩余时长,从而更精细地控制场景:
with self.voiceover(text="我讲话的时候会画出这个圆。") as tracker:
self.play(Create(circle), run_time=tracker.duration)
提示:使用 with
块可以让你将句子依次连接起来,从而得到更易读的代码,因为旁白调用实际上就像是注释。
text
参数会自动重复用于视频字幕。或者,你可以提供一个自定义字幕:
with self.voiceover(
text="我讲话的时候会画出这个圆。",
subcaption="好可爱的圆!:)"
) as tracker:
self.play(Create(circle))
查看示例画廊和示例目录以获取更多示例。我们建议从 gTTS 示例开始。
书签
Manim Voiceover 的一个重要功能是书签。书签允许你在旁白中的特定单词处触发动画。
视频:https://user-images.githubusercontent.com/2453968/201714175-ea5e7e46-9b33-40de-a4c1-ecc7bf55e42b.mp4
借助书签,你可以更精确地计时动画。查看书签示例和近似计算 τ 示例以获取更多示例。
录制自己的旁白
Manim Voiceover 可以直接从命令行录制你的旁白。我们推荐以下工作流程:
- 使用其中一个文本到语音引擎开发动画,例如
services.gtts.GTTSService
:
from manim_voiceover import VoiceoverScene
from manim_voiceover.services.gtts import GTTSService
class MyAwesomeScene(VoiceoverScene):
def construct(self):
self.set_speech_service(GTTSService())
with self.voiceover(text="我讲话的时候会画出这个圆。") as tracker:
self.play(Create(circle))
- 当你对动画感到满意时,将服务切换为
services.recorder.RecorderService
以录制自己的旁白:
from manim_voiceover import VoiceoverScene
# from manim_voiceover.services.gtts import GTTSService
from manim_voiceover.services.recorder import RecorderService
class MyAwesomeScene(VoiceoverScene):
def construct(self):
# self.set_speech_service(GTTSService())
self.set_speech_service(RecorderService())
with self.voiceover(text="我讲话的时候会画出这个圆。") as tracker:
self.play(Create(circle))
- 按照正常方式渲染场景:
manim -pql my_awesome_scene.py --disable_caching
这将在终端中逐步指导你如何录制旁白。
用不同语言生成旁白
每个语音服务都支持不同的选项集,其中一些支持多种语言。你可以在 API 参考的语音服务部分了解这些选项。
例如,services.gtts.GTTSService
支持 Google Translate 支持的所有语言,你可以在此处找到这些语言。gTTS 示例以英语和越南语实现了相同的场景作为演示。
如果你找不到适合自己语言的文本到语音引擎,你可以直接使用 services.recorder.RecorderService
录制自己的旁白。
风险提示与免责声明
本文内容基于公开信息研究整理,不构成任何形式的投资建议。历史表现不应作为未来收益保证,市场存在不可预见的波动风险。投资者需结合自身财务状况及风险承受能力独立决策,并自行承担交易结果。作者及发布方不对任何依据本文操作导致的损失承担法律责任。市场有风险,投资须谨慎。