Skill: ivangdavila/video-captions (version 1.0.1)

--- name: Video Captions slug: video-captions version: 1.0.1 homepage: https://clawic.com/skills/video-captions description: Generate professional captions and subtitles with multi-engine transcription, word-level timing, styling presets, and burn-in. changelog: Declared optional cloud API env vars in metadata to clarify that cloud engines require user-provided keys metadata: {"clawdbot":{"emoji":"🎬","requires":{"bins":["ffmpeg","whisper"],"env":{"optional":["ASSEMBLYAI_API_KEY","DEEPGRAM_API_KEY"]}},"os":["linux","darwin"]}} --- ## When to Use User needs captions or subtitles for video content. Agent handles transcription, timing, formatting, styling, translation, and burn-in across all major formats and platforms. ## Quick Reference | Topic | File | |-------|------| | Transcription engines | `engines.md` | | Output formats | `formats.md` | | Styling presets | `styling.md` | | Platform requirements | `platforms.md` | ## Core Rules ### 1. Engine Selection by Context | Scenario | Engine | Why | |----------|--------|-----| | Default (recommended) | Whisper local | 100% offline, no data leaves machine | | Apple Silicon | MLX Whisper | Native acceleration, still local | | Word timestamps | whisper-timestamped | DTW alignment, still local | Default: Whisper local (turbo model). See `engines.md` for optional cloud alternatives. ### 2. Format Selection by Platform | Platform | Format | Notes | |----------|--------|-------| | YouTube | VTT or SRT | VTT preferred | | Netflix/Pro | TTML | Strict timing rules | | Social (TikTok, IG) | Burn-in (ASS) | Embedded in video | | General | SRT | Universal compatibility | | Karaoke/effects | ASS | Advanced styling | Ask user's target platform if not specified. ### 3. Professional Timing Standards **Netflix-compliant (default):** - Min duration: 5/6 second (0.833s) - Max duration: 7 seconds - Max chars/line: 42 - Max lines: 2 - Gap between subtitles: 2+ frames **Social media:** - Shorter segments (2-4 words) - More frequent breaks - Centered or dynamic positioning ### 4. Segmentation Rules Break lines: - After punctuation marks - Before conjunctions (and, but, or) - Before prepositions Never separate: - Article from noun - Adjective from noun - First name from last name - Verb from subject pronoun - Auxiliary from verb ### 5. Word-Level Timestamps Use word timestamps for: - Karaoke-style highlighting - Precise sync verification - TikTok/Instagram animated captions - Quality checking transcript accuracy Enable with `--word-timestamps` flag. ### 6. Speaker Identification For multi-speaker content: - Use diarization (pyannote local, or cloud APIs if configured) - Format: `[Speaker 1]` or `[Name]` if known - SDH format: `JOHN: What do you think?` ### 7. Quality Verification Before delivering: - Check sync at start, middle, end - Verify character limits per line - Confirm speaker labels if multi-speaker - Test burn-in render quality ## Workflow ### Basic Transcription ```bash # Auto-detect language, output SRT whisper video.mp4 --model turbo --output_format srt # Specify language whisper video.mp4 --model turbo --language es --output_format srt # Multiple formats whisper video.mp4 --model turbo --output_format all ``` ### Word-Level Timestamps ```bash # Using whisper-timestamped whisper_timestamped video.mp4 --model large-v3 --output_format srt # With VAD pre-processing (reduces hallucinations) whisper_timestamped video.mp4 --vad silero --accurate ``` ### Styled Subtitles (ASS) ```bash # Generate SRT first, then convert with style ffmpeg -i video.mp4 -vf "subtitles=video.srt:force_style='FontName=Arial,FontSize=24,PrimaryColour=&HFFFFFF,OutlineColour=&H000000,Outline=2,Shadow=1,Alignment=2'" output.mp4 ``` ### Burn-In for Social Media ```bash # TikTok/Instagram style (centered, bold) ffmpeg -i video.mp4 -vf "subtitles=video.srt:force_style='FontName=Montserrat-Bold,FontSize=32,PrimaryColour=&HFFFFFF,OutlineColour=&H000000,Outline=3,Shadow=0,Alignment=10,MarginV=50'" output.mp4 # Netflix style (bottom, clean) ffmpeg -i video.mp4 -vf "subtitles=video.srt:force_style='FontName=Netflix Sans,FontSize=48,PrimaryColour=&HFFFFFF,OutlineColour=&H000000,Outline=2,Shadow=1,Alignment=2'" output.mp4 ``` ### Translation ```bash # Transcribe + translate to English whisper video.mp4 --model turbo --task translate --output_format srt ``` ### Format Conversion ```bash # SRT to VTT ffmpeg -i video.srt video.vtt # SRT to ASS (for styling) ffmpeg -i video.srt video.ass ``` ## Caption Traps - **Hallucinations on silence** → Use VAD pre-processing or trim silent sections - **Wrong language detection** → Specify `--language` explicitly for mixed content - **Timing drift in long videos** → Use word timestamps + manual spot-check - **Character limit violations** → Set `--max_line_width 42` for Netflix compliance - **Missing speaker IDs** → Enable diarization for multi-speaker content - **Burn-in quality loss** → Use high bitrate output (`-b:v 8M`) ## Common Scenarios ### YouTube Video 1. Transcribe: `whisper video.mp4 --output_format vtt` 2. Upload .vtt to YouTube Studio 3. Review auto-sync suggestions ### TikTok/Instagram Reel 1. Transcribe with word timestamps 2. Apply bold animated style 3. Burn-in: `ffmpeg -i video.mp4 -vf "subtitles=video.ass" -c:a copy output.mp4` 4. Export at platform resolution ### Netflix/Professional 1. Use Whisper large-v3 for best local accuracy 2. Export TTML format 3. Verify: 42 chars/line, 2 lines max, timing gaps 4. Include translator credit as last subtitle ### Podcast/Interview 1. Enable speaker diarization 2. Format as dialogue: `[SPEAKER]: text` 3. SDH option: include `[music]`, `[laughter]` descriptions ### Foreign Film Translation 1. Transcribe in original language 2. Translate: `--task translate` for English 3. Or use external translation + timing sync ## External Endpoints **Default: 100% LOCAL processing. No network calls.** | Endpoint | Data Sent | When Used | |----------|-----------|-----------| | Whisper (local) | None (local) | Default — always | | api.assemblyai.com | Audio file | Only if user sets ASSEMBLYAI_API_KEY | | api.deepgram.com | Audio file | Only if user sets DEEPGRAM_API_KEY | Cloud APIs are **documented as alternatives** but never used unless user explicitly provides API keys and requests cloud processing. By default, all processing stays on your machine. ## Security & Privacy **Default workflow is 100% offline:** - Whisper runs locally on your machine - Generated subtitle files stay local - Burned-in videos stay local - No network calls made **Cloud APIs are OPTIONAL and OPT-IN:** - Only used if you set `ASSEMBLYAI_API_KEY` or `DEEPGRAM_API_KEY` - Only triggered when you explicitly use cloud engine commands - If you never set these keys, no audio ever leaves your machine **This skill does NOT:** - Upload anything by default - Require internet connection for basic use - Store data externally ## Related Skills Install with `clawhub install <slug>` if user confirms: - `ffmpeg` — video/audio processing - `video` — general video tasks - `video-edit` — video editing - `audio` — audio processing ## Feedback - If useful: `clawhub star video-captions` - Stay updated: `clawhub sync`

