Convert Quarto presentations with speaker notes into AI-narrated MP4 videos with professional enhancements.
This skill automates the full pipeline from a Quarto .qmd presentation to a polished video:
- Extract speaker notes from Quarto source
- Generate AI narration using Kokoro TTS (multiple voices available)
- Capture slide screenshots via Chrome headless
- Build synchronized video with:
- Slide images synced to narration timing
- Fade transitions between slides
- Background music (ambient, low-volume)
- Burned-in captions (ASS format with bottom positioning)
- 1920×1080 MP4 (H.264 + AAC)
- Duration: Matches total narration time (~4-5 min for 14 slides)
- File size: ~7 MB for a 4-minute presentation
This skill was developed as part of the HyperFrames ecosystem — a framework for creating HTML-based video compositions. While this skill uses a standalone ffmpeg pipeline, HyperFrames provides additional tools for advanced video production.
# Install HyperFrames CLI
npx hyperframes@latest init my-projectWindows (winget):
winget install Gyan.FFmpegUbuntu/Debian:
sudo apt update
sudo apt install ffmpegmacOS (Homebrew):
brew install ffmpegVerify installation:
ffmpeg -version | head -1Windows (winget):
winget install Posit.QuartoUbuntu/Debian:
sudo apt install quartomacOS (Homebrew):
brew install quartoOr download directly: https://quarto.org/docs/get-started/
Required for headless slide screenshots.
Windows: Download from https://www.google.com/chrome/
Ubuntu/Debian:
sudo apt install chromium-browsermacOS:
brew install --cask google-chromeThis project uses uv — an extremely fast Python package manager and resolver written in Rust.
Install uv:
Windows (PowerShell):
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"Linux/macOS:
curl -LsSf https://astral.sh/uv/install.sh | shOr with Homebrew:
brew install uvInstall Python dependencies:
uv pip install kokoro-onnx soundfileThe Kokoro TTS model will auto-download on first run (~300 MB).
Run scripts with uv:
uv run scripts/build_working.py# 1. Clone this skill
git clone https://github.com/theAfricanQuant/quarto-slide-video-skill.git
cd quarto-slide-video-skill
# 2. Render your Quarto presentation
quarto render slides.qmd --to revealjs
# 3. Extract notes & generate TTS
uv run scripts/extract_notes.py
# 4. Capture screenshots
uv run scripts/screenshot_slides.py
# 5. Build final video
uv run scripts/build_working.pyquarto-slide-video/
├── SKILL.md # Full skill documentation
├── README.md # This file
├── scripts/
│ ├── build_working.py # Main production build script (WORKING)
│ ├── generate_sentence_captions.py # ASS caption generator (sentence-level)
│ └── generate_ass_captions.py # ASS caption generator (phrase-level)
└── examples/
├── timeline_v2.json # Sample timing data
├── captions.ass # Sample ASS subtitles
└── notes.json # Sample extracted notes
Do NOT use -movflags +faststart with ffmpeg 6.x on videos longer than ~60 seconds. It corrupts the H.264 NAL stream ("Invalid NAL unit size" errors). The working build script uses a clean two-pass approach without this flag.
| Tool | Version | Purpose |
|---|---|---|
| Python | 3.10+ | Script runtime |
| ffmpeg | 6.x | Video encoding (libx264, libass) |
| Chrome/Chromium | Latest | Headless screenshots |
| Quarto | 1.4+ | Presentation rendering |
| Kokoro TTS | Latest | AI narration |
MIT