--- 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`