path: engines.md
content: # Transcription Engines — Video Captions

## Local Engines (No Data Leaves Machine)

### OpenAI Whisper

**Best for:** General use, offline, privacy-sensitive

```bash
# Installation
pip install openai-whisper

# Models (quality vs speed)
# tiny    → fastest, lowest quality
# base    → fast, decent quality  
# small   → balanced
# medium  → good quality
# large-v3 → best quality, slow
# turbo   → excellent quality, fast (RECOMMENDED)

whisper video.mp4 --model turbo --output_format srt
```

| Model | VRAM | Speed | Quality |
|-------|------|-------|---------|
| tiny | 1GB | 32x | Basic |
| base | 1GB | 16x | Decent |
| small | 2GB | 6x | Good |
| medium | 5GB | 2x | Very good |
| large-v3 | 10GB | 1x | Excellent |
| turbo | 6GB | 8x | Excellent |

### MLX Whisper (Apple Silicon)

**Best for:** Mac M1/M2/M3, native acceleration

```bash
# Installation
pip install mlx-whisper

# Usage (same API as whisper)
mlx_whisper video.mp4 --model mlx-community/whisper-turbo
```

### whisper-timestamped

**Best for:** Word-level timestamps, karaoke effects

```bash
# Installation
pip install whisper-timestamped

# Usage
whisper_timestamped video.mp4 --model large-v3 --output_format srt

# With VAD (Voice Activity Detection) - reduces hallucinations
whisper_timestamped video.mp4 --vad silero --accurate
```

