--- name: "lecture-recording-captions" description: "밤밤의 강연·라이브·기수 세션 녹화본(줌 클라우드·디스코드·맥 화면기록)을 자막판 영상으로 만들고 배포할 때 읽을 것. 어절 하이라이트 자막, 슬라이드별 타이틀 카드, 핵심 영역 확대, 주아체 일러스트, 얼굴 PIP, 질의응답 웹캠 레이아웃, 엔드카드에서 유튜브 업로드·디스코드 공지·7일 만료까지 한 파이프라인. \"녹화본 자막 달아줘\", \"강의 영상 편집해서 올려줘\", \"녹화본 디스코드에 업데이트해줘\", \"라이브 자막판 파이프라인\" 요청을 처리한다." --- > **이 스킬이 시스템에 하는 일 (설치 전 확인)** > > - 로컬에서 `ffmpeg`과 음성 인식 모델을 돌립니다. CPU·디스크를 많이 씁니다. > - 녹화 파일을 읽고 자막·영상 파일을 새로 만듭니다. **원본은 수정하지 않습니다.** > - 유튜브 업로드 단계는 별도 인증이 필요하고, 기본값은 업로드하지 않는 것입니다. # 강의 녹화본 자막판 결과물: 1920x1080 30fps mp4 하나. 1부(슬라이드 발표) + 2부(질의응답 웹캠) + 엔드카드. 겟백 팔레트(#0d0d0d / 라임 #D4F000 / 퍼플 #7B2FFF), 자막 나눔고딕 ExtraBold, 타이틀·일러스트 배달의민족 주아체(`assets/fonts/BMJUA_ttf.ttf`, 상업 사용 가능, 엔드카드에 출처 표기). 무거운 단계(전사·교정·렌더)는 전부 맥미니에서 돌린다(`macmini-offload` 스킬). 맥북에서는 크롭·축소 전처리만 videotoolbox로 한다. ## 먼저 정할 것 — 판매용인가 기수 공유용인가 두 경로가 갈린다. **소스 화면이 슬라이드로 고정되어 있는지** 먼저 본다(0단계 콘택트시트). | | 판매용 풀 파이프라인 | 기수 공유용 경량 | |---|---|---| | 소스 조건 | 발표 내내 슬라이드 고정 | 화면이 슬라이드·브라우저·웹캠으로 계속 바뀜 | | 포함 | 자막 + 타이틀카드 + 확대 + 일러스트 + PIP | **자막 + 엔드카드만** | | 걸리는 시간 | 반나절 이상 | 2~3시간 | 기수 세션 녹화본은 보통 **줌 창 전체를 녹화**해서 맥 메뉴바·독·디스코드 사이드바가 다 찍힌다. 이런 소스에 슬라이드 구간표를 만들면 타이틀카드가 엉뚱한 화면에 뜨고 확대가 엉뚱한 데를 잡는다. **`runs`를 통짜 하나(`[[0, 끝, 1]]`)로 두고 `titles`·`zoom`·`illustrations`를 빈 객체로 두면** 자막과 엔드카드만 적용된다. 이 조합은 2026-09-07 7기 OT에서 실측됐다. 손실 없이 빠지는 것과 아닌 것을 구분한다. 자막은 복습 가치가 크므로 반드시 넣고, 타이틀카드·확대는 화면이 고정된 소스에서만 값을 한다. ## 절차 ### 0. 소스 파악과 싱크 1. 영상 소스와 음성 소스를 분리해 적는다. 맥 화면기록은 오디오가 없다. 2. 두 파일을 10분 간격으로 샘플링해 콘택트시트로 본다. 슬라이드가 언제 끝나는지, 화면공유가 언제 꺼지는지, 웹캠 타일이 어디 있는지, 참가자 이름·채팅이 어디 찍히는지 표시한다. 3. 오프셋은 "슬라이드 제목을 읽는 발화"와 그 슬라이드의 등장 시각으로 두 군데 이상 맞춰 확정한다. 이후 모든 시각은 **음성(전사) 타임라인**으로 통일한다. 4. 실제 발화 끝은 볼륨 측정으로 확인한다. 전사가 "하하하"만 찍혀도 말이 이어지고 있을 수 있다. ### 1. 전처리 (맥북, videotoolbox) 필요 구간만 잘라 뽑는다. 원본은 보내지 않는다. - `base.mp4` 슬라이드 크롭 → 1920x1080 30fps, `-c:v h264_videotoolbox -b:v 3500k` - `face1.mp4` 발표 중 얼굴 타일 크롭(원본 해상도 유지) - `bam2.mp4` 질의응답 웹캠 타일 크롭 → 1440x810 - `audio.m4a` 음성 `-vn -c:a copy` - 마지막 슬라이드 PNG를 1920x1080으로 `s18.png`처럼 준비(공유 해제 구간 덮기용) `ssh localhost`로 nohup 실행하고, 중단할 땐 `pkill -f '[p]rep.sh'` 형식으로. ### 2. 전사 (맥미니) **줌 클라우드 녹화본이면 전사·교정 단계를 통째로 건너뛸 수 있다.** 줌이 `audio_transcript.transcript`(WEBVTT)를 같이 주고, 한국어 품질이 whisper 못지않다(2026-09-07 실측: 830큐, 밤밤 발화 정확). 절차는 `references/zoom-cloud-source.md` 참고. 1. `scripts/vtt_to_segs.py segs_final.json` — WEBVTT → 세그먼트(긴 발화는 문장 단위로 분할) 2. 고유명사 교정 — 줌 전사도 브랜드명은 틀린다("갯배/겟배" → "겟백", "칠 기" → "7기"). 정규식 치환으로 한 번에 고친다. 3. `scripts/add_words.py segs_final.json` — **필수.** `make_video.py`는 어절 하이라이트를 위해 `s['words']`를 요구하는데 줌 전사는 문장 단위라 없다. 글자 수 비례로 어절 시간을 배분한다. 이걸 건너뛰면 `KeyError: 'words'`로 죽는다. 줌 녹화본이 없거나 품질이 나쁘면 기존 경로로 간다 — `scripts/transcribe_chunks.sh