Communitygithub.com

nielssrb/Video2presentation

세미나, 웨비나 또는 컨퍼런스 녹화를 편집 가능한 슬라이드 덱으로 변환할 때 사용합니다: 비디오 프레임에서 슬라이드 추출, 주석이 달린 링크, 발표자 노트로 사용할 대본 발췌문.

Video2presentation란 무엇인가요?

이 스킬은 녹화된 온라인 강연(세미나, 웨비나, 컨퍼런스)을 완전한 편집 가능한 프레젠테이션 덱(예: Google Slides)으로 자동 변환하는 전문 AI 비서입니다. 사용자가 기록을 다시 시청하거나 수동으로 요약할 필요 없이, 비디오 프레임에서 핵심 슬라이드를 식별 및 추출하고, 다중 화자 대화록을 생성 및 정리하며, 관련 웹 링크와 QR 코드를 확인 및 주석 처리합니다. 이 스킬은 AssemblyAI(전사), ffmpeg/OpenCV(프레임 추출), 그리고 프레젠테이션 조립을 위한 Claude Artifacts(슬라이드 유형)를 포함한 여러 AI 플랫폼을 오케스트레이션하며, 로컬 컴퓨팅과 클라우드 처리를 지능적으로 혼합하여 개인정보를 보호하고 비용을 최적화합니다. 주요 가치는 귀중한 콘텐츠(회의실 지식, 제품 데모, 패널 토론)를 구조적이고 공유 가능한 슬라이드로 변환하여, AI 에이전트가 다양한 소스(비디오, 오디오, 온스크린 텍스트)로부터의 정보를 정확하게 종합하고, 모순을 플래그하며, 실행 가능한 통찰력과 참고 자료 목록을 제공하는 방법을 보여주는 데 있습니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add nielssrb/Video2presentation

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

Video2presentation: 세미나 녹화 → 프레젠테이션

결정의 상세 내역과 측정된 수치는 Video2presentation 폴더의 METHODOLOGY.md에 있습니다. 이 스킬과 METHODOLOGY.md가 충돌할 경우, 스킬을 따릅니다. 새로운 교훈은 METHODOLOGY.md에 추가합니다.