**Advantages:**
- Word-level timestamps via DTW alignment
- Confidence scores per word
- VAD pre-processing option
- Better segment boundary detection

### stable-ts

**Best for:** Improved timestamp accuracy, refinement

```bash
# Installation
pip install stable-ts

# Usage
stable-ts video.mp4 --model turbo -o video.srt

# Refine existing SRT
stable-ts video.mp4 --refine video.srt -o video_refined.srt
```

---

## Cloud APIs (Higher Accuracy, Costs Money)

### AssemblyAI

**Best for:** Maximum accuracy, speaker diarization

```bash
# Requires ASSEMBLYAI_API_KEY
export ASSEMBLYAI_API_KEY=your_key

# Via CLI or Python SDK
assemblyai transcribe video.mp4 --output video.srt --speaker_labels
```

**Features:**
- Best-in-class accuracy
- Speaker diarization built-in
- Auto punctuation and casing
- Custom vocabulary
- Content moderation

**Pricing:** ~$0.25-0.65/hour depending on features

### Deepgram

**Best for:** Speed, real-time, cost efficiency

```bash
# Requires DEEPGRAM_API_KEY
curl -X POST "https://api.deepgram.com/v1/listen?model=nova-2" \
  -H "Authorization: Token $DEEPGRAM_API_KEY" \
  -H "Content-Type: audio/mp4" \
  --data-binary @video.mp4
```

**Features:**
- Fastest processing (~25% of real-time)
- Nova-2 model excellent accuracy
- Diarization, smart formatting
- Real-time streaming option

**Pricing:** ~$0.01/minute (Nova-2)

---

## Engine Decision Matrix

| Priority | Recommended Engine |
|----------|-------------------|
| Privacy/Offline | Whisper local (turbo) |
| Best accuracy | AssemblyAI |
| Speed | Deepgram Nova-2 |
| Word timestamps | whisper-timestamped |
| Apple Silicon | MLX Whisper |
| Budget | Whisper local |
| Real-time | Deepgram streaming |
| Speaker ID | AssemblyAI or pyannote+Whisper |

---

## Language Support

Whisper supports 99 languages. Common codes:
- `en` English
- `es` Spanish
- `zh` Chinese (Mandarin)
- `ja` Japanese
- `ko` Korean
- `de` German
- `fr` French
- `pt` Portuguese
- `ar` Arabic
- `hi` Hindi

Auto-detection works well for single-language content. Specify `--language` for:
- Code-switching (multiple languages)
- Low-resource languages
- Accented speech


path: formats.md
content: # Output Formats — Video Captions

## SRT (SubRip)

**Use for:** Universal compatibility, editing, YouTube upload

```srt
1
00:00:01,000 --> 00:00:04,500
This is the first subtitle line.

2
00:00:05,000 --> 00:00:08,500
This is the second subtitle.
```

**Features:**
- Most widely supported
- Simple text format
- Easy to edit manually
- No styling (plain text only)

**Supported by:** VLC, YouTube, Vimeo, Premiere, DaVinci, all players

---

## VTT (WebVTT)

**Use for:** Web/HTML5, YouTube (preferred), modern platforms

```vtt
WEBVTT

00:00:01.000 --> 00:00:04.500
This is the first subtitle line.

00:00:05.000 --> 00:00:08.500
This is the second subtitle.
```

**Features:**
- HTML5 native
- Supports basic styling (bold, italic, color)
- Positioning cues
- Chapter markers

**Styling example:**
```vtt
WEBVTT

STYLE
::cue {
  color: white;
  background-color: rgba(0,0,0,0.8);
}

00:00:01.000 --> 00:00:04.500
<v Speaker1>Hello there!</v>

00:00:05.000 --> 00:00:08.500 position:10%,line-left
Positioned subtitle.
```

---

## ASS/SSA (Advanced SubStation Alpha)

**Use for:** Styled captions, karaoke, anime, TikTok effects, burn-in

```ass
[Script Info]
Title: Video Captions
ScriptType: v4.00+
PlayResX: 1920
PlayResY: 1080

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,48,&H00FFFFFF,&H000000FF,&H00000000,&H64000000,-1,0,0,0,100,100,0,0,1,2,1,2,10,10,50,1

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:01.00,0:00:04.50,Default,,0,0,0,,This is a styled subtitle.
```

