mirror of
https://github.com/nad4-su/meeting-minutes.git
synced 2026-08-12 14:23:24 +09:00
3b9692e8570bb1ed4cb7182d86b2ee9b999f848a
녹음 중 30초 간격으로 Gemini가 중간 회의록을 갱신하고, 녹음 중지 시 최종 회의록을 자동 생성한다. Gemini 실패 시 단순 변환 마크다운으로 폴백하여 사용자는 항상 결과물을 받는다. - 실시간 요약 폴링 (25단어 시작, 40단어 증분 게이트) - 429 쿼터 초과 60초 쿨다운 + 일반 실패 지수 백오프 - Web Speech API 네트워크 단절 자동 재연결 (최대 8회) - Hydration mismatch (React #418) 수정 — isSupported를 mount 후 결정 - gemini-2.5-flash-lite 모델로 통일 (무료 등급 15 RPM / 1000 RPD) - Gemini 호출 URL → x-goog-api-key 헤더 인증으로 전환 - 좌우 분할 뷰 (실시간 텍스트 / 실시간 회의록) + 자동 스크롤 - 진행률 바, 쿨다운 카운터, interim 텍스트 커서 - Prisma 7 호환 위해 schema.prisma의 datasource url 제거 (prisma.config.ts로 이동됨) - Docker Compose에 test 프로필 서비스 추가 (vitest 38 tests)
Meeting Minutes - 회의록 자동 작성 서비스
음성 녹음을 텍스트로 변환하고, 구조화된 회의록을 자동 생성하는 웹 서비스입니다.
주요 기능
- 실시간 녹음 — 브라우저에서 바로 음성 인식 (Web Speech API, Chrome 권장)
- 파일 업로드 — MP3, WAV, WebM, M4A, OGG, FLAC 지원 (최대 500MB)
- 두 가지 변환 모드 — 단순 STT→마크다운 변환 / Gemini AI 요약 비교
- 내보내기 — 마크다운(.md), HTML(.html) 다운로드 및 클립보드 복사
- 회의록 저장 — PostgreSQL 데이터베이스 영속 저장
기술 스택
| 구분 | 기술 |
|---|---|
| 프레임워크 | Next.js 16 + TypeScript |
| STT | Web Speech API (무료) |
| AI 요약 | Gemini API (무료 티어) |
| DB | PostgreSQL 16 + Prisma ORM |
| 테스트 | Vitest (31개 테스트, 96% 커버리지) |
| 배포 | Docker Compose |
Docker로 실행하기
사전 요구사항
- Docker 및 Docker Compose 설치
1. 저장소 클론
git clone git@github.com:nad4-su/meeting-minutes.git
cd meeting-minutes
2. 환경 변수 설정
cp .env.example .env
.env 파일을 열어 필요한 값을 수정합니다:
# PostgreSQL (기본값 사용 가능)
DATABASE_URL="postgresql://meetinguser:meetingpass@db:5432/meetingminutes"
POSTGRES_USER=meetinguser
POSTGRES_PASSWORD=meetingpass
POSTGRES_DB=meetingminutes
# Gemini API (선택사항 - AI 요약 기능에 필요)
# https://aistudio.google.com/apikey 에서 무료 발급
GEMINI_API_KEY=여기에_API_키_입력
Gemini API 키가 없어도 단순 변환 모드는 정상 동작합니다.
3. Docker Compose 실행
docker compose up -d
처음 실행 시 이미지 빌드에 시간이 걸릴 수 있습니다.
4. DB 마이그레이션
docker compose exec app npx prisma migrate deploy
5. 접속
브라우저에서 http://localhost:3000에 접속합니다.
서비스 관리
# 로그 확인
docker compose logs -f app
# 서비스 중지
docker compose down
# 서비스 중지 + DB 데이터 삭제
docker compose down -v
# 이미지 재빌드 (코드 변경 후)
docker compose up -d --build
로컬 개발 (Docker 없이)
npm install
npm run dev
http://localhost:3000에서 확인합니다.
테스트
npm test # 전체 테스트
npm run test:watch # 워치 모드
npm run test:coverage # 커버리지 리포트
프로젝트 구조
src/
├── app/
│ ├── api/
│ │ ├── upload/route.ts # 파일 업로드 API
│ │ └── summarize/route.ts # 회의록 생성 API
│ ├── page.tsx # 메인 UI
│ └── layout.tsx
├── lib/
│ ├── audio-validation.ts # 오디오 파일 검증
│ ├── upload-handler.ts # 업로드 처리
│ ├── transcript-formatter.ts # STT 결과 포매팅
│ ├── minutes-generator.ts # 회의록 생성 (단순/Gemini)
│ └── export-minutes.ts # MD/HTML 내보내기
├── hooks/
│ └── useSpeechRecognition.ts # 실시간 음성 인식 훅
├── components/
│ ├── upload/AudioUploader.tsx
│ ├── recorder/LiveRecorder.tsx
│ └── minutes/MinutesViewer.tsx
└── __tests__/ # 31개 테스트
Languages
TypeScript
98%
CSS
1.3%
Dockerfile
0.4%
JavaScript
0.3%