Automated summary
Generates, auditions and fixes narration audio for a paper video from narration.json, with multiple text-to-speech providers and automatic transcription-based verification.
Strengths
- Incremental regeneration: only segments whose text, voice, model, style or provider changed are re-rendered.
- Provider choices for every situation: OpenRouter/Gemini for quality, free `say` (macOS) and `silent` for timing drafts.
- Automatic round-trip verification that transcribes each clip, compares it word for word against the script and retries to keep the best take.
- Voice auditioning on a single segment plus dubbing of an existing video with offset and ducking of the original audio.
Limitations
- Verification needs an OpenRouter key on top of the TTS key, adding extra cost and latency.
- Only Gemini TTS honours the natural-language style instruction; other models may read it aloud.
- The `say` provider is macOS-only and sounds robotic, while `silent` yields only estimated-length silence for timing.
Use it when narration for a paper video must be produced, adjusted (voice, pace, pronunciation) or laid over an existing cut.
Skip it when narration.json and the project structure do not exist yet, or when you need full video editing rather than just the voice track.
Security analysis
CautionThe skill is a legitimate media-generation workflow using local scripts, network TTS APIs, and video dubbing. It includes no destructive commands, credential exfiltration, obfuscated payloads, or safety-disabling instructions, and explicitly warns against printing or committing keys. Caution is warranted only because it invokes unreviewed local scripts and third-party APIs.
- •Delegates execution to local `uv run scripts/generate_voice.py` and `scripts/videotools.py`; the script contents are not included, so their actual behavior cannot be verified from this file.
- •Uses third-party TTS providers and reads API keys such as `OPENROUTER_API_KEY` and `GEMINI_API_KEY` from `.env`; keys should be scoped appropriately and never committed.
- •Runs local Python scripts via `uv run` and performs outbound network calls to OpenRouter or Gemini TTS services.
- •Requires API keys (`OPENROUTER_API_KEY`, `GEMINI_API_KEY`) loaded from `.env`; the skill correctly warns against printing or committing keys.
- •Writes audio files and can modify video audio via `videotools.py dub`; these are legitimate but file-mutating operations.
Examples
Generate the voice-over for my paper video project at ./my-paper-video — render every segment in narration.json and tell me which clips came out below the similarity threshold.Audition the voices Charon, Puck, Kore and Fenrir on the 01-title segment of ./my-paper-video so I can pick one before rendering the rest.Clip 03-method is flagged LOW because the model mispronounces our model name; rephrase the sentence so it sounds right and regenerate only that segment.Add the narration clip P/audio/04-demo.wav on top of in.mp4 with a 1 second offset and duck the original audio to 20%.name: voiceover description: Generate, audition, regenerate or fix narration audio for a paper video from narration.json (stage 4 of paper-to-video). Use for text-to-speech, changing voice or pace, mispronunciations, clips flagged LOW, or adding a voice-over on top of an existing video.
Voice-over
uv run scripts/generate_voice.py P # all segments; unchanged ones are skipped
uv run scripts/generate_voice.py P --only 03-method,07-results
uv run scripts/generate_voice.py P --force # regenerate all
uv run scripts/generate_voice.py P --audition Charon,Puck,Kore,Fenrir --only 01-title # -> audio/audition/
uv run scripts/generate_voice.py P --provider say # free offline draft (macOS)
uv run scripts/generate_voice.py P --provider silent # silence of estimated length, for timing only
Output: P/audio/<id>.wav (24 kHz mono) and <id>.json (text hash, voice, duration, similarity).
A clip is regenerated automatically when its text, voice, model, style or provider changes.
Providers (tts.provider in narration.json, or --provider)
| provider | needs | notes |
|---|---|---|
| openrouter | OPENROUTER_API_KEY in .env | default; model google/gemini-3.1-flash-tts-preview, voices such as Charon, Puck, Kore, Fenrir, Aoede |
| gemini | GEMINI_API_KEY | Google AI Studio directly; same voices |
| say | macOS | robotic but free; good for timing drafts |
| silent | nothing | ~2.6 words/s of silence |
.env is looked up in the project folder, the current folder, then the repo root. Never print or commit keys.
Pace and style
tts.style is a natural-language instruction prepended to every text. Gemini TTS follows it and does
not speak it; other models may read it aloud, and the transcription check will catch that. Per-segment
overrides: {"id": "...", "text": "...", "tts": {"voice": "Puck"}}.
Verification
With verify.model set and an OpenRouter key, each clip is transcribed back and compared word for word
with the script; below min_similarity it retries up to retries times and keeps the best take. Clips
still below the threshold are listed under NEEDS ATTENTION with what was heard. Fixes: rephrase the
sentence, spell a term the way it sounds, or split long sentences. Rewording usually works best. Listen to flagged clips before accepting them.
Voice-over on an existing video
Either add a narration segment to narration.json and reference its id from a clip item in
timeline.json ("narration": "<id>", see the video-editing skill), or do it directly:
uv run scripts/videotools.py dub in.mp4 P/audio/04-demo.wav out.mp4 --offset 1.0 --duck 0.2
The original audio drops to --duck (0.2 = 20 %) while the voice speaks; the last frame is held if the
voice outlasts the video (--no-extend to cut instead).
From the file to a first result
The download contains exactly the content displayed on this page. This copy may differ from the latest version in the source repository.
View the source and supporting filesThis download contains SKILL.md only. Any scripts, references, templates and dependencies are not included. Get the required files from the source, preserving their directory structure, before continuing.
1. Download the file
Download SKILL.mdFrom the root of a test project, save the file as .skill-downloads/voice-over-and-narration-audio-mvda870o/SKILL.md, or use the command below. This folder is for inspecting the skill before installation.
Command for macOS/Linux or WSL: requires a POSIX shell and curl. On Windows without WSL, use the download button and create the folder manually.
mkdir -p '.skill-downloads/voice-over-and-narration-audio-mvda870o' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/voice-over-and-narration-audio-mvda870o/download' --output '.skill-downloads/voice-over-and-narration-audio-mvda870o/SKILL.md.part' && mv '.skill-downloads/voice-over-and-narration-audio-mvda870o/SKILL.md.part' '.skill-downloads/voice-over-and-narration-audio-mvda870o/SKILL.md'2. Check prerequisites
Read SKILL.md before using it. If it references scripts or external services, inspect them and prepare the required access in your test environment.
No recognized prerequisites section in this file. This does not mean it is self-contained: libraries, tools and access requirements may be mentioned elsewhere in the content or source repository.
The platforms on this page are catalog indications. The paths below follow tool documentation; they do not prove this skill has been run in those tools. No minimum tool version is confirmed for this listing.
3. Load the skill
After inspection, copy the complete folder into your project using one of the commands below, then open a new tool session. The command stops if a folder with the same name already exists: compare the files before replacing it.
Claude Code
test -f '.skill-downloads/voice-over-and-narration-audio-mvda870o/SKILL.md' && test -s '.skill-downloads/voice-over-and-narration-audio-mvda870o/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/voiceover' && cp -R '.skill-downloads/voice-over-and-narration-audio-mvda870o' '.claude/skills/voiceover'Codex
test -f '.skill-downloads/voice-over-and-narration-audio-mvda870o/SKILL.md' && test -s '.skill-downloads/voice-over-and-narration-audio-mvda870o/SKILL.md' && mkdir -p '.agents/skills' && test ! -e '.agents/skills/voiceover' && cp -R '.skill-downloads/voice-over-and-narration-audio-mvda870o' '.agents/skills/voiceover'OpenSkills
OpenSkills must already be installed. The local install/read procedure is checked with OpenSkills 1.5.0, which requires Node.js ≥ 20.6.0. Catalog slugs are not resolved automatically.
Official OpenSkills installationopenskills install './.skill-downloads/voice-over-and-narration-audio-mvda870o'openskills read 'voice-over-and-narration-audio-mvda870o'Reading should display the installed file content and its base directory. It does not run the skill or install its dependencies.
For an agent that reads AGENTS.md, then sync the index. This command changes AGENTS.md: review the diff before using it.
openskills syncManual method or another tool: attach SKILL.md to a conversation, or open it in an agent that can read files. Include any required supporting resources. No universal folder is recognized by every tool.
4. Try a first task
Use a short, synthetic input: an API endpoint, a small document or an interface brief. In a new conversation, attach the file or give the agent its path, then adapt this request:
Read .skill-downloads/voice-over-and-narration-audio-mvda870o/SKILL.md and apply its instructions to this example: [describe a test input]. Identify any missing files, dependencies or access. Produce the result requested by the skill without inventing data or running unreviewed scripts.Expected result: output matching the skill instructions, or a precise list of missing prerequisites. A read confirmation alone does not validate a first use. If an external resource is unavailable, that path remains untested.
Writing Fragments
Content
Mine raw writing fragments through a relentless interview, without imposing structure. Capture ideas, quotes, and leading words for later use.
UI Copywriting & Auditing
Content
Write or audit user-facing UI copy including buttons, errors, empty states, and tooltips across the monorepo, following the design system source of truth.
Music MIDI Extraction
Content
Extracts the MIDI or score from an existing music production via the CogMusic MCP tool and confirms availability.