**Style Parameters:**
- `PrimaryColour` - Text color (&HAABBGGRR format)
- `OutlineColour` - Border color
- `Outline` - Border thickness (pixels)
- `Shadow` - Shadow distance
- `Alignment` - Position (1-9 numpad layout)
- `MarginV` - Vertical margin from edge

**Alignment positions:**
```
7 8 9  (top)
4 5 6  (middle)
1 2 3  (bottom)
```

**Effects available:**
- `\blur` - Gaussian blur
- `\bord` - Border size
- `\shad` - Shadow
- `\fad(in,out)` - Fade timing
- `\k` - Karaoke timing
- `\pos(x,y)` - Exact position
- `\move(x1,y1,x2,y2)` - Animation

---

## TTML (Timed Text Markup Language)

**Use for:** Netflix, broadcast, professional delivery

```xml
<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="http://www.w3.org/ns/ttml">
  <body>
    <div>
      <p begin="00:00:01.000" end="00:00:04.500">
        This is the first subtitle.
      </p>
      <p begin="00:00:05.000" end="00:00:08.500">
        This is the second subtitle.
      </p>
    </div>
  </body>
</tt>
```

**Netflix requirements:**
- Use percentage values (not pixels)
- fontSize: 100%
- Only NETFLIX Glyph List characters

---

## JSON (Structured Data)

**Use for:** Custom processing, word-level data, APIs

```json
{
  "text": "Hello, this is a transcription.",
  "segments": [
    {
      "id": 0,
      "start": 0.0,
      "end": 2.5,
      "text": "Hello, this is",
      "words": [
        {"word": "Hello,", "start": 0.0, "end": 0.5},
        {"word": "this", "start": 0.6, "end": 0.8},
        {"word": "is", "start": 0.9, "end": 1.0}
      ]
    }
  ],
  "language": "en"
}
```

**Use cases:**
- Custom caption rendering
- Word-level highlighting
- Data analysis
- Integration with video editors

---

## Format Conversion

```bash
# SRT to VTT
ffmpeg -i input.srt output.vtt

# SRT to ASS
ffmpeg -i input.srt output.ass

# VTT to SRT
ffmpeg -i input.vtt output.srt

# Extract embedded subtitles from video
ffmpeg -i video.mkv -map 0:s:0 output.srt
```

---

## Platform Format Matrix

| Platform | Primary | Alternative | Notes |
|----------|---------|-------------|-------|
| YouTube | VTT | SRT | VTT has more features |
| Netflix | TTML | - | Strict compliance required |
| Vimeo | VTT | SRT | - |
| TikTok | Burn-in (ASS) | - | No external subtitle support |
| Instagram | Burn-in (ASS) | - | Reels need embedded |
| Premiere Pro | SRT | - | Native import |
| DaVinci | SRT | VTT | - |
| Final Cut | SRT | - | - |
| Web/HTML5 | VTT | - | Native `<track>` element |


path: platforms.md
content: # Platform Requirements — Video Captions

## YouTube

**Format:** VTT (preferred) or SRT

**Upload methods:**
1. Auto-generate: YouTube creates captions automatically
2. Manual upload: Upload .vtt/.srt file in Studio
3. Type manually: Use YouTube caption editor

**Character limits:**
- No strict limit per line (but 42 recommended)
- Auto-wraps based on player size

**Best practices:**
- Include punctuation and capitalization
- Add speaker labels for multi-person content
- Timestamp within 1 frame of speech
- Use VTT for styling control

**Upload path:**
1. YouTube Studio → Video → Subtitles
2. Add language → Upload file
3. Choose "With timing" for SRT/VTT

---

## Netflix

**Format:** TTML (Timed Text Markup Language)

**Strict requirements:**
- Min duration: 5/6 second (0.833s)
- Max duration: 7 seconds
- Max 42 characters per line
- Max 2 lines per subtitle
- 2+ frame gap between subtitles

**Line breaks - DO:**
- After punctuation marks
- Before conjunctions
- Before prepositions

**Line breaks - DON'T:**
- Separate article from noun
- Separate adjective from noun
- Separate first name from last name
- Separate verb from subject pronoun

**Translator credit:**
- Required as last subtitle event
- After copyright disclaimer
- Up to 5 seconds duration

**Technical:**
- Use percentage values (not pixels)
- fontSize: 100%
- Only Netflix Glyph List characters

---

