# 회의록 자동 생성 웹앱 (완전 무료 · 로컬 버전)

녹음 파일을 올리면 화자를 구분해서 받아 적어주는 웹앱입니다. STT/화자분리를 전부 **로컬에서 무료로 돌아가는 오픈소스 모델**로 처리합니다.

- **STT (한국어)**: [faster-whisper](https://github.com/SYSTRAN/faster-whisper) — OpenAI Whisper를 빠르게 재구현한 오픈소스
- **화자분리**: [pyannote.audio](https://github.com/pyannote/pyannote-audio) (`speaker-diarization-3.1`) — 오픈소스, 무료
- **백엔드**: Node.js(Express) — 업로드를 받아 파이썬 스크립트를 실행
- **프론트**: 순수 HTML/CSS/JS

> ⚠️ 인터넷 연결은 **처음 모델을 내려받을 때만** 필요합니다. 그 이후로는 완전 오프라인으로 동작합니다. 클라우드 API 요금은 전혀 들지 않습니다.
>
> 회의록 요약(Claude API 연동) 기능은 아직 프론트와 연결되어 있지 않습니다 — 다음 단계에서 추가할 예정입니다. 지금은 화자별 대화록까지만 나옵니다.

## 1. 준비물

- Node.js 18+
- Python 3.9~3.11 (pyannote/torch 호환성 상 3.12는 아직 이슈가 있을 수 있어요)
- [ffmpeg](https://ffmpeg.org/download.html) (오디오 변환용 — `brew install ffmpeg` 또는 `apt install ffmpeg`)
- HuggingFace 계정 (화자분리 모델 이용약관 동의용, 무료)

## 2. 설치

### 2-1) Node 의존성
```bash
npm install
```

### 2-2) 파이썬 의존성
```bash
cd python
python3 -m venv venv
source venv/bin/activate   # Windows는 venv\Scripts\activate
pip install -r requirements.txt
cd ..
```

### 2-3) pyannote 화자분리 모델 접근 권한
1. https://hf.co/settings/tokens 에서 Access Token 발급 (Read 권한)
2. 아래 두 페이지에서 각각 로그인 후 **"Agree and access repository"** 클릭
   - https://huggingface.co/pyannote/segmentation-3.0
   - https://huggingface.co/pyannote/speaker-diarization-3.1

### 2-4) 환경변수
```bash
cp .env.example .env
```
`.env`를 열어서:
- `HF_TOKEN` : 위에서 발급한 HuggingFace 토큰
- `PYTHON_BIN` : 가상환경을 만들었다면 `./python/venv/bin/python` 으로 지정 (Windows는 `.\python\venv\Scripts\python.exe`)
- `WHISPER_MODEL` : 기본 `medium`. GPU 있으면 `large-v3`로 올려도 좋음
- `WHISPER_DEVICE` : GPU(NVIDIA) 있으면 `cuda`, 없으면 `cpu`

## 3. 실행

```bash
npm start
# http://localhost:3000 접속
```

## 4. 사용 흐름

1. 녹음 파일 업로드 (MP3, WAV, M4A, AAC, FLAC, OGG, MP4 등)
2. 참석 인원을 알면 최소/최대 인원 입력 (모르면 비워두면 자동 추정)
3. "받아쓰기 시작" → 화자별로 구분된 대화록 확인, 화자 이름/문장 직접 수정 가능
4. "대화록 복사"로 텍스트 복사해서 활용

## 5. 성능/정확도 참고

- **속도**: CPU만 있으면 `medium` 모델 기준으로 녹음 길이의 1~3배 정도 시간이 걸릴 수 있어요 (컴퓨터 성능에 따라 다름). GPU(NVIDIA)가 있으면 훨씬 빠릅니다.
- **정확도**: `large-v3`가 가장 정확하지만 느립니다. 우선 `medium`으로 테스트해보고 부족하면 올리세요.
- **화자분리**: 화자 수를 미리 알고 있으면 입력해주는 편이 훨씬 정확합니다. 겹쳐 말하는 구간이 많으면 정확도가 떨어질 수 있어요.
- 처음 실행 시 Whisper/pyannote 모델을 각각 내려받습니다 (수백MB~수GB, 모델 크기에 따라 다름). 이후에는 캐시되어 오프라인으로 동작합니다.

## 6. 다음 단계 (예정)

- 화자별 대화록 → Claude API로 회의록 요약 (개요/참석자/결정사항/액션아이템). 서버 쪽 `/api/summarize`는 이미 만들어져 있고, 프론트와 연결만 하면 됩니다.
- 원하면 요약도 완전 무료(로컬 LLM, 예: Ollama)로 바꿀 수 있어요.
