# Vc Voiceover Script

> Turn a reference video (style you want to copy) plus a Vantage Circle topic/product angle into an original voiceover script and a two-column (voiceover left, screen ideas right) production sheet artifact. Use when the user shares a YouTube link and says "make something like this for Vantage Circle," or asks for a video script, shot list, screen ideas, or production sheet.

- Skill: `prawal-bhuyan/vc-voiceover-script` (Agent Skill)
- Install (CLI): `npx skillmds@latest add prawal-bhuyan/vc-voiceover-script`
- Raw SKILL.md: https://api.skillmd.com/api/skills/prawal-bhuyan/vc-voiceover-script/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: Prawal-Bhuyan (https://skillmd.com/u/prawal-bhuyan)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/prawal-bhuyan/vc-voiceover-script

---


## What this skill produces

Given a reference video (a link the user liked the style of) and a Vantage Circle topic or product angle, produce:
1. An **original** voiceover script that borrows the reference's structural technique and pacing — never its sentences.
2. A **two-column HTML production sheet** (voiceover left / screen ideas right, timecoded) built from the template below.

## Step 1 — Understand the reference, don't just fetch it

YouTube pages are JS-rendered shells — `WebFetch` on a `youtube.com/watch` URL only returns nav/footer, never the transcript. Getting real signal takes two passes:
- `WebFetch` the oembed endpoint for title/channel: `https://www.youtube.com/oembed?url=<video_url>&format=json` — gives title + channel name reliably.
- `WebSearch` the title + channel for context (series name, sponsor, publish date, general subject).

This gets you metadata, not structure. **If the user wants the actual rhetorical structure copied (hook, pacing, central metaphor, sponsor pivot), ask them to paste the transcript** rather than guessing from a title — a prior session guessed from genre conventions and it was wrong until the user pasted the real transcript.

## Step 2 — Extract structure, not sentences

Once you have the real transcript, identify:
- **The hook** (first 10-15 sec device)
- **The reframe** (why the obvious fear/assumption is wrong)
- **The central throughline device** (a dichotomy, a metaphor, a recurring visual/verbal callback — whatever organizing idea the writer used)
- **The concrete examples** used to prove the point
- **The pivot** into product/sponsor — note exactly how it transitions (tone shift, framing move) since this is the hardest part to make feel natural
- **The outro** (CTA style, pace change)

Do **not** reuse the reference's actual phrases, character names, or parallel sentence structures ("There has never been a better time to be a ___", "picture two types of ___", etc.) with nouns swapped — that reads as a reskin, not an original script. **A prior session did exactly this and the user caught it immediately.** The fix: keep the *technique* (e.g., "one throughline metaphor," "reframe then contrast two archetypes," "specific examples before the abstract point"), invent fresh wording, a fresh central device, and fresh examples grounded in the actual VC topic.

## Step 3 — Write the VC script

- Confirm target runtime with the user (default: ask; don't assume 90 sec vs 4 min vs longer).
- ~150 words/minute for a natural pace, but pacing devices (holds, pauses) can stretch it — write to the low end of the target and let cut rhythm fill the rest.
- Tie the payoff/pivot to a specific Vantage Circle product angle (R&R, engagement, pulse surveys, etc.) — confirm which one if not stated.
- **Confirm host vs. voiceover-only before writing screen directions.** VC has produced voiceover + b-roll only (no on-camera host) before, but don't assume it's always the case — ask.

## Step 4 — Break into timed beats

Match the reference's cut frequency (ask, or infer from the transcript's pacing — e.g. a "fast" reference cuts every 2-4 sec even mid-sentence). Break the script into one row per beat: timecode, the voiceover phrase spoken during that beat, and the specific visual for it. Flag any deliberate **hold beats** (a pull-quote moment, a tone-shift into the product pivot, an outro slowdown) — these are the moments that should NOT follow the fast-cut rule, and calling them out explicitly stops an editor from cutting through them by default.

## Step 5 — Build the production sheet artifact

Use the HTML template below as the base (already validated with a real script in production). Fill in the `<tbody>` rows; keep the token system, fonts, and layout — they're deliberately chosen (serif italic for voiceover = "spoken word" feel, sans for screen directions = "technical note" feel, monospace tabular timecodes, a warm paper ground with a gold/recognition accent, hold-beat badges in the accent color). Adjust the accent hue only if the topic calls for a different mood.

Publish via the `Artifact` tool with `favicon: "🎬"`.