## TikTok

**Format:** Burn-in only (no external subtitle support)

**Specifications:**
- Video resolution: 1080x1920 (9:16)
- Position: Center or upper-center (avoid bottom menu overlap)
- Font size: 28-36pt for mobile readability
- Duration: 2-4 words per segment (fast pacing)

**Style recommendations:**
- Bold fonts (Montserrat Bold, Impact)
- High contrast (white + black outline)
- Consider colored text for emphasis
- Word-by-word animation popular

**Safe zones:**
- Top 150px: Username/sounds
- Bottom 300px: Buttons/description
- Best text area: Center 70% of screen

**ffmpeg for TikTok:**
```bash
ffmpeg -i video.mp4 \
  -vf "subtitles=video.srt:force_style='FontName=Montserrat-Bold,FontSize=32,Alignment=10,MarginV=200,Outline=3'" \
  -c:a copy output.mp4
```

---

## Instagram Reels

**Format:** Burn-in only

**Specifications:**
- Same as TikTok (9:16)
- Slightly more conservative styling
- Consider brand consistency

**Auto-captions:**
- Instagram offers auto-generated captions
- Limited editing options
- Use "Captions" sticker

---

## Vimeo

**Format:** VTT or SRT

**Features:**
- Multiple language tracks supported
- Viewer can toggle on/off
- No burn-in required

**Upload:**
1. Video settings → Distribution → Subtitles
2. Upload file, select language

---

## Facebook/Meta

**Format:** SRT (preferred)

**Specifications:**
- Max 2 lines
- 35 characters per line (recommended)
- Auto-captions available but often inaccurate

**Upload:**
- Creator Studio → Subtitles → Upload SRT

---

## LinkedIn

**Format:** SRT

**Best practices:**
- Auto-captions available (enable in post settings)
- Upload SRT for accuracy
- Keep text concise (mobile viewing)

---

## Twitter/X

**Format:** Burn-in or platform auto-captions

**Notes:**
- Native auto-captions available
- Burn-in recommended for guaranteed visibility
- Short segments work best

---

## Broadcast/TV

**Format:** TTML, STL, or EBU-STL

**Requirements:**
- Very strict timing (frame-accurate)
- Specific font requirements
- Safe area compliance
- Teletext compatibility (some markets)

**Typically handled by:**
- Dedicated subtitling houses
- Broadcast engineers
- Specialized software (EZTitles, WinCAPS)

---

## Accessibility Standards

### FCC (US)
- 99% accuracy for pre-recorded content
- Real-time: Best efforts standard
- Required for broadcast/cable

### WCAG 2.1
- Level A: Captions for all prerecorded audio
- Level AA: Live captions where feasible
- Timing synchronized within 1 second

### SDH (Subtitles for Deaf and Hard-of-hearing)
- Include non-speech audio: [music], [laughter], [door closes]
- Speaker identification: JOHN:
- Sound descriptions in brackets

---

## Platform Comparison

| Platform | Format | Max Lines | Max Chars | Burn-in? |
|----------|--------|-----------|-----------|----------|
| YouTube | VTT/SRT | 2 | ~42 | Optional |
| Netflix | TTML | 2 | 42 | No |
| TikTok | ASS | 2 | 30 | Required |
| Instagram | ASS | 2 | 30 | Required |
| Vimeo | VTT/SRT | 2 | 42 | Optional |
| Facebook | SRT | 2 | 35 | Optional |
| Broadcast | TTML/STL | 2 | 37 | No |


path: styling.md
content: # Styling Presets — Video Captions

## Quick Style Reference (ffmpeg force_style)

```bash
ffmpeg -i video.mp4 -vf "subtitles=video.srt:force_style='STYLE_STRING'" output.mp4
```

---

## Netflix Standard

Clean, professional, bottom-aligned.

```
FontName=Netflix Sans,FontSize=48,PrimaryColour=&HFFFFFF,OutlineColour=&H000000,Outline=2,Shadow=1,Alignment=2,MarginV=50
```

**Fallback fonts:** Arial, Helvetica Neue, sans-serif

**Rules:**
- Max 42 characters per line
- Max 2 lines
- White text, black outline
- Centered bottom

---

## YouTube Standard

Default YouTube auto-caption style.

```
FontName=Roboto,FontSize=36,PrimaryColour=&HFFFFFF,BackColour=&H80000000,Outline=0,Shadow=0,Alignment=2,BorderStyle=4
```

