---
name: testimonial-clips
description: 줌 녹화에서 클라이언트 후기 구간을 뽑아 자막 붙은 숏폼(릴스·쇼츠)으로 만들 때 읽을 것. "후기 클립 만들어줘", "이 미팅에서 후기 될 만한 거 잘라줘" 요청을 처리한다.
---

> **이 스킬이 시스템에 하는 일 (설치 전 확인)**
>
> - 녹화 파일을 읽고 잘라낸 클립을 새로 만듭니다. **원본은 수정하지 않습니다.**
> - **남의 발언을 편집하는 작업입니다.** 공개 전 당사자 동의를 받으세요.
> - `ffmpeg`을 로컬에서 돌립니다.

# 후기 클립 만들기

줌 자문/미팅 녹화에서 **클라이언트가 스스로 말한 긍정 평가**를 뽑아 숏폼으로 만든다.
2026-09월 A 대표님·B 원장님 두 건으로 검증된 절차다.

## 0. 먼저 판단할 것 — 클라이언트가 화면에 나오는가

**이게 전체 구성을 가른다.** 다운로드 전에 프레임을 뽑아 확인한다.

```bash
ffmpeg -ss <구간> -i full.mp4 -frames:v 1 -vf scale=300:-2 /tmp/chk.jpg
```

| 상황 | 구성 |
|---|---|
| **얼굴 나옴** | 영상을 주인공으로. 얼굴 중심 크롭 + 하단 자막 |
| **카메라 꺼짐** | 영상 버림. **브랜드 인용 카드 + 오디오 파형 + 자막** |

⚠️ 줌 `shared_screen_with_speaker_view`는 **말하는 사람 타일로 전환**된다.
클라이언트가 카메라를 껐으면 **정작 그가 말하는 구간이 전부 검은 화면**이다.
갤러리 뷰도 마찬가지다. 화면공유가 없으면 한쪽이 통째로 검다.

## 1. 녹화·전사록 받기

Zoom S2S OAuth — 자격증명과 다운로드 토큰 절차는 `advisory-minutes` 스킬 참조.
`download_url`에는 별도의 `download_access_token`이 필요하다.

## 2. 후기 구간 찾기

VTT를 타임스탬프째로 파싱해 **클라이언트 발화만** 키워드로 훑는다.

```python
keys=['좋았','감사','도움','달라졌','자신감','해결','성장','바뀌','이뤘','배웠','몰랐']
for ts, sp, body in cues:
    if sp != '밤밤' and any(k in body for k in keys) and len(body) > 15:
        print(f"[{ts}] {body}")
```

**고르는 기준**
- ⭐ **밤밤이 유도한 답이 아니라 클라이언트가 스스로 꺼낸 말**만 쓴다
- **비교가 들어간 발언이 가장 세다** — "다른 걸 해봤는데 이건 다르더라" 류
- 그 사람의 직업·맥락이 묻어난 문장 (예: *"진료실에서 듣는 거랑은 다르니까"*)
- 밤밤 자랑이 섞인 구간은 잘라낸다
- 앞뒤 문맥을 붙여 **완결된 한 덩어리**로 만든다. 40~90초

메타 파일로 정리한다: `번호|시작|길이|제목`

## 3. 단어 단위 재전사 — 줌 자막을 쓰지 않는다

**줌 자체 자막은 고유명사·숫자가 심하게 깨진다.**
(`fimbam`→밤밤, `긱백`→겟백, `커피 채취`→커피챗, `오만원 단가가 오만원으로`)

맥에 `mlx_whisper`가 깔려 있다(애플 실리콘 최적화, 맥미니에서 클립당 10~15초).

```bash
ffmpeg -ss <시작> -i full.mp4 -t <길이> -vn -ac 1 -ar 16000 -c:a pcm_s16le a1.wav
mlx_whisper a1.wav --model mlx-community/whisper-large-v3-mlx --language ko \
  --word-timestamps True --output-format json --output-dir /tmp/wj --output-name w1
```

## 4. 카라오케 자막(ASS) 생성

단어별로 색을 바꾼 라인을 여러 개 깔아 하이라이트가 이동하는 효과를 낸다.

- 청크: 세로 17자 / 가로 28~30자, 단어 간격 0.9초 이상이면 끊는다
- 강조색 `&H0035F0F5&`(형광 연두), 기본 `&HFFFFFF&`
- `\pos()`로 고정, `\fad(60,60)`
- **`subtitles=...:force_style=`은 쓰지 말 것** — 쉼표를 필터 구분자로 먹어 파싱이 깨진다.
  스타일을 ASS 파일에 직접 박고 `ass=파일.ass`로 붙인다

## 5. 합성

### 얼굴이 나올 때
```
crop=<얼굴중심>,scale=1080:1279,eq=brightness=0.12:contrast=1.16,
pad=1080:1920:0:200:<브랜드색>,ass=자막.ass
```
- 위 여백에 **후크 인용문 + 이름 배지**를 ASS `Hook`/`Tag` 스타일로 얹는다
- 밤 촬영이면 밝기·대비 보정을 반드시 넣는다

### 얼굴이 없을 때
```
[1:a]showwaves=s=1080x200:mode=cline:colors=<강조색>@0.75,format=yuva420p,
     colorkey=black:0.18:0.06[wv];
[0:v]scale=1080:1920[bg];[bg][wv]overlay=0:830[bw];[bw]ass=자막.ass
```
- 배경은 브랜드 그라데이션 카드(HTML→PNG 렌더)
- `showwaves` + `colorkey`로 파형만 남겨 얹으면 화면이 산다

**레이아웃은 층으로 완전히 분리한다.** 후크(상단) / 파형·영상(중앙) / 자막(하단).
겹치면 둘 다 안 읽힌다. 실제로 두 건 모두 위치를 2~3번 다시 잡았다.

가로(1280×720)와 세로(1080×1920) 두 벌을 뽑는다.

## 6. 검수

프레임을 여러 개 뽑아 **가로로 이어붙여 한 번에** 본다.

```bash
for t in 15 20 50; do ffmpeg -ss $t -i c1.mp4 -frames:v 1 /tmp/f$t.jpg; done
magick /tmp/f15.jpg /tmp/f20.jpg /tmp/f50.jpg -resize x680 +append /tmp/pv.jpg
```

확인 항목 — 자막이 후크를 덮지 않는가 / 파형이 자막을 가리지 않는가 /
어두워서 얼굴이 안 보이지 않는가 / 화면 밖으로 넘치지 않는가

## 7. ⚠️ 발행 전 반드시

**클라이언트 동의를 받는다.** 자문 계약서 제11조에 절차가 있다 —
**건별로** 공개 범위(구체 수치까지 쓸지)·실명 여부·사용처를 함께 정하고, 언제든 철회 가능.

**얼굴이 나오는 클립은 특히 그렇다.**

그리고 **매출 수치는 카드에 박지 않는다.** 발언이 전사 기반이라 부정확할 수 있고,
동의 범위를 벗어날 수 있다. *"노력은 줄고 수입은 늘었습니다"*처럼 정성 표현으로 간다.

## 주의

- ffmpeg 빌드에 **libass가 없으면 자막을 못 굽는다.** 맥미니 ffmpeg가 최소 빌드라 안 된다.
  전사는 맥미니(빠름), **렌더는 로컬**로 나눈다
- 한글 파일명을 `while read`로 돌리면 인코딩이 깨진다. **번호로 루프**를 돌고 나중에 이름을 붙인다
- 전사 오류 교정 사전을 만들어 자막 생성 시 일괄 치환한다

관련: `advisory-minutes` · `measured-ui-callouts` · `macmini-offload`
