Video2presentation: 세미나 녹화 → 프레젠테이션
결정의 상세 내역과 측정된 수치는 Video2presentation 폴더의 METHODOLOGY.md에 있습니다. 이 스킬과 METHODOLOGY.md가 충돌할 경우, 스킬을 따릅니다. 새로운 교훈은 METHODOLOGY.md에 추가합니다.
항상 적용되는 규칙
- 먼저 계획을 세우고 질문합니다. 처리 전에, 아래 단계에 따라 계획을 사용자에게 알리고 AskUserQuestion으로 명확한 질문을 합니다(목록은 0단계에 있음). 답변을 받은 후에만 작업을 시작합니다.
- 사용자에 대한 응답. 사용자의 언어(보통 영어가 아님)로 정직하고 아첨 없이 응답합니다. 모든 숫자는 스크립트로 계산합니다. 정보는 표 형식으로 형식화합니다. 사용자가 요청하는 경우에만 일반 텍스트를 사용합니다. 업데이트할 때마다 프레젠테이션 링크를 제공합니다.
- 보안.
- AssemblyAI 키는
assemblyai_key.txt파일에서만 읽습니다. 절대 인쇄하거나 클라우드, 노트 또는 아티팩트에 복사하지 마십시오. - 발표자가 Miro 보드를 보여주더라도 Miro 또는 Figma 통합을 사용하지 마십시오. 비디오 프레임에서 보드를 가져옵니다.
_work/작업 폴더를 포함하여 사용자의 폴더에서 허가 없이 어떤 것도 삭제하지 마십시오.
- AssemblyAI 키는
- 정확성.
- 발표자를 조용히 수정하지 마십시오. 노트에 타임코드와 함께 모순과 숫자 불일치를 기록합니다.
- 슬라이드의 숫자를 스크립트로 다시 계산합니다.
- 법적 주장을 확인하고 슬라이드에 간단한 주의 사항을 추가합니다.
- 최종 시사점을 발표자의 슬라이드가 아닌 종합으로 표시합니다.
- 비디오는 클라우드로 전송되지 않습니다. ffmpeg, OpenCV 및 전사는 사용자의 컴퓨터에서 실행됩니다(
device_bash). 연락처 시트, 모자이크, 개별 프레임 및 자르기만 클라우드로 이동합니다 — 즉, 봐야 하거나, 인식해야 하거나, 아티팩트에 업로드해야 하는 것입니다.
파일 위치
- 스킬 및 프로젝트 폴더는
Video2presentation입니다(Cowork에서는 연결된 폴더$HOME/mnt/Video2presentation, Claude Code에서는 현재 폴더). 루트에는 스킬 자체(SKILL.md)와METHODOLOGY.md가 있습니다. pipeline/— 스크립트:transcribe_assemblyai.py— AssemblyAI를 통한 대본;extract_slides.py— 초당 한 프레임, 웹캠 마스크, 안정적인 세그먼트, 중복 제거, 연락처 시트;mosaic.py— 프레임 목록에서 2×2 모자이크;crop_images.py및crops_<날짜>[_<발표자>].json— 이미지 잘라내기;clean_transcript.py— 슬라이드당 정리된 대본 발췌문.
assemblyai_key.txt— AssemblyAI API 키. 파일이 없을 수 있습니다 — 0단계와 1단계를 참조하십시오.- 이벤트 폴더
YYYY.MM.DD 이름/: 비디오, 때로는 설명(html 또는 사용자 메시지의 텍스트), 때로는 준비된 대본(sentences.json,transcript.txt). 중간 파일은<이벤트 폴더>/_work/에 넣습니다. - 스크립트가 없는 경우, 마지막의 "pipeline/을 사용할 수 없는 경우"를 참조하십시오.
0단계. 정찰, 계획, 질문
- 이벤트 폴더를 검사합니다:
- 비디오: 해상도, 길이, fps(
ffprobe); 다른 해상도의 두 번째 사본이 있는지; - 준비된 대본;
assemblyai_key.txt가 존재하는지 — 대본을 처음부터 만들어야 하는 경우 필요함;- 이벤트 설명(선택 사항): 이름, Telegram 핸들, 강연 주제. 사용자 메시지 끝이나 html 파일에 있을 수 있습니다. 설명이 없으면 녹화 자체에서 이름과 주제를 가져옵니다.
- 비디오: 해상도, 길이, fps(
- 계획을 제시하고 AskUserQuestion으로 질문합니다. "권장" 옵션은 사용자가 이전에 선택한 것입니다:
- 대본: 존재하는 경우 기존 대본을 사용하거나(권장), AssemblyAI로 새 대본을 만듭니다.
- 슬라이드 노트: 슬라이드가 화면에 표시되는 시간에 대해 가볍게 정리된 대본 발췌(권장), 그대로의 발췌, 또는 타임코드가 포함된 짧은 요약.
- 4000자를 초과하는 발췌문(슬라이드 노트 한도): "[… ]" 표시로 단축(지난번 사용자의 선택)하거나 슬라이드를 분할합니다.
- "지난번과 동일한" 형식(권장): 상세하고 원본에 가깝게; 강연 내 질문에 대한 답변은 슬라이드로; 광고 및 조직 부분은 건너뜀; 전반적인 시사점과 통합 링크 목록을 마지막에 배치.
- 발표자 수 — 설명이 명확하지 않은 경우(화자 분할에 필요함).
- 최종 확인 단계가 포함된 작업 목록을 만듭니다.
1단계. 대본
-
준비된 대본: 먼저 확인합니다 — 발표자 레이블과 단어 수준 타임스탬프가 있고, 길이가 비디오와 일치하는지 확인합니다. 모든 것이 있으면 재실행이 필요하지 않습니다.
-
AssemblyAI 키. 새 대본 전에,
assemblyai_key.txt가 폴더 루트에 존재하고 비어 있지 않은지 확인합니다. 파일이 없으면 이 단계를 계속하지 말고 사용자에게 알립니다: assemblyai.com에 가입하고, API 키를 받아 폴더 루트의assemblyai_key.txt에 저장해야 합니다(또는 키를 보내면 해당 파일에 저장하고 다른 곳에서는 반복하지 마십시오). 0단계의 계획에서 즉시 이 내용을 말하는 것이 좋습니다. -
새 대본. 낮은 해상도 사본에서 오디오를 재인코딩 없이 추출합니다:
ffmpeg -i in.mp4 -vn -c:a copy audio.m4a. 그런 다음:python3 pipeline/transcribe_assemblyai.py audio.m4a <OUT> --key-file assemblyai_key.txt --lang <언어 코드> [--speakers --min-speakers N --max-speakers M] --submit-only python3 pipeline/transcribe_assemblyai.py - <OUT> --key-file assemblyai_key.txt --fetch --wait 150 # 완료될 때까지 반복- 영어가 아닌 음성의 경우 녹화 언어를 지원하는 모델을 사용하십시오. 2026년 10월 기준으로 그것은
universal-2입니다. - 여러 사람이 말할 때만 화자 분할을 사용하십시오. 단일 음성에서는 잘못된 A/B 레이블을 생성합니다.
- 도메인
api.assemblyai.com은 허용 목록에 있어야 합니다(설정 → 기능). 프록시가 403을 반환하면 사용자에게 알리고 해결 방법을 시도하지 마십시오. - 가격 — 시간당 약 $0.15, 화자 분할에 시간당 추가 $0.02.
- 영어가 아닌 음성의 경우 녹화 언어를 지원하는 모델을 사용하십시오. 2026년 10월 기준으로 그것은
-
작업 파일
transcript_sent.txt: 한 줄 =N [h:mm:ss] LABEL: 문장. 여기서 N은 1부터 시작하는 문장 번호입니다.config.json및overrides.json은 이러한 번호를 참조합니다. -
레이블 → 사람. 호스트가 사람을 부르는 방식("Leonid, 당신이 먼저죠?"), 설명 및 내용을 통해 일치시킵니다. 일반적인 화자 분할 오류:
- 한 사람이 두 개의 레이블을 받음;
- 전체 강연이 하나의 발화로 처리됨;
- 청중의 짧은 질문이 이웃에게 귀속됨.
수정 사항을
config.json에 씁니다:names(레이블 → 이름),speaker_by_line(줄 → 이름),drop_lines(제거할 줄). -
강연 경계: 타임코드로 기록합니다 — 인트로, 각 강연(Q&A 포함), 클로징. 이것이 덱의 섹션 구조입니다.
2단계. 프레임
- 해상도. 두 개의 사본이 있는 경우: 저해상도 사본에서 분석(
--reduce 2), 고해상도 사본에서 텍스트 및 자르기(ffmpeg -ss <초> -i hd.mp4 -frames:v 1 hd/NNNNN.jpg). 사본이 하나인 경우:--reduce 4(저해상도의 경우--reduce 2); 큰 텍스트는 프레임에서 직접 읽을 수 있습니다. - 청크로 추출합니다.
device_bash는 호출당 약 180초의 제한이 있으며, 백그라운드 프로세스는 유지되지 않습니다.python3 pipeline/extract_slides.py video.mp4 <OUT> --chunk 1000 python3 pipeline/extract_slides.py video.mp4 <OUT> --skip-extract --reduce 4- ffmpeg 속도는 매우 다양합니다: 과거 실행에서 실제 시간의 10배에서 48배까지. 첫 번째 청크에서 측정하고 제한 × 0.8 × 속도보다 크지 않은 청크 크기를 선택합니다.
- 호출을
timeout으로 감쌉니다. 프레임 번호로 불완전한 청크를 완료합니다. - 두 코어에서 두 개의 ffmpeg 프로세스를 병렬로 실행해도 더 빠르지 않습니다.
- 프레임
NNNNN.jpg= 초 N−1.
- 웹캠. 마스크는 자동으로 감지됩니다. Google Meet 레이아웃(화면 공유는 왼쪽, 카메라는 오른쪽)에서는 필요하지 않습니다. 발표자의 카메라 창은 일반적으로 오른쪽 상단 모서리에 있습니다 — 자르기 및 OCR은 이를 피합니다.
- 검토. 연락처 시트(
sheets/)를 보고 모든 프레임을 보지 마십시오. 클라우드로 이동하여 엽니다. 세부 사항을 보려면 2×2 모자이크를 사용하십시오:python3 pipeline/mosaic.py HD_DIR OUT PREFIX 00165 00179 …. - 애니메이션 슬라이드는 선택에서 제외됩니다: 움직이는 배경은 안정적인 세그먼트를 생성하지 않습니다. 발표자의 슬라이드 번호 매기기(01/16, 06/17…)를 확인하십시오. 명시적 프레임 목록에서 빌드된 모자이크를 사용하여 발견된 인접 슬라이드 사이의 시간 간격(초)을 찾으십시오.
- 클라우드로 파일 이동은 연결된 폴더에서만 작동합니다: VM 작업 디렉토리(
~/w…)에서 먼저_work/로 파일을 복사합니다.
3단계. 논리적 슬라이드
목표는 비디오를 프레임별로 반복하는 것이 아니라 발표 가능한 슬라이드를 얻는 것입니다.
- 발표자의 슬라이드. 텍스트를 다시 입력합니다(OCR은 초안일 뿐); 차트와 스크린샷은 자르기로 삽입합니다. 편집기(축소판 스트립 포함)에서 동일한 슬라이드, 확대 또는 일시 중지된 것은 중복입니다. 전체 화면 슬라이드를 가져옵니다.
- 보드(Miro, Excalidraw). 슬라이드 = 발표자가 말하는 보드 블록; 동일한 블록에서 패닝 및 확대/축소하는 것은 중복입니다. 강연이 진행됨에 따라 보드가 채워지면 마지막 완전한 프레임을 가져와 블록별로 슬라이드로 분할합니다.
- 앱 인터페이스. 중간 클릭이 아닌 결과(테이블, 보고서, 대시보드, 봇 응답)가 있는 화면을 가져옵니다.
- 스크롤이 포함된 라이브 웹사이트 데모 — 프레임이 아닌 대본에서 다시 설명합니다("발표자의 말에서 가져온 슬라이드").
- 전체 화면 웹캠은 슬라이드가 아닙니다. 그 내용은 발표자의 말에서 가져온 슬라이드로 이동합니다.
- 질문 및 답변 — 강연 끝에 별도의 슬라이드: 질문(질문자 이름 포함) 및 답변의 요지.
- 호스트의 광고 및 조직 부분은 건너뜁니다. 사용자가 달리 요청하지 않는 한, 발표자 자신의 광고(강좌, 가격)는 간략히 그리고 참고용으로만 제공합니다.
- 덱 구조:
- 표지 및 의제;
- 각 강연에 대해: 섹션 제목 슬라이드, 내용, 질문, "링크 및 서비스" 슬라이드;
- 전반적인 시사점 — "종합"으로 표시되며 발표자 간 모순 포함;
- 통합 링크 목록.
- 각 슬라이드에 대해 강연 접두사(
l-,v-…), 소스 프레임 및 화면 표시 간격과 함께 id를 기록합니다.
4단계. 이미지
- 전체 크기 프레임의 자르기 좌표를
pipeline/crops_<YYYY-MM-DD>[_<발표자>].json에 저장합니다. 형식{"name": ["00556.jpg", x0, y0, x1, y1]}. - 자르기: 저해상도에는
python3 pipeline/crop_images.py FRAMES crops.json OUT --scale 2 --jpg, 고해상도에는--scale 1 --jpg. - 프레임 및 웨비나 자료(이름, 연락처, 로그인, 서신)에서 개인 데이터를 확인하거나 숨기지 마십시오: 있는 그대로 전달합니다.
5단계. 텍스트, OCR, QR, 숫자
- OCR. 사용자 컴퓨터의 tesseract는 일반적으로 영어만 있습니다. 다른 언어의 경우 클라우드를 사용하십시오:
apt-get install tesseract-ocr-<언어 코드>, 카메라 창을 흰색으로 칠하고 프레임을 ×1.5로 업스케일한 다음tesseract -l <언어 코드>+eng. 프레임에 대해 결과를 확인하십시오. 이름이 왜곡될 수 있습니다. - QR 코드: 고해상도 프레임에서
cv2.QRCodeDetector, 결과는qr.json에 저장됩니다. - 숫자. 행 합계, 백분율 및 "리드당 약 1,700"과 같은 수치를 슬라이드에서 스크립트로 다시 계산합니다. 불일치를 수정하지 말고 기록하십시오: "행 합계는 60.3k, 슬라이드는 64k라고 표시됨". 레이블이 없는 차트에서 읽은 값은 "≈"로 표시합니다.
6단계. 링크
- 출처: 프레임의 주소, QR 코드, 음성, 이벤트 설명(Telegram 핸들). ASR은 이름을 왜곡하므로(invoice.com → "invoisin", Gwen → Qwen, JLM → GLM), 프레임 또는 검색에서 올바른 철자를 가져옵니다.
- 확인. WebSearch 또는 WebFetch로 모든 링크를 확인하고 슬라이드 바닥글에 확인 날짜를 넣습니다. Product Hunt(producthunt.com) 및 There's An AI For That(theresanaiforthat.com)와 같은 카탈로그는 서비스의 공식 주소와 설명을 신속하게 제공합니다.
- 열리지 않음 — curl 또는 미러로 해결 방법을 시도하지 마십시오. t.me는 종종 429를 반환합니다: 재시도하지 말고 "슬라이드의 주소, 페이지가 열리지 않음"으로 표시합니다.
- 찾을 수 없음 — 그렇게 말하십시오: "서비스를 찾을 수 없음", "링크가 나중에 제공되겠다고 약속됨".
- 배치 위치. 각 강연의 마지막 슬라이드: 한 줄 주석이 있는 링크. 노트에는 더 자세한 내용: 무엇인지, 웹사이트의 가격, 발표자가 어떻게 사용하는지, 무엇을 찾을 수 없었는지. 덱 끝에 통합 슬라이드: 카테고리별 발표자 및 도구.
7단계. 노트 — 대본 발췌문
- 간격.
ranges.json—[["slide-id", 시작_초, 끝_초], …], 전체 녹화에 걸쳐 간격이나 중복이 없음. 슬라이드 변경 프레임과 의미에 따라 경계를 설정합니다. 발표자는 종종 전환하기 전에 다음 슬라이드에 대해 이야기하기 시작합니다. - 생성:
python3 pipeline/clean_transcript.py <이벤트 폴더>/_work는notes.json을 생성하고 노트 길이를 출력합니다(3700보다 길면<-- LONG). - 가벼운 정리:
- 스크립트의 ASR 오류 사전
REPL: 일반적인 대체는 유지하고 웨비나별 대체를 추가합니다. - 문장 시작 부분의 필러 단어(스크립트의
FILL목록)는 자동으로 제거됩니다. overrides.json에서 줄 단위로 왜곡된 문장을 수정합니다("줄 번호": "텍스트"또는null). 발표자의 의미와 어순을 유지합니다. 불명확한 부분은 "[녹음에서 들리지 않음]"으로 표시합니다.- 재정의된 줄은 다시 정리되지 않습니다.
- 스크립트의 ASR 오류 사전
- 생성 후 확인: 반복되는 문장이 없는지(재정의로 인해 인접 줄이 중복될 수 있음)와 손실된 줄이 없는지(간격의 모든 줄이 노트에 있거나 의도적으로
drop_lines에 있는지) 확인합니다. - 노트 형식(덱의 언어로 작성):
녹음 발췌 1:31:02–1:33:05: [1:31:02] Artyom: … [1:31:09] Stanislav: … 1-2줄의 설명: 보드 텍스트, 숫자 불일치, 이름 설명. - 4000자 제한. 더 긴 경우 사용자가 0단계에서 결정한 대로 "[… ]"로 단축하거나 슬라이드를 분할합니다.
8단계. Claude Slides에서 조립
- Slides 유형(Artifact 빠른 시작, 의도 슬라이드)에서 아티팩트를 만들고 해당 SKILL.md를 따릅니다. 경험상 중요한 것(2026년 10월 기준 유형 규칙):
- 먼저 전체 순서와 섹션이 있는
deck.json(강연당 한 섹션). - 각 슬라이드에 대해 이미지가 포함된 페이지(자르기)를 만듭니다.
- 발표자 노트에 7단계의 텍스트를 넣습니다.
- 응답 메시지에 프레젠테이션 링크를 포함시킵니다.
- 먼저 전체 순서와 섹션이 있는
9단계. 인라인 검증
각 슬라이드에 대해 수치와 주장을 다시 확인합니다:
- 차트에서 읽은 모든 숫자는 스크립트로 계산되었습니까?
- 법적 주장에는 주의 사항이 있습니까?
- 모든 링크가 확인되었고 바닥글에 날짜가 있습니까?
- 모순이 발표자 노트에 타임코드와 함께 기록되었습니까?
- 최종 시사점이 "종합"으로 명확하게 표시되었습니까?
pipeline/을 사용할 수 없는 경우
스크립트가 누락된 경우:
- 사용자에게 "Video2presentation" 리포지토리에서 pipeline/을 복원하도록 요청합니다.
- 대안: 사용 가능한 도구를 사용하여 수동 단계를 설명합니다(예: "ffmpeg로 초당 1프레임 추출, 그런 다음 내게 프레임 보내기").
- 수동 워크플로우를 위해 METHODOLOGY.md를 참조합니다.
아티팩트 작업 시 일반적인 함정
- Slides 아티팩트 내에서
deck.json을 편집할 때 전체 구조를 다시 로드하지 않는 경우가 있습니다. 변경 후 저장하고 다시 엽니다. - 이미지 URL은 공개적으로 접근 가능해야 합니다. 자르기 파일은 아티팩트에 업로드되는 경우에만 작동합니다.
- 텍스트가 많은 슬라이드의 경우 발표자 노트를 사용하여 추가 컨텍스트를 제공하고 슬라이드 자체를 깔끔하게 유지합니다.
완료 조건
덱에는 다음이 포함됩니다:
- 표지 슬라이드
- 의제 슬라이드
- 각 강연에 대해: 제목 슬라이드, 콘텐츠 슬라이드, Q&A 슬라이드, 링크 슬라이드
- 전반적인 시사점(종합으로 표시)
- 통합 링크 목록
- 각 슬라이드에는 해당 프레임의 이미지가 있습니다(해당되는 경우)
- 각 슬라이드에는 발표자 노트에 대본 발췌문이 있습니다
- 숫자가 검증되었습니다
- 링크가 확인되었습니다
- 발표자 간 모순이 기록되었습니다
- 덱 링크가 사용자와 공유되었습니다