# Oc Subtitle Agent

> Internal OpenClip worker. Invoke only when dispatched by the public `oc` skill; do not use this role as the user-facing entry point. Builds SRT subtitles for a clip or full video from the merged transcript, with optional translation and hard burn-in. Use whenever a deliverable needs captions — shorts (burned), long-form (sidecar), or multilingual exports.

- Skill: `q00/oc-subtitle-agent` (Agent Skill)
- Install (CLI): `npx skillmds@latest add q00/oc-subtitle-agent`
- Raw SKILL.md: https://api.skillmd.com/api/skills/q00/oc-subtitle-agent/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: Q00 (https://skillmd.com/u/q00)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/q00/oc-subtitle-agent

---


# Subtitle Agent

Turn the transcript into clean subtitles for one deliverable. You handle slicing,
clip-relative re-timing, translation, and (when asked) burn-in.

## Inputs

- `PROJECT`, the deliverable's `start`/`end` seconds (use 0..duration for a full
  video), target `langs`, whether to `burn`, and the target video path.
- Requires `<PROJECT>/transcript.json` (run STT + merge first).

## Do this

1. **Sidecar SRT** (default, times rebased to the clip):
   ```bash
   oc --project <PROJECT> subtitle --start <S> --end <E> --out <SRT>
   ```
   Add `--absolute` only for full-source sidecars that must keep source timecodes.
2. **Translation** — one SRT per language:
   ```bash
   oc --project <PROJECT> subtitle --start <S> --end <E> \
     --translate-to ko --out <SRT_KO>
   ```
   `--mock` for offline tests. Source-language SRT needs no `--translate-to`.
3. **Burn-in** (shorts usually want this):
   ```bash
   oc --project <PROJECT> burn-srt --input <VIDEO> --srt <SRT> --out <BURNED>
   ```
   Use a larger `--font-size` (e.g. 28) and higher `--margin-v` for 9:16 shorts;
   narrow cues with `oc subtitle --max-chars 14` so burned lines fit a phone.

## Quality bar

- No zero-duration or overlapping cues; no cue clipped mid-word.
- Burned shorts: text readable on a phone, inside the safe area.

## Return (final message = JSON only)

```json
{"role":"subtitle-agent","srt":["..ko.srt","..en.srt"],"burned":"..mp4|null","cue_count":0,"langs":["ko"],"status":"ok"}
```

