산책도감 NatureSnap: AI 듀얼 엔진으로 동식물을 식별하다
GPT-4o + Claude 듀얼 AI, 5가지 아트 스타일 일러스트, TTS 음성 가이드까지. Flutter 크로스플랫폼 필드가이드 앱 개발기.
🌿 산책을 기록으로 바꾸는 앱
산책하다 길가에 핀 꽃이 뭔지, 나무 위에 앉은 새가 뭔지 궁금했던 적이 있다. 사진을 찍고 검색하면 되긴 하는데, 매번 그러기엔 번거롭다.
사진 한 장이면 종 이름부터 생태 이야기, 일러스트, 음성 해설까지 자동으로 만들어주는 앱을 만들기로 했다.
🤖 듀얼 AI 엔진: GPT-4o + Claude
단일 AI만 쓰면 간헐적으로 식별이 실패할 때가 있다. 그래서 OpenAI GPT-4o를 메인 엔진, Claude Sonnet을 폴백 엔진으로 설계했다.
하나의 사진에 대해 3개 후보 종을 신뢰도(Confidence)와 함께 제시한다. AI가 100% 정확할 수 없다는 걸 솔직하게 보여주는 게 오히려 신뢰감을 준다고 판단했다.
// 듀얼 엔진 폴백 로직
try {
result = await openAIService.identify(image);
} catch (e) {
result = await claudeService.identify(image);
}Rate Limit(429)이 걸릴 때는 지수 백오프(3초→6초→12초, 최대 3회)로 자동 재시도한다.
🎨 5가지 아트 스타일 일러스트
종이 식별되면 AI가 해당 종의 일러스트를 자동 생성한다. 사용자가 5가지 스타일 중 원하는 것을 고를 수 있다.
| 스타일 | 느낌 |
|---|---|
| 수채화 | 식물도감 풍 보태니컬 아트 |
| 수묵화 | 동양적 미니멀 |
| 동화풍 | 아이들도 좋아하는 따뜻한 느낌 |
| 사실적 | 하이퍼리얼리스틱 디지털 페인팅 |
| 픽셀아트 | 16비트 레트로 게임 스타일 |
마지막으로 선택한 스타일을 기억해서 다음 식별 때 기본값으로 설정해준다.
🔊 TTS 음성 가이드
OpenAI TTS(음성: nova, 속도: 0.95x)로 생태 이야기를 읽어준다. 산책하면서 이어폰으로 들을 수 있게 만들었다.
캐시 전략이 중요했다. 같은 종에 대해 매번 TTS를 생성하면 비용이 크기 때문에 종 ID 기반 파일명으로 캐싱하고, 200MB 한도를 넘으면 오래된 파일부터 자동 정리한다.
🏆 게이미피케이션: 스트릭 & 일일미션
단순히 도감만 채우면 질릴 수 있다. 그래서 두 가지 동기부여 시스템을 넣었다.
연속 발견 스트릭: 매일 하나 이상 발견하면 스트릭이 쌓인다. 7일, 14일, 30일, 100일 마일스톤에 알림을 준다.
일일미션: "오늘은 식물 1종을 발견하세요" 같은 카테고리별 미션. 식물·조류·곤충·포유류 5개 카테고리, 각 50종 목표로 진행도를 보여준다.
📱 기술 스택
- Framework: Flutter (Dart) — Android + iOS 크로스플랫폼
- 상태관리: Riverpod (불변 상태 패턴)
- 로컬 DB: Hive (NoSQL, TypeAdapter 코드 생성)
- 네트워크: Dio (HTTP 클라이언트 + 재시도 로직)
- 카메라: image_picker + flutter_image_compress
- 다국어: 한국어·영어·일본어 (시스템 로케일 자동 감지)
📋 현재 상태 (v2.0)
- AI 식별 + 3후보 제시 ✅
- 5종 아트 스타일 일러스트 ✅
- TTS 음성 가이드 ✅
- 스트릭 + 일일미션 ✅
- 컬렉션 검색·정렬·필터 ✅
- 삭제 실행 취소 (5초 복구) ✅
- Hive DB 백업 보호 ✅
🔜 다음 단계
- v2.1: iCloud/Google Drive 동기화, 컬렉션 페이지네이션, 오프라인 모드
- App Store + Google Play 동시 출시 목표
- 한국 도심 주변 종에 특화된 데이터 튜닝
바로맵이 "급할 때 1초" 앱이라면, 산책도감은 "여유로운 산책을 풍요롭게" 만드는 앱이다. 두 앱이 정반대의 템포를 가지고 있어서 만드는 재미가 있다.