항상 적용되는 규칙

  1. 먼저 계획을 세우고 질문합니다. 처리 전에, 아래 단계에 따라 계획을 사용자에게 알리고 AskUserQuestion으로 명확한 질문을 합니다(목록은 0단계에 있음). 답변을 받은 후에만 작업을 시작합니다.
  2. 사용자에 대한 응답. 사용자의 언어(보통 영어가 아님)로 정직하고 아첨 없이 응답합니다. 모든 숫자는 스크립트로 계산합니다. 정보는 표 형식으로 형식화합니다. 사용자가 요청하는 경우에만 일반 텍스트를 사용합니다. 업데이트할 때마다 프레젠테이션 링크를 제공합니다.
  3. 보안.
    • AssemblyAI 키는 assemblyai_key.txt 파일에서만 읽습니다. 절대 인쇄하거나 클라우드, 노트 또는 아티팩트에 복사하지 마십시오.
    • 발표자가 Miro 보드를 보여주더라도 Miro 또는 Figma 통합을 사용하지 마십시오. 비디오 프레임에서 보드를 가져옵니다.
    • _work/ 작업 폴더를 포함하여 사용자의 폴더에서 허가 없이 어떤 것도 삭제하지 마십시오.
  4. 정확성.
    • 발표자를 조용히 수정하지 마십시오. 노트에 타임코드와 함께 모순과 숫자 불일치를 기록합니다.
    • 슬라이드의 숫자를 스크립트로 다시 계산합니다.
    • 법적 주장을 확인하고 슬라이드에 간단한 주의 사항을 추가합니다.
    • 최종 시사점을 발표자의 슬라이드가 아닌 종합으로 표시합니다.
  5. 비디오는 클라우드로 전송되지 않습니다. 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단계. 정찰, 계획, 질문

  1. 이벤트 폴더를 검사합니다:
    • 비디오: 해상도, 길이, fps(ffprobe); 다른 해상도의 두 번째 사본이 있는지;
    • 준비된 대본;
    • assemblyai_key.txt가 존재하는지 — 대본을 처음부터 만들어야 하는 경우 필요함;
    • 이벤트 설명(선택 사항): 이름, Telegram 핸들, 강연 주제. 사용자 메시지 끝이나 html 파일에 있을 수 있습니다. 설명이 없으면 녹화 자체에서 이름과 주제를 가져옵니다.
  2. 계획을 제시하고 AskUserQuestion으로 질문합니다. "권장" 옵션은 사용자가 이전에 선택한 것입니다:
    • 대본: 존재하는 경우 기존 대본을 사용하거나(권장), AssemblyAI로 새 대본을 만듭니다.
    • 슬라이드 노트: 슬라이드가 화면에 표시되는 시간에 대해 가볍게 정리된 대본 발췌(권장), 그대로의 발췌, 또는 타임코드가 포함된 짧은 요약.
    • 4000자를 초과하는 발췌문(슬라이드 노트 한도): "[… ]" 표시로 단축(지난번 사용자의 선택)하거나 슬라이드를 분할합니다.
    • "지난번과 동일한" 형식(권장): 상세하고 원본에 가깝게; 강연 내 질문에 대한 답변은 슬라이드로; 광고 및 조직 부분은 건너뜀; 전반적인 시사점과 통합 링크 목록을 마지막에 배치.
    • 발표자 수 — 설명이 명확하지 않은 경우(화자 분할에 필요함).
  3. 최종 확인 단계가 포함된 작업 목록을 만듭니다.

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.
  • 작업 파일 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). 발표자의 의미와 어순을 유지합니다. 불명확한 부분은 "[녹음에서 들리지 않음]"으로 표시합니다.
    • 재정의된 줄은 다시 정리되지 않습니다.
  • 생성 후 확인: 반복되는 문장이 없는지(재정의로 인해 인접 줄이 중복될 수 있음)와 손실된 줄이 없는지(간격의 모든 줄이 노트에 있거나 의도적으로 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/을 사용할 수 없는 경우

스크립트가 누락된 경우:

  1. 사용자에게 "Video2presentation" 리포지토리에서 pipeline/을 복원하도록 요청합니다.
  2. 대안: 사용 가능한 도구를 사용하여 수동 단계를 설명합니다(예: "ffmpeg로 초당 1프레임 추출, 그런 다음 내게 프레임 보내기").
  3. 수동 워크플로우를 위해 METHODOLOGY.md를 참조합니다.

아티팩트 작업 시 일반적인 함정

  • Slides 아티팩트 내에서 deck.json을 편집할 때 전체 구조를 다시 로드하지 않는 경우가 있습니다. 변경 후 저장하고 다시 엽니다.
  • 이미지 URL은 공개적으로 접근 가능해야 합니다. 자르기 파일은 아티팩트에 업로드되는 경우에만 작동합니다.
  • 텍스트가 많은 슬라이드의 경우 발표자 노트를 사용하여 추가 컨텍스트를 제공하고 슬라이드 자체를 깔끔하게 유지합니다.

완료 조건

덱에는 다음이 포함됩니다:

  • 표지 슬라이드
  • 의제 슬라이드
  • 각 강연에 대해: 제목 슬라이드, 콘텐츠 슬라이드, Q&A 슬라이드, 링크 슬라이드
  • 전반적인 시사점(종합으로 표시)
  • 통합 링크 목록
  • 각 슬라이드에는 해당 프레임의 이미지가 있습니다(해당되는 경우)
  • 각 슬라이드에는 발표자 노트에 대본 발췌문이 있습니다
  • 숫자가 검증되었습니다
  • 링크가 확인되었습니다
  • 발표자 간 모순이 기록되었습니다
  • 덱 링크가 사용자와 공유되었습니다

관련 스킬