Open source · Apache-2.0

Narrated presentations, cut to the word.

You write a markdown script and plain HTML slides. Your cloned voice reads the script. DeckTalk produces one mp4 in which every reveal lands on the word that introduces it. Change a sentence and only that section renders again.

$uv tool install decktalk
Quickstart Source
Narration · drag the playhead

A timestamp for every word. A cue for every reveal.
Slide
How it works

The script is the edit.

Narration comes back with a time for every word, so a reveal follows a phrase rather than a second. Change a sentence and only that section renders again. Follow one cue through the four files.

01 WRITE
script.md
## 3. The curve
Now a curve draws as I talk.
And here is an equation:
the derivative of x squared.

A script in markdown

One heading per scene. Bracketed directions are not spoken.

02 NARRATE
build/audio/03.words.json
{ "word": "curve",
  "start": 0.82 }
{ "word": "equation",
  "start": 5.80 }

Your voice reads it

ElevenLabs returns the audio and a timestamp for every word.

03 CUE
cues.json
{ "step": "3.1draw",
  "on": "curve draws" }
{ "step": "3.1eq",
  "on": "equation" }

Name the phrase

A cue is a spoken phrase. DeckTalk resolves it to the second the word starts.

04 RECORD & CUT
deck/index.html
<path data-cue="3.1draw"
      data-fx="draw"/>
<div  data-cue="3.1eq"
      data-tex="…"/>

Slides reveal on cue

Plain HTML, recorded in Chromium, cut by ffmpeg to the frame at 5.80 s.

What you get

Built for the tenth edit, not the first take.

Frame-exact cuts

Each recording carries a visible mark at the moment narration starts. The cut is measured from the frames, not from a timer.

Cached narration

Sections are hashed by text. An edit re-synthesizes only the sentences that changed, so you pay per change, not per build.

A soundscape

An underscore that ducks under speech, ambience beds, effects on cues, broadcast loudness. Every part optional.

Offline drafts

A silent mode renders the whole film with placeholder narration and estimated word times. Layout passes cost nothing.

Verified output

Black or truncated recordings stop before assembly. A cue that cannot be found stops the build. A check proves each cue moved pixels.

Nothing to install by hand

Chromium and ffmpeg arrive through Python packages. One setup command fetches both, once per machine.

Three commands to a video.

The scaffold is a working deck. Add your ElevenLabs voice when you are ready; until then, build silently.

$ uv tool install decktalk && decktalk setup
$ decktalk init my-lesson && cd my-lesson
$ decktalk build --silent   # no key needed
$ decktalk build            # your voice