**Features:**
- Semi-transparent black background
- No outline/shadow
- Clean readability

---

## TikTok Bold

Eye-catching, centered, bold text for short-form.

```
FontName=Montserrat-Bold,FontSize=42,PrimaryColour=&HFFFFFF,OutlineColour=&H000000,Outline=4,Shadow=0,Alignment=10,MarginV=200
```

**Alignment 10** = center horizontally, top-center vertically

Alternative with color:
```
FontName=Impact,FontSize=48,PrimaryColour=&H00FFFF,OutlineColour=&H000000,Outline=4,Shadow=2,Alignment=10
```

---

## Instagram Reels

Similar to TikTok but slightly smaller.

```
FontName=Helvetica-Bold,FontSize=36,PrimaryColour=&HFFFFFF,OutlineColour=&H000000,Outline=3,Shadow=0,Alignment=2,MarginV=150
```

---

## Cinematic

Elegant, minimal, for films and documentaries.

```
FontName=Georgia,FontSize=42,PrimaryColour=&HFFFFFF,OutlineColour=&H40000000,Outline=1,Shadow=2,Alignment=2,MarginV=80,Italic=1
```

---

## Gaming/Streaming

High contrast, readable over busy backgrounds.

```
FontName=Arial Black,FontSize=40,PrimaryColour=&H00FF00,OutlineColour=&H000000,Outline=3,Shadow=2,Alignment=2
```

---

## Karaoke Style

Word-by-word highlighting (requires ASS with `\k` tags).

```ass
Style: Karaoke,Arial,48,&H00FFFFFF,&H000000FF,&H00000000,&H64000000,-1,0,0,0,100,100,0,0,1,2,1,2,10,10,50,1

Dialogue: 0,0:00:01.00,0:00:05.00,Karaoke,,0,0,0,karaoke,{\k50}Hel{\k30}lo {\k40}world
```

---

## Color Reference (ASS &HAABBGGRR format)

| Color | Code |
|-------|------|
| White | &HFFFFFF |
| Black | &H000000 |
| Yellow | &H00FFFF |
| Cyan | &HFFFF00 |
| Red | &H0000FF |
| Green | &H00FF00 |
| Blue | &HFF0000 |
| Orange | &H0080FF |
| Purple | &HFF00FF |

**With transparency (AA = alpha, 00=opaque, FF=transparent):**
- Semi-transparent black: &H80000000

---

## Position Reference

**Alignment values (numpad layout):**
```
7  8  9   ← top
4  5  6   ← middle  
1  2  3   ← bottom
↑  ↑  ↑
L  C  R
```

| Position | Alignment |
|----------|-----------|
| Bottom center | 2 |
| Top center | 8 |
| Center middle | 5 |
| Bottom left | 1 |
| Bottom right | 3 |
| Top-center (TikTok) | 10 (special) |

---

## Custom Positioning (ASS)

Exact pixel position:
```
{\pos(960,900)}This text at exact position
```

Animated movement:
```
{\move(100,500,1800,500,0,2000)}Moving text left to right
```

---

## Font Recommendations

| Style | Primary | Fallback |
|-------|---------|----------|
| Professional | Netflix Sans, Gotham | Arial, Helvetica |
| Bold/Social | Montserrat Bold, Impact | Arial Black |
| Cinematic | Georgia, Garamond | Times New Roman |
| Gaming | Arial Black, Bebas Neue | Impact |
| Clean | Roboto, Open Sans | Arial |
| Retro | VCR OSD Mono | Courier |

---

## Complete ffmpeg Examples

**Netflix-style burn-in:**
```bash
ffmpeg -i video.mp4 -vf "subtitles=video.srt:force_style='FontName=Arial,FontSize=48,PrimaryColour=&HFFFFFF,OutlineColour=&H000000,Outline=2,Shadow=1,Alignment=2,MarginV=50'" -c:a copy output.mp4
```

**TikTok-style with high quality:**
```bash
ffmpeg -i video.mp4 -vf "subtitles=video.ass" -c:v libx264 -preset slow -crf 18 -c:a copy output.mp4
```

**Vertical video (9:16) positioning:**
```bash
ffmpeg -i video.mp4 -vf "subtitles=video.srt:force_style='Alignment=10,MarginV=400,FontSize=28'" -c:a copy output.mp4
```


Security scan verdicts — ClawScan: clean | static analysis:  | VirusTotal: suspicious | SkillSpector: suspicious (MEDIUM)