V.O.M은 글을 읽지 못하는 엄마들을 위한 음성 기반 육아 도우미 앱입니다. NFC/QR 카드를 스캔하면 음성으로 물건 사용법을 안내하고, AI 챗봇이 육아 질문에 답변합니다.
- 글을 읽지 못해 약 설명서, 제품 사용법을 이해하기 어려운 엄마들
- 응급 상황에서 빠른 대응이 필요한 순간
- 육아 지식 접근성 문제
- NFC/QR 스캔 → 음성 안내 (체온계, 기저귀, 분유 등)
- AI 음성 챗봇 → 육아 질문 답변 (Gemini AI)
- 단계별 그래픽 애니메이션 → 시각적 학습 지원
- 위험 키워드 감지 → 실시간 알림 시스템
VOM/
├── vom-web/ # Next.js 관리자 대시보드
│ ├── src/
│ │ ├── app/ # App Router
│ │ └── components/ # React 컴포넌트
│ ├── package.json
│ └── .env.local # 환경 변수 (생성 필요)
│
├── vom_user_flutter/ # 사용자/가족용 앱
│ ├── lib/
│ │ ├── screens/ # 화면 (Home, Learning, VoiceChat 등)
│ │ ├── services/ # 서비스 (AI, TTS, NFC, Supabase)
│ │ └── constants/ # 상수, 색상, 콘텐츠
│ ├── android/ # Android 설정
│ └── pubspec.yaml # Flutter 의존성
│
├── vom_admin_flutter/ # 관리자용 앱
│ ├── lib/
│ │ ├── screens/ # Dashboard, Users 등
│ │ └── services/ # Supabase 서비스
│ └── pubspec.yaml
│
├── VOM_User_v2.apk # 사용자 앱 (63MB)
├── VOM_Admin_v2.apk # 관리자 앱 (17MB)
├── supabase_schema.sql # DB 스키마
├── DEPLOYMENT.md # 배포 가이드
└── GEMINI_API_SETUP.md # AI 설정 가이드
git clone https://github.com/chadolmin01/VOM.git
cd VOMcd vom-web
npm install.env.local 파일 생성:
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_anon_keynpm run dev
# http://localhost:3000npm run build
vercel --prodcd vom_user_flutter
flutter pub getlib/services/ai_chat_service.dart 파일 수정:
static const String _apiKey = 'YOUR_GEMINI_API_KEY';AIzaSyBT1psDP7a2AqYPTzWW_tAyrsbKAbvBRNY)는 보안상 교체 필요
- Google AI Studio에서 새 키 발급
# 개발 모드
flutter run
# APK 빌드
flutter build apk --release
# 출력: build/app/outputs/flutter-apk/app-release.apkcd vom_admin_flutter
flutter pub get
flutter run- Framework: Next.js 14.2.35 (App Router)
- Language: TypeScript
- Styling: Tailwind CSS
- Database: Supabase (PostgreSQL)
- Deployment: Vercel
- Features:
- 실시간 구독 (Supabase Realtime)
- 서버 컴포넌트
- 반응형 디자인
- Framework: Flutter 3.x
- Language: Dart
- 주요 패키지:
google_generative_ai- Gemini AI 챗봇flutter_nfc_kit- NFC 태그 읽기 (백그라운드 지원)mobile_scanner- QR 코드 스캔speech_to_text- 음성 인식 (STT)flutter_tts- 음성 출력 (TTS)supabase_flutter- 백엔드 연동audioplayers- 오디오 재생record- 음성 녹음
- Database: Supabase (PostgreSQL)
- Storage: Supabase Storage
- Realtime: Supabase Realtime Subscriptions
- Tables:
users- 사용자 정보card_contents- 학습 콘텐츠nfc_card_mappings- NFC/QR 매핑learning_logs- 학습 기록risk_keywords- 위험 키워드
- 앱 실행 중 NFC 카드 태그 또는 QR 스캔
- 즉시 학습 화면으로 전환 (다이얼로그 없음)
- 앱이 백그라운드에 있을 때도 NFC 감지
- 시스템이 자동으로 앱 실행 → 학습 화면
- 구현 위치:
vom_user_flutter/android/AndroidManifest.xml- NFC intent-filterMainActivity.kt- NFC Intent 처리lib/services/nfc_intent_service.dart- Flutter 연동
- 한국어 음성 출력
- 속도: 0.4배 (천천히, 또박또박)
- 단계별 스크립트 재생
- 이모지 기반 시각적 가이드
- 예시 (체온계): 🌡️ → 💪 → ⏱️ → ✅
- 현재 단계 강조, 완료 체크 표시
1. Loading → 준비 중
2. Playing → TTS 음성 + 애니메이션
3. Recording → 따라 말하기 (선택)
4. Quiz → 퀴즈 (선택)
5. Complete → 학습 완료
- 육아 관련 질문 답변 (음성 입력/출력)
- 컨텍스트 인식: 현재 학습 중인 카드 내용 반영
- 주제 제한: 육아/건강/아이돌봄만 답변
- 홈 화면 또는 학습 화면에서 로봇 아이콘(🤖) 클릭
- 마이크 버튼 꾹 누르고 말하기
- 버튼에서 손 떼면 자동 인식
- AI가 음성으로 답변
- API 키 없어도 키워드 기반 응답 가능
- 예시:
- "열이 많아요" → 해열제 안내
- "숨 못 쉬어요" → 119 전화 안내
- 사용자 수, 학습 횟수 통계
- 최근 학습 활동 로그
- 위험 키워드 감지 알림
- NFC/QR 카드 등록/수정/삭제
- 학습 콘텐츠 관리
- 매핑 관리 (카드 ID ↔ 콘텐츠)
lib/
├── main.dart # 앱 진입점
├── screens/
│ ├── tag_wait_screen.dart # NFC/QR 대기 화면
│ ├── learning_screen.dart # 학습 화면 (TTS + 애니메이션)
│ ├── voice_chat_screen.dart # AI 챗봇 화면
│ └── scan_screen.dart # QR 스캔 화면
├── services/
│ ├── ai_chat_service.dart # Gemini AI (⚠️ API 키 포함)
│ ├── stt_service.dart # 음성 인식
│ ├── tts_service.dart # 음성 출력
│ ├── nfc_intent_service.dart # 백그라운드 NFC
│ ├── supabase_service.dart # DB 연동
│ └── vibration_service.dart # 진동 피드백
└── constants/
├── nfc_contents.dart # 폴백 콘텐츠 (오프라인)
└── app_colors.dart # 컬러 팔레트
// lib/constants/nfc_contents.dart
final fallbackContents = [
CardContent(
id: 'new_card',
name: '새 물건',
icon: '🆕',
scripts: ['1단계 설명', '2단계 설명'],
quizQuestion: '퀴즈 질문',
quizOptions: ['선택1', '선택2', '선택3'],
quizCorrectIndex: 0,
),
];// lib/screens/learning_screen.dart - _getStepEmojis()
case '새 물건':
return ['🆕', '📝', '✅'];// lib/services/ai_chat_service.dart - _getOfflineResponse()
if (message.contains('새키워드')) {
return '새로운 답변 내용';
}flutter logs// lib/screens/tag_wait_screen.dart
debugPrint('NFC 태그 ID: $tagId');// lib/services/ai_chat_service.dart
debugPrint('Gemini 응답: $text');id uuid PRIMARY KEY
name text
email text UNIQUE
phone text
role text (user/admin)
created_at timestampid text PRIMARY KEY
name text
icon text
scripts text[]
quiz_question text
quiz_options text[]
quiz_correct_index integer
audio_url text
video_url text
created_at timestampid uuid PRIMARY KEY
nfc_tag_id text UNIQUE
qr_code text UNIQUE
card_id text (FK → card_contents)
created_at timestampid uuid PRIMARY KEY
user_id uuid (FK → users)
card_id text (FK → card_contents)
completed boolean
duration_seconds integer
speech_text text
created_at timestampid uuid PRIMARY KEY
keyword text
severity text (low/medium/high)
created_at timestamp# Supabase SQL Editor에서 실행
psql -f supabase_schema.sqlerror: Module was compiled with an incompatible version of Kotlin
해결:
# android/settings.gradle 확인
id "org.jetbrains.kotlin.android" version "2.1.0" apply false
# Clean 후 재빌드
flutter clean
flutter pub get
flutter build apk --release- 포그라운드: 앱 실행 → TagWaitScreen에서 카드 태그
- 백그라운드: Android only, iOS는 미지원
- 권한 확인: AndroidManifest.xml에 NFC 권한 있는지 확인
- API 키 확인:
lib/services/ai_chat_service.dart - 인터넷 연결 확인
- Gemini 크레딧 확인 (1,500 requests/day)
# 권한 확인
flutter run --verbose
# TTS 엔진 확인 (Android)
# 설정 → 접근성 → 텍스트 음성 변환 출력# 환경 변수 확인
vercel env ls
# 환경 변수 추가
vercel env add NEXT_PUBLIC_SUPABASE_URL
vercel env add NEXT_PUBLIC_SUPABASE_ANON_KEY문제: Gemini API 키가 GitHub에 공개되었습니다
// vom_user_flutter/lib/services/ai_chat_service.dart
static const String _apiKey = 'AIzaSyBT1psDP7a2AqYPTzWW_tAyrsbKAbvBRNY';해결 방법:
-
즉시 키 교체
- https://aistudio.google.com/app/apikey
- 기존 키 삭제
- 새 키 발급
-
환경 변수 사용 (권장)
// 새로운 방식 static const String _apiKey = String.fromEnvironment('GEMINI_API_KEY');
-
.gitignore 추가
**/ai_chat_service.dart *.env
- API 키는 환경 변수로 관리
.env파일은.gitignore에 추가- Supabase RLS (Row Level Security) 활성화
- NFC/QR 스캔 시스템
- 백그라운드 NFC 지원 (Android)
- 음성 기반 학습 (TTS)
- 단계별 그래픽 애니메이션
- AI 음성 챗봇 (Gemini)
- 오프라인 키워드 응답
- 학습 기록 저장
- 관리자 대시보드
- 실시간 모니터링
- 위험 키워드 알림
- Vercel 배포
- GitHub 배포
- 보안: API 키 환경 변수화
- 테스트: 실제 NFC 카드로 테스트
- 콘텐츠: 더 많은 육아 물품 추가
- UI/UX: 사용자 피드백 반영
- 성능: APK 크기 최적화 (현재 63MB)
- 음성 싱크 애니메이션 (TTS와 그래픽 동기화)
- 다국어 지원 (영어, 베트남어)
- 오프라인 모드 개선
- 학습 통계 그래프
- 푸시 알림 (위험 상황)
- Google Play 배포
main/master - 프로덕션 (Vercel 자동 배포)
develop - 개발 브랜치
feature/* - 새 기능
bugfix/* - 버그 수정
feat: 새 기능 추가
fix: 버그 수정
docs: 문서 수정
style: 코드 포맷팅
refactor: 리팩토링
test: 테스트 추가
chore: 빌드/설정 변경
- Fork 후 브랜치 생성
- 기능 구현 및 테스트
- PR 생성 (상세한 설명 포함)
- 리뷰 후 Merge
- GitHub: https://github.com/chadolmin01/VOM
- 웹 대시보드: https://vom-web.vercel.app
- Gemini API: https://aistudio.google.com/app/apikey
- Supabase: https://supabase.com
- Flutter Docs: https://docs.flutter.dev
MIT License - 자유롭게 사용, 수정, 배포 가능
이 프로젝트는 Hult Prize 2026 해커톤을 위해 개발되었습니다. 글을 읽지 못하는 엄마들이 자신감을 갖고 아이를 돌볼 수 있도록 돕는 것이 목표입니다.
"모든 엄마는 훌륭한 엄마입니다."
Made with ❤️ by V.O.M Team