jwynia/agent-skills/document-to-narration
Claude Code and agent skill by jwynia/agent-skills
- community
Checking that the SKILL.md file is still in the repository.
Convert written documents to narrated video scripts with TTS audio and word-level timing. Use when preparing essays, blog posts, or articles for video narration. Outputs scene files, audio, and VTT with precise word timestamps. Keywords: narration, voiceover, TTS, scenes, audio, timing, video script, spoken.
Install
npx vskill@latest install jwynia/agent-skills/document-to-narrationSKILL.md
Document to Narration
Convert written documents into narrated video scripts with precise word-level timing.
Core Principle
The agent interprets; the document guides. Rather than rigid template-based splits, this skill uses agent judgment to find where the content naturally breathes, argues, and transitions. The document's argument flow determines scene breaks, not a predetermined structure.
When to Use This Skill
Use this skill when:
- Converting a blog post or essay to video narration
- Preparing content for TTS audio generation
- Breaking long-form content into digestible scenes
- Creating word-level synchronized captions for video
Do NOT use this skill when:
- The content is already in scene/script format
- You need real-time voice synthesis (this is batch processing)
- Working with dialogue or multi-speaker content (single voice only)
Prerequisites
- Deno installed (https://deno.land/)
- Python 3.12 with venv support
- ffmpeg for audio conversion
- whisper-cpp (installed via @remotion/install-whisper-cpp)
- TTS model at
tts/model/(not in git due to size - see Model Setup below)
Complete Pipeline
There are two approaches: per-scene (legacy) and full narration (recommended).
Full Narration Pipeline (Recommended)
Generates a single audio file for consistent volume and pacing:
Per-Scene Pipeline (Legacy)
Generates separate audio per scene - can cause volume inconsistencies:
Warning: Per-scene TTS generates audio with different volume levels and pacing. When concatenated, this causes audible jumps and clipping. Use the full narration pipeline instead.
Quick Start
Full Narration Pipeline (Recommended)
Legacy Per-Scene Pipeline
Instructions
Step 1: Setup (First Time Only)
Create Python Virtual Environment
TTS Model Setup
The fine-tuned voice model (~7.8GB) is not included in git due to size. Place your Qwen3-TTS model files in tts/model/:
Install Whisper (if not already installed)
The @remotion/install-whisper-cpp package handles this:
Step 2: Prepare Your Document
The skill works best with:
- Markdown documents with clear heading structure (H1, H2)
- Well-structured arguments with distinct sections
- Content that reads naturally aloud
Step 3: Run the Pipeline
Step 4: Review Output
Scene Boundary Heuristics
The agent identifies scene breaks using these heuristics:
Strong Boundaries (Almost Always Break)
- H2 heading changes
- "Here's the thing" / "The point is" pivot statements
- Major metaphor introduction
- Explicit enumeration ("First...", "Second...")
- Significant perspective shifts
Moderate Boundaries (Consider Breaking)
- Long paragraph after short ones (or vice versa)
- Example-to-principle transitions
- "But" / "However" / "Meanwhile" at paragraph start
- Question-then-answer patterns
Weak Boundaries (Usually Keep Together)
- Paragraph-to-paragraph within same example
- Sequential evidence for same point
- Build-up to a punchline/reveal
Scene Length Guidance
- Target: 100-300 words per scene (30-90 seconds of audio)
- Minimum: 50 words (avoid micro-scenes)
- Maximum: 500 words (avoid cognitive overload)
Anti-Patterns
The Paragraph Slicer
Pattern: Breaking at every paragraph or heading mechanically. Problem: Ignores argument flow. Scenes feel choppy and disconnected. Fix: Look for rhetorical units, not structural units. Multiple paragraphs often form one scene.
The Wall of Text
Pattern: Keeping entire sections as single scenes. Problem: Creates TTS audio that's too long. Loses natural breathing room. Fix: Target 100-300 words. Find the natural pause point within sections.
The Verbatim Transcriber
Pattern: Copying written text exactly without spoken adaptation. Problem: Written conventions don't work when spoken. Parentheticals, complex punctuation, and nested clauses confuse TTS and listeners. Fix: Apply adaptation rules. Read it aloud mentally.
The Over-Adapter
Pattern: Rewriting content so heavily it loses the author's voice. Problem: The result doesn't sound like the original author. Fix: Preserve voice, adjust mechanics. If the author uses rhetorical questions, keep them.
Available Scripts
scripts/split-to-scenes.ts
Parse a markdown document and output scene text files.
Options:
--output- Directory for scene files (created if doesn't exist)--adapt- Apply spoken adaptation rules--dry-run- Preview scene breaks without writing files
Output: Numbered .txt files and initial manifest.json
scripts/narrate-full.py (Recommended)
Generate a single TTS audio file from all scene files. Produces consistent volume and pacing.
Options:
--force- Regenerate even if output exists--speaker- Speaker name (default: jwynia)--output- Custom output path (default:../full-narration.wav)
Output: Single full-narration.wav in parent directory of scenes
scripts/narrate-scenes.py (Legacy)
Generate TTS audio for each scene file separately. Not recommended - can cause volume inconsistencies when concatenated.
Options:
--force- Regenerate even if output exists--speaker- Speaker name (default: jwynia)
Output: .wav files alongside each .txt file
scripts/transcribe-full.py (Recommended)
Transcribe audio with word-level timestamps using Python's openai-whisper.
Options:
--model- Whisper model: tiny, base, small, medium, large, large-v2, large-v3 (default: medium)--output-dir- Output directory (default: same as audio file)
Output:
.vttfile with word-level timestamps.jsonfile with captions array for Remotion
Dependencies: Requires openai-whisper in Python environment:
scripts/extract-scene-boundaries.py
Extract scene timing boundaries from transcript by matching scene opening phrases.
Options:
--json- Output as JSON array--typescript- Output as TypeScript code for Video.tsx scenes array
Output: Scene numbers, slugs, start times, and durations
scripts/transcribe-scenes.ts (Deprecated)
Deprecated: Requires whisper-cpp binary which may not be installed. Usetranscribe-full.pyinstead.
Transcribe per-scene audio files using whisper-cpp.
Output: .vtt files with word-level timestamps
scripts/full-pipeline.ts
Orchestrate the complete pipeline.
Options:
--output- Output directory (required)--adapt- Apply spoken adaptation--skip-tts- Skip audio generation (text only)--skip-transcribe- Skip Whisper transcription
Output Format
manifest.json
VTT Format
Spoken Adaptation
When --adapt is enabled, the skill transforms written conventions to spoken equivalents:
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/education/document-to-narration/SKILL.md
Popularity
- Repository stars
- 33
- Repository forks
- 7
- 7-day trend score
- 18
Stars and forks are for the whole GitHub repository, not this skill alone. Refreshed 18 Mar 2026, 7 months ago.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/jwynia/agent-skills/document-to-narration)