npx skills add ...
npx skills add jwynia/agent-skills --skill document-to-narration
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.
npx skills add jwynia/agent-skills --skill document-to-narration
Convert written documents into narrated video scripts with precise word-level timing.
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.
Use this skill when:
Do NOT use this skill when:
tts/model/ (not in git due to size - see Model Setup below)There are two approaches: per-scene (legacy) and full narration (recommended).
Generates a single audio file for consistent volume and pacing:
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.
The fine-tuned voice model (~7.8GB) is not included in git due to size.
Place your Qwen3-TTS model files in tts/model/:
The @remotion/install-whisper-cpp package handles this:
The skill works best with:
The agent identifies scene breaks using these heuristics:
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.
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.
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.
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.
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 filesOutput: Numbered .txt files and initial manifest.json
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
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
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:
.vtt file with word-level timestamps.json file with captions array for RemotionDependencies: Requires openai-whisper in Python environment:
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 arrayOutput: Scene numbers, slugs, start times, and durations
Deprecated: Requires whisper-cpp binary which may not be installed. Use
transcribe-full.pyinstead.
Transcribe per-scene audio files using whisper-cpp.
Output: .vtt files with word-level timestamps
Orchestrate the complete pipeline.
Options:
--output - Output directory (required)--adapt - Apply spoken adaptation--skip-tts - Skip audio generation (text only)--skip-transcribe - Skip Whisper transcriptionWhen --adapt is enabled, the skill transforms written conventions to spoken equivalents:
| Written | Spoken |
|---|---|
| Parenthetical asides | Em-dash or separate sentence |
| "e.g." | "for example" |
| "i.e." | "that is" |
| Long nested clauses | Split into multiple sentences |
| Semicolons | Periods |
*emphasis* | Context-appropriate stress |
Preserve:
Whisper requires 16kHz mono WAV. The pipeline handles conversion automatically:
The fine-tuned voice model (~7.8GB) is bundled at tts/model/. Uses Qwen3-TTS with custom speaker embedding.