```html
<title>{{VIDEO_TITLE}} — Production Sheet</title>
<style>
  :root {
    --paper: #f2efe8;
    --vo-tint: #f6f3ea;
    --screen-tint: #ecefe9;
    --ink: #1c2321;
    --ink-soft: #5b665f;
    --accent: #a8763a;
    --accent-soft: rgba(168, 118, 58, 0.13);
    --line: #d9d3c2;
    --line-strong: #c7bfa8;
  }
  @media (prefers-color-scheme: dark) {
    :root {
      --paper: #1a1c19; --vo-tint: #1e211d; --screen-tint: #202320;
      --ink: #ece8de; --ink-soft: #9ba299; --accent: #dba658;
      --accent-soft: rgba(219, 166, 88, 0.16); --line: #34372f; --line-strong: #454a3f;
    }
  }
  :root[data-theme="dark"] {
    --paper: #1a1c19; --vo-tint: #1e211d; --screen-tint: #202320;
    --ink: #ece8de; --ink-soft: #9ba299; --accent: #dba658;
    --accent-soft: rgba(219, 166, 88, 0.16); --line: #34372f; --line-strong: #454a3f;
  }
  :root[data-theme="light"] {
    --paper: #f2efe8; --vo-tint: #f6f3ea; --screen-tint: #ecefe9;
    --ink: #1c2321; --ink-soft: #5b665f; --accent: #a8763a;
    --accent-soft: rgba(168, 118, 58, 0.13); --line: #d9d3c2; --line-strong: #c7bfa8;
  }
  * { box-sizing: border-box; }
  body { margin: 0; background: var(--paper); color: var(--ink);
    font-family: Georgia, "Iowan Old Style", "Palatino Linotype", serif; line-height: 1.5; }
  .wrap { max-width: 980px; margin: 0 auto; padding: 2.5rem 1.5rem 4rem; }
  header { margin-bottom: 2rem; padding-bottom: 1.5rem; border-bottom: 2px solid var(--line-strong); }
  .eyebrow { font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; font-size: 0.72rem;
    letter-spacing: 0.14em; text-transform: uppercase; color: var(--accent); margin: 0 0 0.6rem; }
  h1 { font-size: clamp(1.7rem, 4vw, 2.4rem); margin: 0 0 0.65rem; text-wrap: balance;
    font-weight: 400; letter-spacing: -0.01em; }
  .meta { display: flex; flex-wrap: wrap; gap: 0.4rem 1.4rem;
    font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; font-size: 0.82rem; color: var(--ink-soft); }
  .meta span b { color: var(--ink); font-weight: 600; }
  .table-scroll { overflow-x: auto; border: 1px solid var(--line-strong); border-radius: 3px; }
  table { width: 100%; border-collapse: collapse; min-width: 720px; }
  thead th { position: sticky; top: 0; background: var(--paper); border-bottom: 2px solid var(--line-strong);
    text-align: left; padding: 0.7rem 1rem; font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
    font-size: 0.7rem; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-soft);
    font-weight: 600; z-index: 1; }
  th.col-tc { width: 78px; } th.col-vo { width: 44%; }
  td { padding: 0.85rem 1rem; border-bottom: 1px solid var(--line); vertical-align: top; font-size: 0.96rem; }
  tr:last-child td { border-bottom: none; }
  td.tc { font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; font-variant-numeric: tabular-nums;
    font-size: 0.78rem; color: var(--ink-soft); background: var(--paper); white-space: nowrap; }
  td.vo { background: var(--vo-tint); font-style: italic; }
  td.screen { background: var(--screen-tint); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
    font-style: normal; font-size: 0.9rem; color: var(--ink); }
  .beat { display: inline-block; font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; font-size: 0.66rem;
    letter-spacing: 0.06em; text-transform: uppercase; color: var(--accent); background: var(--accent-soft);
    padding: 0.15rem 0.45rem; border-radius: 2px; margin-bottom: 0.4rem; }
  .continued { color: var(--ink-soft); font-size: 0.85rem; }
  footer { margin-top: 1.5rem; font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
    font-size: 0.78rem; color: var(--ink-soft); }
  @media (max-width: 600px) { td, th { padding: 0.6rem 0.7rem; font-size: 0.88rem; } }
</style>
<div class="wrap">
  <header>
    <p class="eyebrow">Vantage Circle · Production Sheet</p>
    <h1>{{VIDEO_TITLE}}</h1>
    <div class="meta">
      <span>Format: <b>{{FORMAT}}</b></span>
      <span>Runtime: <b>{{RUNTIME}}</b></span>
      <span>Pace: <b>{{PACE_NOTE}}</b></span>
    </div>
  </header>
  <div class="table-scroll">
    <table>
      <thead><tr><th class="col-tc">TC</th><th class="col-vo">Voiceover</th><th>Screen / B-roll</th></tr></thead>
      <tbody>
        <!-- one row per beat:
        <tr><td class="tc">0:00</td><td class="vo">{{line}}</td><td class="screen">{{visual}}</td></tr>
        for a hold/tone-shift beat, prefix the screen cell with:
        <span class="beat">Hold Beat</span><br>{{visual}}
        -->
      </tbody>
    </table>
  </div>
  <footer>{{N}} beats · cut every {{X}}–{{Y}} sec · hold-beats marked above</footer>
</div>
```

## Gotchas learned in production

- Don't claim to have watched a video you only fetched metadata for — say plainly what you could and couldn't verify.
- Don't reskin the reference's actual sentences — extract technique, write fresh content.
- A recurring visual motif (a graphic that opens, changes, and pays off again near the end) gives a host-less voiceover+b-roll video the continuity a human host would otherwise provide — reach for one by default when there's no host.

