Lead Gen Jay
Back to Skills Marketplace

Testimonial Edit

Skillv1.1

Edit raw customer testimonial videos into polished social clips with AI-driven content selection, speaker intro cards, captions, and multi-format output. Cuts long testimonials to the best 30-90 seconds.

Tagstestimonialvideo-editingsocial-clipscaptionscustomer-storiessocial-proofremotiondeepgram
Categoriescontentvideo

Testimonial Edit is a Claude Code skill. Edit raw customer testimonial videos into polished social clips with AI-driven content selection, speaker intro cards, captions, and multi-format output. It includes 2 files and works well with social-proof-builder.

Documentation

---
name: testimonial-edit
version: 1.0.0
description: "Edit testimonial videos into polished social clips. Triggers on: 'testimonial edit', 'edit testimonial', 'testimonial video', 'cut testimonial', 'testimonial clip', 'social proof video', 'customer video edit', 'case study video'."
---

# Testimonial Video Edit

Transform raw customer testimonial videos into polished, short social clips with AI-driven content selection, speaker intro cards, and multi-format output.

## When to Use

- User has a raw testimonial video (customer interview, case study, social proof)
- Need to cut down a long testimonial to the best 30-90 seconds
- Need multi-format output (square + vertical, or landscape + square)
- Need speaker name/title/company intro card overlay

## Before Starting

### Gather from User (ask if not provided)

| Context | Default | Why |
|---------|---------|-----|
| Video file path | (required) | Source testimonial |
| Speaker name | "Speaker" | Intro card + AI context |
| Speaker title | "" | Intro card subtitle |
| Speaker company | "" | Intro card subtitle |
| Caption style | pill | Professional testimonial default |
| Target duration | 30-60s | Social platform sweet spot |
| Auto-approve? | No | Show AI cuts for review first |

### Prerequisites

- FFmpeg installed (`brew install ffmpeg`)
- `DEEPGRAM_API_KEY` in `.env.local` (transcription)
- `ANTHROPIC_API_KEY` in `.env.local` (AI content selection)
- Remotion dependencies installed (`npm install`)

## Pipeline (10 Stages)

```
[1] PROBE ─→ [2] TRANSCRIBE ─→ [2.5] IDENTITY CHECK ─→ [3] AI SELECT ─→ [4] SILENCE ─→ [5] CROP
                                                              ↓ (review gate)
[6] APPLY EDITS ─→ [6.5] CAPTION REVIEW ─→ [7] ENHANCE ─→ [8] MANIFEST ─→ [9] RENDER ─→ [10] QA
```

| # | Stage | Tool | Output |
|---|-------|------|--------|
| 1 | Probe | ffprobe | Resolution, FPS, duration, aspect |
| 2 | Transcribe | Deepgram Nova-3 | Word-level timestamps |
| 2.5 | Identity Check | CLI output | Confirms name/title/company against transcript opening |
| 3 | AI Content Selection | Claude API | Scored snippets, keep/cut decisions |
| 4 | Silence Detection | FFmpeg silencedetect | Silence segments |
| 5 | Crop & Scale | FFmpeg crop/scale | Format-specific crops |
| 6 | Apply Edits | FFmpeg trim+concat | edited.mp4 + re-transcribe |
| 6.5 | AI Caption Review | Claude API | Corrected words, auto-fixes, uncertain items |
| 7 | Enhance Audio | FFmpeg filters | Denoised, EQ'd, compressed |
| 8 | Build Manifest | TypeScript | Remotion input props |
| 9 | Render | Remotion | Final MP4 (x2 formats) |
| 10 | QA | ffprobe + frame extract | Verification |

## Workflow

### Step 1: Gather Input

Ask the user for the video path, speaker info, and preferences. Then run:

```bash
tsx scripts/process-testimonial.ts <video-path> \
  --name "Ray Lee" \
  --title "CEO" \
  --company "Zero2.AI" \
  --caption-style pill
```

This runs stages 1-3 and pauses at the **interactive review gate**.

### Step 2: Review AI Content Selection

The pipeline outputs scored snippets to `snippets.json` and prints a summary:

```
  KEEP [9/10] (12.3-18.1s) We saw a 40% increase in qualified leads...
  CUT  [3/10] (0.0-4.2s)   Hi everyone, thanks for having me...
```

Present the AI's edit plan to the user. They can:
- Approve as-is → re-run with `--auto-approve`
- Adjust keepSegments in `snippets.json` → re-run with `--auto-approve`

### Step 3: Render

Once approved, the pipeline continues through stages 4-10 automatically:

```bash
tsx scripts/process-testimonial.ts <video-path> \
  --name "Ray Lee" \
  --title "CEO" \
  --company "Zero2.AI" \
  --caption-style pill \
  --auto-approve
```

### Step 4: QA

Pipeline auto-extracts QA frames. Open outputs in Preview:

