Auto-generate academic presentations from a folder of source material. Quarto + Reveal.js, with ElevenLabs voice-cloned narration.
Academic talks win on delivery and Q&A, not visual design. This skill puts time where it matters: structuring content, writing speaker scripts calibrated to your actual speaking pace, and generating narration so you can rehearse by listening to yourself.
unzip make-slides.zip -d ~/.skills/user/
# or on Claude.ai: place into /mnt/skills/user/make-slides/# Quarto (slide renderer)
brew install quarto # macOS
# or https://quarto.org/docs/get-started/ for other OSes
# Audio tooling (for stitching narration)
brew install ffmpeg # macOS
sudo apt install ffmpeg # Debian/Ubuntu
# Python packages
pip install elevenlabs pydub requests python-frontmattermkdir -p ~/.config/make-slides
cp assets/.env.example ~/.config/make-slides/.env
# edit ~/.config/make-slides/.env and paste your real key
chmod 600 ~/.config/make-slides/.envGet your API key at https://elevenlabs.io/app/settings/api-keys. Creator plan ($22/mo, 100k chars/mo) recommended; Starter ($5/mo, 30k chars) is tight.
Record 60-120 seconds of clean audio (quiet room, good mic, your natural
conference pace). A sample script is in references/voice-narration.md. Then:
python scripts/clone_voice.py --sample /path/to/sample.mp3 --name "my-voice"This stores the voice_id at ~/.config/make-slides/voice.env. One-time setup.
OpenEvidence is an LLM-powered clinical evidence assistant. This skill uses it for discovery (finding which papers support a claim), with PubMed MCP as the authoritative source for BibTeX metadata. There's no hosted OpenEvidence MCP — you install an unofficial open-source server locally:
git clone https://github.com/bakhtiersizhaev/openevidence-mcp
cd openevidence-mcp
./scripts/setup-macos.sh # or setup-ubuntu.sh on Linux
npm run login # opens browser; sign in to OpenEvidence
npm run smokeThen register with Claude Desktop / Claude Code by adding to your mcp_servers config:
{
"mcpServers": {
"openevidence": {
"command": "node",
"args": ["/ABSOLUTE/PATH/openevidence-mcp/dist/server.js"]
}
}
}Restart Claude. You'll see openevidence in your connected MCPs, exposing tools
oe_auth_status, oe_ask, oe_history_list, and oe_article_get. Requires
Node.js 20+ and an OpenEvidence account. Full details in
references/citation-workflow.md.
You'll also need PubMed MCP enabled in Claude.ai connectors — this is a hosted MCP, no local install required.
Read references/pace-calibration.md and save your real wpm to
~/.config/make-slides/pace.env. Default: English 140 wpm, Mandarin 180 cpm.
Invoke by saying any of:
- "make slides on [topic]"
- "build a deck from these sources"
- "準備簡報"
- "做投影片"
Claude will:
- Inventory your folder
- Ask 4 questions (duration, audience, take-home, pace)
- Propose an outline — stop for your approval
- Draft
talk.qmdwith speaker notes, citations, figure placeholders - Validate timing with
check_timing.py - Render to HTML+PDF with
render.sh - Narrate to per-slide MP3s with
narrate.py - Stitch to
talk.mp3withstitch_audio.py
# Start a new talk folder
python scripts/new_talk.py "Robotic TME SDI"
cd robotic-tme-sdi
# Edit talk.qmd — structure and write speaker notes in ::: {.notes} blocks
# Validate timing (30 min target)
python ../scripts/check_timing.py talk.qmd --duration 30
# Render to Reveal.js HTML (add --pdf for handout)
bash ../scripts/render.sh talk.qmd
# Preview TTS-cleaned text without spending ElevenLabs quota
python ../scripts/text_cleaner.py talk.qmd --preview
# Show character count and cost estimate
python ../scripts/narrate.py talk.qmd --dry-run
# Generate narration (caches; reruns only regenerate changed slides)
python ../scripts/narrate.py talk.qmd
# Stitch to talk.mp3 and Reveal.js config
python ../scripts/stitch_audio.py audio/make-slides/
├── SKILL.md # Top-level workflow (what Claude reads first)
├── README.md # This file
├── references/ # Detailed guides, loaded by Claude as needed
│ ├── quarto-template.qmd # Starter deck template
│ ├── timing-math.md # wpm -> word budget math
│ ├── placeholders.md # FIGURE_PLACEHOLDER conventions
│ ├── citation-workflow.md # BibTeX + PubMed MCP
│ ├── pace-calibration.md # How to measure real wpm
│ └── voice-narration.md # ElevenLabs IVC/PVC, models, cleaning rules
├── scripts/ # Executable utilities
│ ├── new_talk.py # Bootstrap a talk folder
│ ├── parse_qmd.py # Shared .qmd parser (library)
│ ├── text_cleaner.py # TTS prep (library + CLI preview)
│ ├── check_timing.py # Word count -> duration validation
│ ├── render.sh # Quarto render wrapper
│ ├── clone_voice.py # ElevenLabs IVC/PVC setup
│ ├── narrate.py # .qmd -> per-slide MP3
│ └── stitch_audio.py # MP3s -> talk.mp3 + Reveal.js config
└── assets/
├── .env.example # Template for API key
└── reveal_audio_config.html # Reveal.js audio-slideshow plugin snippet
- Quarto over Slidev/Marp: native BibTeX support (superscripted Vancouver citations without manual formatting), live Python/R code chunks, one source file rendering to slides + PDF + manuscript draft.
- Two-tool citation pipeline: OpenEvidence MCP for discovery (find papers
supporting a claim via
oe_ask), PubMed MCP for authoritative metadata (BibTeX). OE output never becomes the citation — PubMed is always the ground truth. This protects against LLM hallucination in medical claim synthesis. - Folder-as-context: dump sources into a folder; skill inventories and works from that — no step-by-step context pasting.
- Placeholder-driven visuals:
FIGURE_PLACEHOLDER: KM plot, 16:9, full widthmarks where art belongs; user supplies the real figure later. - Timing by speaker-notes word count: each
::: {.notes}block's word count drives the duration estimate for that slide, with complexity multipliers for math/tables/figures. Bilingual-aware (English words + CJK chars counted separately at configurable rates). - Content-hashed narration cache: only regenerates MP3 for slides whose text actually changed, saving ElevenLabs character quota on iteration.
- IVC -> PVC upgrade path: starts with Instant Voice Clone (1-2 min sample, good enough for rehearsal); upgrade to Professional Voice Clone later once you have 1+ hour of clean recordings for async delivery content.
quarto: command not found — install from https://quarto.org/docs/get-started/
ModuleNotFoundError: elevenlabs — pip install elevenlabs
PDF render fails — quarto install tinytex
Voice sounds off / robotic — lower --stability to 0.35, shorten long
sentences in speaker notes
Chinese tones wrong — try --model eleven_v3 for the v3 model (better tonal
accuracy than multilingual_v2)
Timing drift >10% — recalibrate your wpm via references/pace-calibration.md.
The default (140 wpm English) is an estimate; your real rate might be 125 or 155.
The skill is fully standalone — no external fetches on invocation. To update,
replace the folder with a newer version. Your ~/.config/make-slides/ state
(API key, voice, pace) is preserved.