Manim Narration
A 30–120s narrated MP4 with synchronized voice, cinematic transitions, and optional live-website screenshots — playable in any modern player including VSCode's preview pane.
Narration comes from Microsoft edge-tts (free, no API key); ffmpeg re-encodes the
audio so the MP4 plays reliably in VSCode, Chromium and Electron previews. The
NarratedScene base class exposes a narrate(text) context manager paced to the
real audio duration. Screenshots declared with # ASSET: manifest comments are
pre-fetched through gstack /browse, so a video can show live websites, GitHub
PRs, dashboards or IDE views without manual capture.
Composes with manimce-best-practices for animation idioms. Not for ManimGL —
use manimgl-best-practices there; it has no narration support.
Dependencies are installed by ~/.claude/install.sh: manim and edge-tts from
pip, ffmpeg/ffprobe from the system, and gstack (optional, for screenshots).
When to invoke
- "make a narrated manim video about X"
- "explain Y in a 60s manim animation with voice"
- "PR walkthrough video for "
- "anlatımlı manim videosu yap"
Quick usage
- Subclass
manim_narration.lib.voiceover_scene.NarratedScene. - Wrap each beat:
with self.narrate("Sentence here.") as t: ... - (Optional) Add
# ASSET: <slug> | <url> | viewport=WxH | clip=<css>manifest comments. Run the visuals pre-fetch before rendering. - Render with
manim -qh, then re-encode audio with ffmpeg per RENDER.md.
Override voice per scene
class MyScene(NarratedScene):
VOICE = "tr-TR-EmelNeural" # Turkish female
Tested voices: en-US-AriaNeural (default), en-US-JennyNeural, en-US-GuyNeural, tr-TR-EmelNeural, tr-TR-AhmetNeural. Avoid en-US-AvaNeural (flaky).
Visual asset pipeline (gstack /browse)
Pre-fetches screenshots from real URLs before render so scenes can
ImageMobject(asset("slug")) real web content. Falls back to a manual
capture instruction list if gstack is unavailable. See RENDER.md.