강의 영상을 로컬에서 자동 전사하고 GPT를 이용해 구조화된 학습 노트를 생성하는 Chrome 확장 프로그램입니다.
Lecture Summarizer는 완전 로컬 환경에서 동작합니다:
- 음성 전사: Faster-Whisper (CPU 모드) - 완전 로컬 실행
- 요약 생성: OpenAI GPT-4o-mini API
- 프론트엔드: Chrome Extension (Manifest v3)
- 백엔드: Node.js + Python 마이크로서비스
- 관리 도구: Windows 시스템 트레이 앱 (성능 모니터링 포함)
- YouTube 영상 자동 다운로드 및 처리 (yt-dlp)
- 로컬 음성 전사 (Faster-Whisper CPU 모드)
- GPT 기반 구조화된 노트 생성 (타임라인 + 학습 노트)
- 3탭 HTML 인터페이스 및 수식 렌더링 (KaTeX)
- 시스템 트레이 관리 (서버 제어, 웹 대시보드)
- 웹 기반 모니터링 대시보드 (로그 뷰어, 성능 모니터링)
- 실시간 진행도 추적 및 작업 취소
| 계층 | 기술 | 버전 |
|---|---|---|
| 프론트엔드 | Chrome Extension (Manifest v3) | - |
| 백엔드 | Node.js + Express | 18+ |
| 음성 전사 | Python + Faster-Whisper | 3.8+ |
| 서버 | FastAPI + Uvicorn | - |
| 오디오 처리 | FFmpeg | - |
| 영상 다운로드 | yt-dlp | 2025.11.12+ |
| AI 모델 | Whisper (base) | 1.1.0 |
| 요약 생성 | OpenAI API | gpt-4o-mini |
- OS: Windows 10/11 (64-bit)
- Python 3.8+
- Node.js 18+
- FFmpeg
- RAM: 최소 8GB (권장 16GB)
- 디스크: 2GB 여유
- 브라우저: Chrome
- OpenAI API Key (필수)
- 평균 비용: 1시간 강의 $0.002~0.005 (gpt-4o-mini 기준)
- 다운로드: GitHub Releases에서
LectureSummarizer-Portable-vX.X.X.zip다운로드 - 압축 해제: 원하는 위치에 압축 해제
- Setup.exe 실행: 폴더 안의
Setup.exe실행- Python, Node.js, FFmpeg 등 필수 프로그램 자동 설치
⚠️ 처음 1회만 실행
- 트레이 앱 실행:
LectureSummarizer.exe더블클릭 - 서버 시작: 트레이 아이콘 우클릭 → "서버 시작"
Python 패키지 설치:
cd server
python -m venv venv
.\venv\Scripts\Activate.ps1
pip install -r requirements.txtNode 패키지 설치:
cd server
npm install- Chrome에서
chrome://extensions/접속 - 우측 상단 "개발자 모드" 활성화
- "압축해제된 확장 프로그램을 로드합니다" 클릭
- 프로젝트 폴더의
extension/선택
- Chrome 우측 상단 확장 프로그램 아이콘 클릭
- "Lecture Summarizer" 클릭
- 다음 정보 입력:
- OpenAI API Key (필수)
- HTML 저장 폴더 (선택)
- "저장" 클릭
시스템 트레이 앱 사용 (권장):
cd tray_app
python tray_manager.py트레이 아이콘 우클릭 → "🟢 서버 시작" 클릭
트레이 앱 주요 기능:
- 서버 원클릭 시작/중지
- 📊 대시보드 열기: 성능 모니터링 및 개발자 로그
- 서버 상태 실시간 확인
- 로그 폴더 바로 가기
또는 수동 실행:
# 터미널 1 - Whisper 서버
cd server
python whisper_server.py
# 터미널 2 - Node.js 서버
cd server
node server.js방법 1: YouTube 영상
- YouTube 영상 페이지 방문
- Chrome 확장 프로그램 아이콘 클릭
- 영상 정보 확인 (📺 아이콘 표시)
- "✓" 버튼 클릭
- 자동 다운로드 및 처리 대기 (1~5분)
- 완료 후 자동 오픈 및 저장
방법 2: 일반 웹페이지 영상
- 강의 영상이 있는 웹페이지 방문 (e-learning, 강의 사이트 등)
- 영상 재생 시작 (DOM에서 비디오 감지를 위해)
- Chrome 확장 프로그램 아이콘 클릭
- 감지된 영상 정보 확인 (🎥 아이콘 표시)
- "✓" 버튼 클릭
- 처리 대기 (1~5분)
- 완료 후 자동 오픈 및 저장
1. 비디오 선택 (YouTube 또는 웹페이지 영상)
↓
2. 💾 동영상 처리 (Video processing)
- YouTube: yt-dlp로 MP3 직접 다운로드
- 웹페이지 영상: URL에서 직접 다운로드
↓
3. 🎵 음성 추출 (Audio extraction)
- MP4 → MP3 변환 (32kbps, 16kHz)
- MP3 파일은 변환 생략
↓
4. ✂️ 음성 분할 (Audio splitting)
- 분할 (20MB 초과 시)
↓
5. 🎤 음성 인식 (Speech recognition - Whisper)
- Faster-Whisper 로컬 전사
- 타임스탬프 세그먼트 생성
- 영상 길이 자동 추출
↓
6. 🔍 내용 분석 (Content analysis)
- 텍스트 정제 및 도메인 분석
- 전문 용어 교정
↓
7. 📝 노트 생성 (Note generation - GPT)
- 타임라인 노트 생성
- 학습 노트 생성
↓
8. 🎨 HTML 렌더링 (HTML rendering)
- 3탭 HTML 생성 (스크립트/타임라인/요약)
- KaTeX 수식 렌더링
↓
9. 저장 및 브라우저 오픈
- 성능 데이터 저장 (performance.json)
성능 추적:
- 각 단계별 소요 시간 측정
- 로그 회귀 기반 처리 시간 예측
- 최대 200개 세션 이력 보관
PORT=3000
WHISPER_API_URL=http://127.0.0.1:5001
WHISPER_MODEL=base
GPT_MODEL=gpt-4o-miniWHISPER_MODEL=base # tiny, base, small, medium
WHISPER_COMPUTE=int8 # int8 (CPU 최적화)lecture-summarizer/
├── extension/ # Chrome Extension
│ ├── manifest.json
│ ├── popup.html/js # 설정 UI
│ ├── content.js # YouTube 영상 감지
│ ├── background.js # Service Worker
│ └── icon*.png # 확장 아이콘
├── server/ # 백엔드
│ ├── server.js # Express 서버 (포트 3000)
│ ├── whisper_server.py # Whisper 전사 서버 (포트 5001)
│ ├── requirements.txt # Python 의존성
│ ├── package.json # Node.js 의존성
│ ├── config/ # 서버 설정
│ ├── middleware/ # CORS 미들웨어
│ ├── services/ # 비즈니스 로직
│ │ ├── openaiService.js # GPT API 서비스
│ │ ├── htmlGenerator.js # HTML 생성
│ │ └── dashboardService.js # 대시보드 API 서비스
│ ├── views/ # 웹 페이지
│ │ └── dashboard.html # 웹 대시보드 UI
│ ├── utils/ # 유틸리티
│ │ ├── audioConverter.js # 오디오 변환
│ │ ├── transcription.js # Whisper 클라이언트
│ │ ├── performanceTracker.js # 성능 측정
│ │ ├── performanceLogger.js # 통계 저장
│ │ └── formatters.js # 포맷터
│ ├── fonts/ # 한글 폰트 (Noto Sans KR)
│ ├── logs/ # 성능 데이터
│ │ └── performance.json # 세션별 처리 시간
│ └── tmp/ # 임시 파일
├── tray_app/ # 시스템 트레이 앱
│ ├── tray_manager.py # 서버 제어
│ └── icon_*.ico # 상태별 아이콘
├── logs/ # 서버 로그
│ ├── whisper.log
│ ├── whisper_error.log
│ ├── nodejs.log
│ └── nodejs_error.log
├── docs/
│ └── project-structure.md # 상세 구조 문서
├── README.md # 메인 문서
└── QUICK_START.md # 빠른 시작 가이드
자세한 구조는 docs/project-structure.md 참조.
시스템 트레이 앱에서 "대시보드 열기" 메뉴를 클릭하면 기본 브라우저에서 웹 대시보드(http://127.0.0.1:3000/dashboard)가 열립니다.
웹 대시보드는 다음 3개의 탭으로 구성되어 있습니다:
- Whisper Logs: Whisper 서버 로그 및 에러 로그 조회
- Node.js Logs: Node.js 서버 로그 및 에러 로그 조회
- Performance: 성능 모니터링 및 시스템 메트릭 조회
성능 분석 및 예측:
- 총 처리 건수, 평균/최소/최대 시간 표시
- 7단계별 소요 시간 시각화 (막대 그래프)
- 회귀 기반 예측: 15/30/45/60분 영상 처리 시간 예측
- 모델 정확도 (R²) 표시
- CPU/메모리 사용량 실시간 모니터링
특징:
- 스와이프 가능한 카드 UI (단계별 시간 ↔ 예측)
- 로그 회귀 모델로 영상 길이별 처리 시간 예측
- 최대 200개 세션 이력 보관
- 자동 새로고침 (5초 간격)
[2025-12-05 04:19:20] [INFO] [Server] Server running on http://localhost:3000
[2025-12-05 04:19:22] [INFO] [Audio] Converting video to MP3...
[2025-12-05 04:20:48] [INFO] [Transcribe] Video duration: 14m 5s
CPU 모드에서:
| 모델 | 크기 | 메모리 | 속도 | 정확도 |
|---|---|---|---|---|
| tiny | 75MB | 500MB | 매우 빠름 | 낮음 |
| base | 140MB | 1GB | 보통 | 보통 |
| small | 460MB | 2GB | 느림 | 높음 |
| medium | 1.5GB | 5GB | 매우 느림 | 매우 높음 |
모델 변경:
# server/whisper_server.py
MODEL_SIZE = "small" # base → small또는 환경 변수:
$env:WHISPER_MODEL='small'
python server/whisper_server.py- OpenAI API Key: Chrome Storage에만 저장
- 영상 데이터: 로컬 서버에서만 처리
- Whisper 전사: 로컬 CPU에서 실행
- GPT 호출: 정제된 텍스트만 전송
✓ 첫 실행 시 모델 다운로드 (~140MB)
✓ http://127.0.0.1:5001 접속 확인
✓ 방화벽에서 포트 5001 허용 확인
✓ Extension 설정에서 Key 재확인
✓ platform.openai.com에서 유효성 확인
✓ API 사용 가능 여부 확인
✓ 더 큰 모델 사용 (base → small)
✓ 원본 음질 확인
✓ 배경 소음 최소화
✓ 폴더 경로 확인
✓ 폴더 쓰기 권한 확인
✓ Chrome 다운로드 권한 확인 (chrome://settings/downloads)
# Python venv
cd server
python -m venv venv
.\venv\Scripts\Activate.ps1
pip install -r requirements.txt
# Node 의존성
npm install
# 각각 터미널에서 실행
python whisper_server.py # 터미널 1
node server.js # 터미널 2# 모든 개발 완료 후
.\build-portable.ps1
# 결과: dist/LectureSummarizer-Portable-v1.0.0/- 개발: main 브랜치
- 정식 릴리즈: v1.0.0 Portable 빌드 (Python, Node.js, FFmpeg, Whisper 모델 포함)
- 배포: GitHub Releases
| 서비스 | 포트 | 주소 |
|---|---|---|
| Node.js API | 3000 | http://127.0.0.1:3000 |
| Whisper | 5001 | http://127.0.0.1:5001 |
| 엔드포인트 | 메서드 | 설명 |
|---|---|---|
/process |
POST | 비디오 처리 요청 (multipart/form-data) |
/download-youtube |
POST | YouTube 영상 다운로드 (MP3) |
/api/progress/:sessionId |
GET | 진행도 조회 (0-100%) |
/api/cancel/:sessionId |
POST | 작업 취소 |
/dashboard |
GET | 웹 대시보드 페이지 |
/api/logs/:type |
GET | 로그 조회 (whisper, nodejs, whisper_error, nodejs_error) |
/api/metrics |
GET | 성능 및 시스템 메트릭 조회 |
/api/performance |
GET | 성능 데이터 조회 |
/transcribe |
POST | 음성 전사 (Whisper 서버) |
/health |
GET | 서버 상태 확인 |
server/logs/performance.json:
{
"sessions": [
{
"sessionId": "1764876082507",
"timestamp": "2025-12-05T04:19:20.512Z",
"videoInfo": {
"filename": "lecture.mp4",
"format": "mp4",
"sizeBytes": 33232037,
"durationSeconds": 845
},
"stages": {
"download": { "label": "Video processing", "duration": 16 },
"audioConversion": { "label": "Audio extraction", "duration": 3661 },
"audioSplit": { "label": "Audio splitting", "duration": 1 },
"transcription": { "label": "Speech recognition (Whisper)", "duration": 88851 },
"analysis": { "label": "Content analysis", "duration": 150006 },
"generation": { "label": "Note generation (GPT)", "duration": 34043 },
"rendering": { "label": "HTML rendering", "duration": 7 }
},
"totalTime": 276591
}
],
"statistics": {
"totalProcessed": 3,
"averageTime": 325432,
"normalized30min": {
"transcription": { "average": 170234, "count": 3 },
"analysis": { "average": 200010, "count": 3 }
}
}
}C:\LectureSummaries\ # HTML 저장
C:\ffmpeg\bin\ # FFmpeg 바이너리
문의 및 버그: Issues