Edit raw customer testimonial videos into polished social clips with AI-driven content selection, speaker intro cards, captions, and multi-format output (square + vertical). Cuts long testimonials to the best 30-90 seconds.
Testimonial Video 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 (square + vertical). It includes 2 files and works well with social-proof-builder.
---
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 |
SKILL.mdmanifest.yamlLGJ-graphics
Lead Gen Jay brand illustration style system — flat SVG with floating UI elements, 30 brand logos, shared component library, Framer Motion animations, and consistent design tokens
brand-image-generator
Generate brand-consistent images using fal
google-tracking
Configure Google tracking (GTM, GA4, tag scanning) and the full tracking infrastructure for Lead Gen Jay pages
hyros-integration
Add Hyros conversion tracking to opt-in forms, checkout pages, and landing pages
landing-page-auditor
Systematic conversion audits with scoring and prioritized recommendations
motion-graphics
Business-focused motion graphics for landing pages
social-proof-builder
Craft compelling testimonials, case studies, and trust elements that convert
OpenClaw Mastery Pack
Complete OpenClaw skill stack — 8 skills covering setup, Google/Slack integration, security hardening, cron automation, MCP servers, troubleshooting, and custom skill building
Enter your AI Automation Insiders email to get full access to documentation and the install command.
Lead Gen Jay brand illustration style system — flat SVG with floating UI elements, 30 brand logos, shared component library, Framer Motion animations, and consistent design tokens.
Generate brand-consistent images using fal.ai FLUX.1. Prompt templates for hero images, feature graphics, testimonial photos, and marketing visuals.
Configure Google tracking (GTM, GA4, tag scanning) and the full tracking infrastructure for Lead Gen Jay pages.
Add Hyros conversion tracking to opt-in forms, checkout pages, and landing pages. Server-side lead tracking via API, client-side checkout intent, and Whop purchase integration.
Systematic conversion audits with scoring and prioritized recommendations. Identify conversion blockers, CTA weaknesses, copy issues, and mobile problems.
Business-focused motion graphics for landing pages. Combines Lottie animations, Framer Motion components, and Remotion video generation for conversion-focused micro-interactions.
Craft compelling testimonials, case studies, and trust elements that convert. Templates for social proof sections, credibility builders, and result-driven narratives.
Complete OpenClaw skill stack — 8 skills covering setup, Google/Slack integration, security hardening, cron automation, MCP servers, troubleshooting, and custom skill building.
AI Automation Insiders members get unlimited access to all exclusive skills, commands, and agents — plus weekly updates.
Already a member? Scroll up to enter your email.