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.
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.
script.md ## 3. The curve Now a curve draws as I talk. And here is an equation: the derivative of x squared.
One heading per scene. Bracketed directions are not spoken.
build/audio/03.words.json { "word": "curve", "start": 0.82 } { "word": "equation", "start": 5.80 }
ElevenLabs returns the audio and a timestamp for every word.
cues.json { "step": "3.1draw", "on": "curve draws" } { "step": "3.1eq", "on": "equation" }
A cue is a spoken phrase. DeckTalk resolves it to the second the word starts.
deck/index.html <path data-cue="3.1draw" data-fx="draw"/> <div data-cue="3.1eq" data-tex="…"/>
Plain HTML, recorded in Chromium, cut by ffmpeg to the frame at 5.80 s.
Each recording carries a visible mark at the moment narration starts. The cut is measured from the frames, not from a timer.
Sections are hashed by text. An edit re-synthesizes only the sentences that changed, so you pay per change, not per build.
An underscore that ducks under speech, ambience beds, effects on cues, broadcast loudness. Every part optional.
A silent mode renders the whole film with placeholder narration and estimated word times. Layout passes cost nothing.
Black or truncated recordings stop before assembly. A cue that cannot be found stops the build. A check proves each cue moved pixels.
Chromium and ffmpeg arrive through Python packages. One setup command fetches both, once per machine.
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