Projects로 돌아가기

TimeLens

AI 문화유산 컴패니언

2026.03 - Present팀 개발AI · Gemini Live API · Gemini 2.5 Flash · Gemini 3 Pro Image

Overview

카메라를 유물에 비추면 Gemini Live 큐레이터가 음성으로 역사적 맥락을 설명하고, 손상된 유물의 복원 이미지와 일러스트 방문 다이어리까지 실시간 생성하는 박물관 컴패니언 앱. Gemini Live Agent Challenge 출품작.

Highlights

  • Gemini Live API(`gemini-2.5-flash-native-audio`) WebSocket 세션으로 PCM16 16kHz 마이크 + 1fps 카메라 프레임을 동시 스트리밍 — 별도 인텐트 분류기 없이 모델이 4개 Function Declaration으로 의도 라우팅
  • 듀얼 파이프라인 — Live(스트리밍 음성·영상) + REST(이미지 생성·외부 API) 분리로 저지연과 무거운 작업의 책임 분리
  • `recognize_artifact`만 Live 세션 내부에서 Google Search Grounding과 함께 처리, `generate_restoration` / `discover_nearby` / `create_diary`는 REST 엔드포인트로 위임
  • Google GenAI SDK + ADK 이중 경로 — WebSocket 가용 시 Live 메인, 폴백은 ADK `LlmAgent` 5개(orchestrator + curator/restoration/discovery/diary)로 텍스트 에이전트 오케스트레이션
  • Firebase Auth(익명) + Firestore에 세션·다이어리 저장, Google Places API(New)로 GPS 기반 박물관 검색 및 주변 문화유산 추천
  • Cloud Run(asia-northeast3 서울) + GitHub Actions 자동 배포, Ephemeral Token 발급 라우트로 클라이언트 키 노출 없이 Gemini 세션 생성

Deep Dive

TimeLens는 박물관 방문이라는 짧은 문맥 안에서 음성 대화·시각 인식·이미지 생성·기록 보존을 하나의 흐름으로 연결합니다. 사용자는 박물관을 선택해 세션을 열고(Search Grounding으로 오늘의 전시까지 반영된 인사를 받음), 유물을 카메라로 비추며 자연스럽게 질문하면 AI 큐레이터가 시대·문명·맥락을 설명하고, '원래 모습 보여줘'로 복원 이미지를, '다이어리 만들어줘'로 일러스트 방문 기록을 즉석에서 만들어 줍니다.

핵심 아키텍처는 듀얼 파이프라인입니다. 파이프라인 1은 앱 사용 내내 열려 있는 Gemini Live WebSocket 세션 — 마이크 PCM16/16kHz 오디오와 카메라 JPEG/1fps 프레임이 동시 송출되고, 모델이 실시간 음성 응답과 Function Call을 반환합니다. 파이프라인 2는 이미지 생성·Places 호출 같은 무거운 작업을 처리하는 Next.js API 라우트로, Function Call이 이 라우트를 트리거합니다. 인텐트 분류기를 별도로 두지 않고 모델의 도구 선택 능력에 라우팅을 위임한 것이 핵심 결정.

Function Declaration은 4개 — `recognize_artifact`만 카메라 프레임이 이미 스트리밍 중이라는 점을 활용해 Live 세션 안에서 Google Search Grounding과 함께 처리하고(REST 호출 없음), 나머지 3개(`generate_restoration` → Gemini 2.5 Flash Image, `discover_nearby` → Places API, `create_diary` → Gemini 3 Pro Image + Firestore)는 REST로 위임됩니다. WebSocket을 사용할 수 없는 환경에서는 `@google/adk` 기반의 텍스트 에이전트 오케스트레이션(orchestrator + 4 전문가)로 폴백되며, 두 경로 모두 동일한 백엔드 API를 공유합니다.

프로덕션은 Cloud Run 서울 리전에 GitHub Actions로 자동 배포되고, 클라이언트는 직접 Gemini 키를 들고 있지 않습니다 — `POST /api/session`이 Ephemeral Token을 발급해 보안과 비용 통제를 동시에 잡습니다. Firebase Firestore에는 세션·방문 기록·공유 가능한 다이어리가 저장되며, Firebase 키 없이도 앱은 정상 동작하도록 그레이스풀 디그레이드 처리됐습니다.

Stack

Next.js 15React 19TypeScript 5Tailwind CSS 4Google ADK@google/genaiFirebase FirestoreGoogle Places APICloud Run (Seoul)Docker