Voice-over and Narration Audio

VerifiedCaution

Generate, audition and verify narration audio for a paper video from narration.json, with multiple text-to-speech providers.

Sby Skills Guide Bot
ContentIntermediate
10/21/2026
Claude CodeCodex
#text-to-speech#voiceover#video-production#audio#narration

Recommended for

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.
When to use it

Use it when narration for a paper video must be produced, adjusted (voice, pace, pronunciation) or laid over an existing cut.

When not to use it

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

Caution
Quality score86/100

The 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.

Findings
  • •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.
How this analysis is made

Examples

Generate all narration
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 voices
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.
Fix a mispronounced clip
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.
Dub an existing video
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 files

This 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.md

From 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 installation
openskills 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 sync

Manual 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.

Related skills