```bash
open output/testimonials/<job-id>/output-square.mp4
open output/testimonials/<job-id>/output-vertical.mp4
```

### Step 5: Save to Nextcloud

Copy finished videos to `~/Nextcloud/Testimonials/` with descriptive titles:

```bash
mkdir -p ~/Nextcloud/Testimonials
cp output/testimonials/<job-id>/output-square.mp4 \
  ~/Nextcloud/Testimonials/"<Speaker Name> - <Company> Testimonial (Square).mp4"
cp output/testimonials/<job-id>/output-vertical.mp4 \
  ~/Nextcloud/Testimonials/"<Speaker Name> - <Company> Testimonial (Vertical).mp4"
```

Naming format: `Ray Lian - Sarah2.ai Testimonial (Square).mp4`. Nextcloud syncs automatically.

## Output Format (Adaptive)

| Input Aspect | Primary Output | Secondary Output |
|-------------|----------------|-----------------|
| Vertical (9:16) | 1080x1080 square | 1080x1920 vertical |
| Landscape (16:9) | 1920x1080 landscape | 1080x1080 square |
| Square (1:1) | 1080x1080 square | — |

Auto-detected from ffprobe. AI face detection (face-api.js 68-point landmarks) extracts a frame at 2s and computes crownY, chinY, faceCenterX, faceCenterY, leftEarX, rightEarX.

For vertical→square crops: the crop window is positioned so the **crown touches the top of the frame**. Full source width is preserved (no horizontal cropping, no blur background). This produces a tight, professional framing where the speaker's head fills the top of the square. Override with `--crop-y`.

## AI Content Selection Rules

### High-Value (Keep)
- Specific results: numbers, metrics, dollar amounts, timeframes
- Emotional impact: genuine enthusiasm, surprise, relief
- Social proof: client names, revenue figures, team adoption
- Problem/solution: "before" state, comparison to alternatives

### Low-Value (Cut First)
1. Introductions and sign-offs
2. Filler and hedging ("um", "you know", "I think maybe")
3. Repeated points (keep stronger version)
4. Tangents and off-topic segments
5. Generic praise without specifics
6. **Program pricing / cost details** — NEVER reveal what the customer paid to join (e.g. "$1,500", "entry price", "how much it costs"). This is proprietary sales info that should not appear in public testimonial clips.

### Sentence Completeness (Critical)
- Every kept segment MUST end on a complete thought
- If a sentence trails off mid-phrase ("I hope you believe...", "and he's really..."), either cut it or ensure it merges with the next segment
- The **last kept segment** is especially important — the video must end cleanly, not mid-sentence
- Review each kept segment's final words to confirm the thought is finished

### Constraints
- Achieve 50%+ reduction from original
- Minimum 20s output (configurable with `--min-duration`)
- Maximum 90s output (configurable with `--max-duration`)

## TestimonialIntroCard Component

| Property | Spec |
|----------|------|
| Background | Transparent (overlays video) |
| Name | Big Shoulders, 68px bold, white, uppercase |
| Title / Company | Manrope, 32px, #E0E0E0 |
| Accent bar | #ED0D51, 4px height, beneath name |
| Position | Always centered (both axes, all formats) |
| Animation | Fade in 0.3s + slide up 20px, hold, fade out 0.3s |
| Timing | Starts at 1s, duration 4s (configurable). Captions show alongside intro (NOT suppressed). |

## Brand System

| Element | Value |
|---------|-------|
| Background | #0D0D0D (near-black) |
| Accent | #ED0D51 (hot pink) |
| Headline font | Big Shoulders (bold, uppercase) |
| Body font | Manrope |
| Caption style | Pill (default for testimonials) |
| Caption safe zone | Bottom 15% |
| Music volume | 0.08 (lower than talking-head — voice clarity priority) |
| Audio normalization | -16 LUFS (two-pass loudnorm) |

## Audio Enhancement Pipeline

1. **FFT Denoise**: `afftdn=nr=12:nf=-25:tn=1`
2. **Highpass 80Hz**: Remove room rumble
3. **Lowpass 12kHz**: Remove hiss
4. **EQ 200Hz +1dB**: Warmth
5. **EQ 3kHz +2.5dB**: Clarity/presence
6. **EQ 6.5kHz -2dB**: De-essing
7. **Compressor**: Smooth dynamics
8. **Loudnorm**: -16 LUFS (two-pass with limiter)

## CLI Reference

```bash
tsx scripts/process-testimonial.ts <video-path> [options]

Options:
  --name "Speaker Name"     Speaker name for intro card (required)
  --title "CEO"             Speaker title
  --company "Acme Inc"      Speaker company
  --caption-style pill      Caption style (pill|pop|karaoke|tiktok|subtitle-bar)
  --no-captions             Skip captions entirely
  --no-music                Skip background music
  --no-silence-removal      Keep all silences
  --auto-approve            Skip interactive review of AI snippets
  --transcript <path>       Use existing transcript (skip Deepgram, saves ~$0.01)
  --crop-y <0-1>            Manual crop Y position (0=top, default: 0.25)
  --min-duration <sec>      Minimum output duration (default: 20)
  --max-duration <sec>      Maximum output duration (default: 90)
  --output <dir>            Custom output directory
  --render-only <manifest>  Skip to render with existing manifest
```

