nad4 3b9692e857 feat: 실시간 롤링 요약 + 자동 최종 회의록 생성
녹음 중 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)
2026-04-21 17:24:25 +09:00
2026-04-11 01:27:03 +09:00
2026-04-11 01:27:03 +09:00

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로 실행하기

사전 요구사항

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개 테스트
S
Description
No description provided
Readme MIT
297 KiB
Languages
TypeScript 98%
CSS 1.3%
Dockerfile 0.4%
JavaScript 0.3%