Model or dataset
ManimCommunity/manim-voiceover avatar
ManimCommunity/manim-voiceover

manim-voiceover: adding narration to Manim scenes without a video editor

Manim plugin for all things voiceover

315 stars77 forksPythonMIT

At a glance

What is it?
manim-voiceover is a Manim plugin that puts voiceover generation, recording and word-level animation timing inside the Python script. The idea is good; the install is where most people will spend their afternoon.
Who is it for?
Adopt manim-voiceover if you already write Manim scenes in Python and want narration, translation or word-triggered animation inside the same file. Skip it if you only need a soundtrack after the render, since a video editor is the better tool there, and skip it if you need a stable API, because pyproject.toml still classifies the project as Development Status 3 - Alpha.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 96 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 18, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The gap manim-voiceover fills: narration that stays in sync with the animation

Manim renders animation from Python. Narration normally arrives later, in an editor, and the moment you cut a scene the audio drifts out of step. manim-voiceover moves that work back into the scene file. The README lists four things it does: add voiceovers directly in Python, record with a microphone during rendering, use AI voices from several services, and trigger animations at specific words in the voiceover. The last one is the interesting part. Per-word timing is produced with OpenAI Whisper, according to the README, which means a word in the transcript can be the event that starts an animation rather than a hand-measured timestamp. The audience is narrow and specific: people who already write Manim scenes and are comfortable in Python. If you animate in a GUI, this plugin has nothing to offer you.

How the plugin works: a service layer, a cache, and a bookmark

The repository layout tells most of the story. src/ holds the package, examples/ holds one script per backend (gtts-example.py, azure-example.py, pyttsx3-example.py, openai-example.py, elevenlabs-example.py, recorder-example.py), and tests/ sits beside them. Each TTS provider is an optional dependency in pyproject.toml, so the core install stays small and the provider you actually use is pulled in separately. That is a sensible split, and it is also the main source of confusion for new users, because a scene that imports a Gemini or Azure voice will not run until the matching extra is installed. The mechanism itself is a wrapper around scene rendering: you declare a voiceover, the plugin obtains audio from the chosen service or from the microphone, and the renderer waits for the audio while animations play. Whisper transcription then supplies word-level timings. The README also states that bookmarks exist as a concept, and examples/bookmark-example.py is in the repository, but the README does not describe the bookmark API in any detail. Read the example file, not the README, if bookmarks are why you are here.

Installing manim-voiceover and rendering a first narrated scene

The README does not inline installation steps. It points to the installation page of the documentation at voiceover.manim.community, so treat that page as the source of truth. What the repository does confirm is the package name on PyPI, manim_voiceover, and the extras declared in pyproject.toml: azure, gtts, openai, pyttsx3, recorder, translate, elevenlabs, gemini, transcribe and all. Python 3.11 or newer is required. The core dependencies include sox, pydub and mutagen, so audio tooling has to be present on the machine before anything renders.

Where manim-voiceover gets in your way

The first limitation is the dependency surface. Whisper is not small, PyAudio needs system audio libraries, and sox is a separate binary that pip does not install for you. A machine that renders Manim fine can still fail here, and the failure will look like an import error rather than an audio problem. The second is the optional-dependency design. It keeps the base package light, but it means every tutorial you read may assume a different extra is installed, including ones the README lists but never explains. Third, pyproject.toml carries the classifier Development Status 3 - Alpha, which is the project's own statement about API stability; scenes written against v0.4.0 may need edits later. Fourth, the README is thin on the parts that matter most. It says bookmarks exist and points at an example. It does not document the API, error handling, or what happens when a TTS service returns nothing. If your workflow depends on a proprietary voice, you are also depending on that vendor's availability and pricing, neither of which this plugin controls.

manim-voiceover compared with recording narration separately

The obvious alternative is to render the animation first and record narration afterwards in an audio editor such as Audacity, then combine the two in a video editor. The difference is where timing lives. In that workflow, timing lives in the editor and in your ears; you nudge clips until they line up. In manim-voiceover, timing lives in the scene script, and per-word timings from Whisper let an animation start on a specific spoken word. That is a real difference in approach, not a preference. The separate-editor route wins on control: you can retake a sentence without re-rendering, and you are not bound to any TTS provider. The plugin wins on reproducibility: re-rendering the scene regenerates the audio and the timings together, so a text change does not silently desynchronise anything. If your video is a one-off, the editor is faster. If it is a script you will re-render as the content changes, the plugin pays for itself.

Maintenance, upgrade cost and the MIT licence

The last push to the repository was on 2026-06-15, and v0.4.0 was released on 2026-06-14. Before that, v0.3.7 landed on 2024-09-29 and v0.3.6.post on 2024-03-16. Read that sequence carefully: a long quiet stretch, then a jump to 0.4.0. The project is not archived, and it is not abandoned, but the release cadence is uneven, so plan upgrades around releases rather than around a steady stream of patches. The upgrade cost sits mostly in the optional dependencies. Pinning manim_voiceover without pinning the provider SDKs means a TTS vendor can change its client library under you, and the extras in pyproject.toml do carry upper bounds such as openai>=1.6.1,<2, which limits that risk but does not remove it. The licence is MIT, which is permissive and places few obligations on how you distribute rendered videos or modified source. That is a general description of MIT, not legal advice; check the LICENSE file and your own situation.

Editorial conclusion

Adopt manim-voiceover if you already write Manim scenes in Python and want narration, translation or word-triggered animation inside the same file. Skip it if you only need a soundtrack after the render, since a video editor is the better tool there, and skip it if you need a stable API, because pyproject.toml still classifies the project as Development Status 3 - Alpha. Before committing, check one thing: whether the TTS backend you intend to use appears in the optional-dependencies list of the version you are about to install, and whether your machine can satisfy the sox and PyAudio requirements that the docs describe.

Frequently asked questions

Is manim-voiceover free to use?

The plugin itself is MIT licensed and free to install. Individual TTS services are a separate matter: the README lists gTTS and pyttsx3 alongside proprietary services such as Azure and Gemini, so the cost depends on which backend you choose.

How much does a one minute voiceover cost?

The repository does not publish pricing for any TTS provider. The README lists the supported services, including free options such as gTTS and pyttsx3 and proprietary ones such as Azure and Gemini, so you would need to check each provider's own pricing.

Is manim-voiceover hard to learn?

The plugin assumes you already write Manim scenes in Python, and the repository ships one example script per backend to copy from. The harder part is the environment: sox, pydub and mutagen are core dependencies, and Whisper and PyAudio arrive through the transcribe and recorder extras.

Which TTS services does manim-voiceover support?

The README lists Gemini Text to Speech, Azure Text to Speech, gTTS and pyttsx3, plus a command line interface for recording your own voice. Each one is an optional dependency in pyproject.toml, so you install only the backend you intend to use.

Does manim-voiceover need OpenAI Whisper?

Only for per-word timing. The README states that per-word timing works thanks to OpenAI Whisper, and the transcribe extra in pyproject.toml brings in openai-whisper and stable-ts. If you do not need animations triggered at specific words, you can skip that extra.

Official sources

  1. License: MIT
  2. ManimCommunity/manim-voiceover on GitHub
  3. Project website
  4. README
  5. Releases
Community notes

Community notes