## Output Directory Structure

```
output/testimonials/<job-id>/
  transcript.json           — Word-level transcript (Deepgram)
  transcript-edited.json    — Re-transcribed after edits
  transcript-reviewed.json  — AI-reviewed captions (corrected words)
  snippets.json             — AI content selection (scores + reasons)
  edited.mp4                — Trimmed video (AI cuts + silence removal)
  enhanced.mp4              — Audio-enhanced version
  cropped-square.mp4        — Cropped for square format
  cropped-vertical.mp4      — Cropped for vertical format (if vertical input)
  manifest-square.json      — Remotion manifest (square)
  manifest-vertical.json    — Remotion manifest (vertical)
  output-square.mp4         — Final rendered square (1080x1080)
  output-vertical.mp4       — Final rendered vertical (1080x1920)
  qa/                       — QA verification frames
```

## Cost Estimate

| Stage | Service | Cost |
|-------|---------|------|
| Transcribe | Deepgram Nova-3 | ~$0.01 (3min video) |
| AI Selection | Claude Sonnet | ~$0.02 |
| Caption Review | Claude Haiku | ~$0.005 |
| Render | Local (Remotion) | Free |
| **Total** | | **~$0.03/video** |

## Autonomy Rules

- Don't ask permission between pipeline stages (except the AI review gate)
- Auto-detect aspect ratio — only ask if ambiguous (very close to 1:1)
- Default to `pill` captions for testimonials (professional, clean)
- Always pause at AI content selection for review unless `--auto-approve`
- Skip re-transcription if `--transcript` provided
- If video is already under 30s, skip AI content selection entirely

## Known Gotchas

| Issue | Root Cause | Fix |
|-------|-----------|-----|
| **0% reduction / 1 giant sentence** | Deepgram word-level data has bare words (no punctuation). Punctuation-based sentence splitting (`/[.!?]$/`) never matches. | Use pause-based splitting (gaps > 0.7s between words) + 30-word safety cap. Already fixed in `testimonial-analyzer.ts`. |
| **Wrong speaker name on intro card** | Deepgram phonetically transcribes names — "Ray Lian" becomes "ray leon", "Sarah2.ai" becomes "serra two dot a i". Must verify against transcript. | Pipeline shows identity check (stage 2.5) when not using `--auto-approve`. Always compare transcript opening against `--name` / `--company` flags. |
| **Program pricing leaks into clip** | Customers often mention what they paid ("$1,500", "entry price"). This is proprietary sales info. | AI analyzer prompt has explicit rule to cut all pricing/cost segments. |
| **Last sentence trails off mid-thought** | Pause-based chunking can split mid-sentence if there's a brief pause. Last segment is most visible. | AI analyzer prompt enforces sentence completeness — especially for the final kept segment. |
| **Captions hidden during intro card** | Previous implementation suppressed captions for first 5s. User wants captions visible alongside intro. | Caption opacity wrapper removed from `index.tsx`. Captions render from frame 0. |
| **Stale snippets.json reused** | `--auto-approve` loads existing `snippets.json` if present. After changing analyzer rules, old snippets persist. | Delete `snippets.json` before re-running when analyzer logic changes. |

## Files

| File | Purpose |
|------|---------|
| `scripts/process-testimonial.ts` | Main pipeline orchestrator |
| `lib/video/testimonial-analyzer.ts` | Claude API content scoring |
| `lib/video/caption-review.ts` | AI caption review — fixes STT errors, flags uncertain names |
| `lib/video/face-detection.ts` | face-api.js 68-point landmark detection → FacePosition |
| `lib/video/testimonial-crop.ts` | FFmpeg crop/scale (crown-at-top for vertical→square) + edit plan |
| `remotion/compositions/talking-head/components/testimonial-intro-card.tsx` | Speaker intro overlay |
| `remotion/compositions/talking-head/schemas/manifest.ts` | Extended with TestimonialIntroConfig |
| `remotion/compositions/talking-head/index.tsx` | Renders TestimonialIntroCard layer |

### Reused (not modified)

| File | What |
|------|------|
| `lib/video/transcribe.ts` | Deepgram Nova-3 transcription |
| `lib/video/silence-detection.ts` | Silence detection |
| `scripts/render-short.ts` | Remotion rendering + loudnorm |

Install

curl -sL 'https://leadgenjay.com/api/skills/install.sh?items=testimonial-edit' | bash

Files

SKILL.md
manifest.yaml
View on GitHub

Want premium skills?

AI Automation Insiders includes 47+ exclusive skills, agents, and components.

See What's Included