# Manim Narration

> Build a Manim video with spoken narration synced to the animation. Use for a "narrated Manim video", "anlatımlı manim", "manim with voice", a PR walkthrough video, or code that imports NarratedScene. ManimCE only.

- Skill: `furkankoykiran/manim-narration` (Agent Skill, multi-file: 12 files)
- Install (CLI): `npx skillmds@latest add furkankoykiran/manim-narration`
- Raw SKILL.md: https://api.skillmd.com/api/skills/furkankoykiran/manim-narration/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: furkankoykiran (https://skillmd.com/u/furkankoykiran)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/furkankoykiran/manim-narration

---


# 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 <github URL>"
- "anlatımlı manim videosu yap"

## Quick usage
1. Subclass `manim_narration.lib.voiceover_scene.NarratedScene`.
2. Wrap each beat: `with self.narrate("Sentence here.") as t: ...`
3. (Optional) Add `# ASSET: <slug> | <url> | viewport=WxH | clip=<css>`
   manifest comments. Run the visuals pre-fetch before rendering.
4. Render with `manim -qh`, then re-encode audio with ffmpeg per RENDER.md.

## Override voice per scene
```python
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.

