1. 제품 개요
한 줄 정의: 해외 여행자가 현지인에게 자신있게 말을 걸 수 있도록, 표현을 입력 → 번역 → 발음 → 음성까지 한 앱에서 처리하고, 모은 표현(씨앗)을 볼주머니에 담아 꺼내 쓰는 iOS 도구.
MVP 핵심 가치
- 외국어 워크플로우(번역기 / TTS / 발음 검색)를 외부 앱 없이 이 앱 하나로 닫는다.
- 모은 씨앗이 사용자 자산으로 쌓여, 시간이 갈수록 가치가 증가한다.
- 여행 전 / 비행기 학습 / 현장 모든 시점에서 같은 자산을 활용.
해결하는 페인
- Gemini로 번역+한글 발음을 받고, 각 문장을 파파고에 복붙해 음성을 듣는 워크플로 → 도구 전환·복붙 노동
- 모은 표현이 휘발되어 매번 새로 검색
2. 메타포 — 볼주머니와 씨앗
햄스터가 볼주머니에 먹이를 모으듯, 사용자는 표현을 차곡차곡 담는다. 모든 UI 카피·시각 디자인은 이 메타포를 따른다.
🐹 볼주머니 (CheekPouch)
하루에 담을 수 있는 씨앗의 양. 일일 한도 10개(시작값). 볼주머니 인디케이터는 0/10/30/50/70/100%로 차오르는 6프레임 시각 표현. 자정에 자동 비워짐.
🌱 씨앗 (Seed)
하나의 표현 카드. 외국어·한글 발음·한국어·대화 맥락·TTS·카테고리·톤을 가진다. 여러 주머니에 동시에 담길 수 있다(다대다).
👜 주머니 (Collection)
씨앗을 분류해 담는 컨테이너. 여행지·테마·자동 그룹 등. 색상·표지·언어 라벨을 가진다. "전체 씨앗" 자동 주머니 항상 존재.
📅 누적 자산
담은 씨앗 총 개수 + 연속 학습일(스트라이크). 마일스톤(50/100/500)에 격려 카피.
상세 카피·금지어는 tone.html 참조.
3. 타겟·시나리오
페르소나: 해외 여행 중, 현지인에게 말을 걸고 싶지만 자신이 없어 미리 표현을 준비하고 현장에서 꺼내 쓰고 싶은 한국어 사용자. 여러 나라를 다니며 언어가 섞이는 경우 포함.
사용 시점
- 여행 전: 책상/숙소에서 표현 모으기 (블로그 캡처, 직접 입력)
- 비행기 안: 오프라인 전체 재생으로 복습
- 여행 현장: 식당·택시·길거리에서 즉시 꺼내 보고 듣기, 음성으로 즉석 추가
주요 시나리오 7가지
- 출국 전 블로그 스크린샷 일괄 변환 → 한 주머니로 담기
- 라멘 가게에서 주머니 열고 한 손 재생
- 호텔에서 즉석 타이핑 또는 음성 입력
- 비상 상황에서 정중 톤으로 재변환
- 누적된 씨앗을 2단 필터(언어 + 카테고리)로 찾기
- 친구·가족에게 주머니 단위로 공유
- 1년 뒤 재방문 시 자산으로 누적된 씨앗 재사용
4. 기능 명세 (MVP v1.0)
4.1 입력 (3종)
| 방식 | 구현 | UX |
|---|---|---|
| 타이핑 | 텍스트 필드 (멀티라인) | 한국어로 직접 입력. 여러 문장 가능. |
| 스크린샷 | iOS PHPicker + 카메라 + 클립보드 | 다단계 플로우: Source Sheet → Detect(OCR) → Confirm |
| 음성 | iOS SFSpeechRecognizer (온디바이스, 무료) | 마이크 큰 버튼 누르고 말하기. 결과 텍스트 편집 가능 |
스크린샷 입력의 다단계 플로우
- Source Sheet — 최근 스크린샷 그리드(텍스트 감지 배지 표시) + 사진 보관함 / 카메라 / 클립보드
- Detect — 어두운 뷰어에 OCR 오버레이. 영역별 토글로 담을 문장만 선택. "전체 선택/해제" 지원
- Confirm — 담을 씨앗 미리보기. 언어·톤·카테고리 일괄 설정. 항목별 삭제 가능
입력된 한국어는 자동으로 발화 단위(utterance)로 분할 (멀티모달 LLM이 처리).
4.2 처리 (백엔드 단일 호출 POST /translate)
LLM 1회 호출로 다음을 한 번에 받음:
- 자연스러운 외국어 번역 (직역 X)
- 한글 발음 표기 (현지 발음 들리는 그대로)
- 카테고리 추천 (다중 선택 가능)
- 톤 (입력 컨텍스트에서 추론, 기본 정중) — 씨앗 생성 시 확정, 추후 변경 시 새 씨앗으로 재생성
- 대화 맥락 (상대 → 나 → 상대 응답, 각 줄에 외국어 + 한국어 + 발음)
이어서 TTS API 3회 호출:
- 내 표현 mp3
- 대화 상대 첫 줄 mp3
- 대화 상대 두 번째 줄 mp3
응답: 모든 텍스트 + 3개 mp3(base64)가 하나의 JSON으로.
카테고리 (자동 추천)
한 씨앗에 여러 카테고리 동시 부여 가능 (다중 분류). 사용자가 추가·해제 가능.
톤
4.3 데이터 모델
위치: iOS 로컬 (SwiftData 또는 Core Data + FileManager). 사용자 데이터는 폰에만.
Card (씨앗) 모델
Card {
id: UUID
languageCode: String // "ja", "es", "en", ...
langLabel: String // "일본어"
korean: String // 한국어 원문
foreign: String // 외국어 번역
pronunciation: String // 한글 발음
categories: [String] // 다중 분류 (예: ["식당/카페", "관광/구경"])
tone: Tone // .auto | .polite | .friendly (생성 시 확정)
dialogue: Dialogue? // 3턴 대화 (상대-나-상대)
mp3Mine: URL // 내 표현 mp3 파일 경로
mp3DialogueBefore: URL?
mp3DialogueAfter: URL?
createdAt: Date
// 컬렉션 소속은 Collection.cardIDs로 관리 (다대다)
}
Dialogue {
before: Line // {speaker, foreign, pronunciation, korean}
self: Line
after: Line
}
Collection (주머니) 모델
Collection {
id: UUID
name: String // 가변 (예: "도쿄 식당 표현")
color: Color // 6가지 팔레트 중
cover: Cover // .auto | .icon(SF) | .photo(URL)
isUserCreated: Bool
isShared: Bool // 공유받은 주머니는 읽기 전용
cardIDs: [UUID] // 다대다 — 한 카드가 여러 주머니에 들어감
createdAt: Date
latestActivityAt: Date
}
"전체 씨앗"은 항상 존재하는 자동 주머니. 모든 카드를 포함. 다른 주머니에서 카드 제거 시 카드 자체는 삭제되지 않음 (전체 씨앗에는 남음).
다대다 관계
spec v0.3의 단일 groupId 모델은 폐기.
한 씨앗은 0개 이상의 주머니에 동시 소속 가능.
UI에서 "주머니에 담기" 시트로 토글.
4.4 화면 구성 (요약)
상세 와이어프레임·메뉴 트리는 ux.html, 실제 스크린샷은 screen-catalog.html.
주요 화면
- Login — Apple / Google / Kakao / 이메일
- Home — 검색바, 최근 본 씨앗, 내 주머니 그리드, 공유받은 주머니, 볼주머니 인디케이터
- Collection Detail — 한 주머니의 씨앗 목록, 전체 재생, 정렬/뷰 토글
- Card Detail — 외국어/발음/한국어 + 내 표현 듣기 / 대화 전체 듣기 + 카테고리 / 톤 / 주머니 소속
- Input (Typing / Voice / Screenshot 3-step)
- Search — 외국어 · 발음 · 한국어 · 주머니 이름 매칭
- Friends — 친구 목록, 받은 주머니, 공유 요청
- Me — 프로필, 누적 통계, 학습 달력, 일일 볼주머니 위젯
- Settings / Help / Info
4.5 씨앗·주머니 관리
| 기능 | UX | 버전 |
|---|---|---|
| 카테고리 변경 (다중) | 카테고리 칩 탭 → 시트 → 토글 | v1.0 |
| 톤 변경 | 씨앗 ⋯ → 톤 선택 → 새 씨앗으로 재생성 (원본 보존 또는 교체 옵션) | v1.0 |
| 주머니 이름 변경 | 주머니 헤더 탭 → 인라인 편집 | v1.0 |
| 주머니 삭제 | ⋯ → 확인. 씨앗은 "전체 씨앗"에 남음 | v1.0 |
| 씨앗 주머니 이동 (다대다 토글) | 씨앗 ⋯ → "주머니에 담기" 시트 → 다중 체크 | v1.0 |
| 새 주머니 생성 | 홈 + → "주머니 만들기" → 이름·색·표지 | v1.0 |
| 다중 카드 선택 편집 | 편집 모드 → 다중 선택 → 하단 액션 | v1.1 |
4.6 재생
- 내 표현 듣기 — 단일 mp3 재생 (
AVAudioPlayer). 재생 중 단어별 시각 하이라이트(현재 토큰 강조). - 대화 전체 듣기 — 3개 mp3 순차 재생 (delegate 체인, 사이 ~0.8초). 현재 줄 강조 + 좌측 인디케이터 + 재생 중 배지.
- 전체 재생 — 주머니 또는 필터 결과의 모든 씨앗을 순차 재생 (씨앗당 내 표현, 사이 간격).
- 속도 — 설정에서 느리게 / 보통 / 빠르게
- 목소리 — 설정에서 여성 / 남성
4.7 검색·필터
- 2단 필터 — 언어 칩 + 카테고리 칩 (AND 누적, 같은 칩 재탭 시 해제, "초기화" 버튼)
- 전역 검색 — 외국어 / 한글 발음 / 한국어 / 주머니 이름 매칭
- 정렬 — 최신 활동순 · 가나다 · 씨앗 많은 순
- 뷰 토글 — 컴팩트 리스트 ↔ 2열 그리드
4.9 일일 볼주머니 (Daily Cheek Pouch)
여행자가 매일 볼주머니에 씨앗을 담는 메타포. "한도, 차감" 같은 차가운 언어는 절대 사용하지 않는다 (tone.html 참조).
- 무료: 하루 10개 (시작값)
- 가득 차면: "오늘 볼주머니가 가득 찼어요. 내일 또 같이 채워봐요"
- 자정 리셋 (사용자 로컬 시간 기준)
- 친구 초대 보너스: 1명 초대 = +1 (영구, v1.0)
비주얼 인디케이터 (v1.0)
- 홈 + Me 화면의 볼주머니 위젯 (햄스터 마스코트)
- 6단계 채움: 0% → 10% → 30% → 50% → 70% → 100%
- 10개 슬롯 점(dot)으로 정확한 수 표시
- 가득 차면 색 변화 + 메시지
- 탭 시 반응 버블(윙크·반짝거림 등 5종 랜덤)
4.10 누적 마일스톤
- 50, 100, 500개 누적 시 토스트 메시지 + 가벼운 햅틱 + 가방 아이콘 흔들림
- 새 언어 추가 시: "○○어도 시작했어요! 이제 N개 언어 동반자네요"
- 연속 학습일(스트라이크): Me 화면에 "N일 째" 표시
카피 전문은 tone.html 참조.
5. 비기능 요구사항
| 항목 | 목표 |
|---|---|
| 변환 응답 시간 | 1입력 기준 3초 이내 (LLM + TTS×3) |
| 로컬 카드 로딩 | 1초 이내 |
| 사용자당 월 변동비 | $0.05~0.10 (Haiku + TTS Standard) |
| 보안 | API 키 서버에만 · 사용자 데이터 폰에만 · 백엔드 stateless |
| 접근성 | VoiceOver, 동적 타입 (S/M/L 3단계 토글 + iOS Dynamic Type) |
| 오프라인 | 저장된 씨앗의 모든 기능 정상 (재생·필터·검색·공유) |
| UI 언어 | 한국어 |
| 다크 모드 | system / light / dark 토글 |
| 마이크 권한 | 음성 입력 사용 시 요청, 거부 시 타이핑 fallback |
6. 기술 스택
6.1 클라이언트
- iOS 네이티브 (Swift, SwiftUI, iOS 16+)
- 저장: SwiftData (또는 Core Data) + FileManager
- 음성 입력:
SFSpeechRecognizer - 오디오 재생:
AVAudioPlayer(단일 + delegate 체인으로 순차 재생) - 공유:
UIActivityViewController/ShareLink
6.2 백엔드 (서버리스)
- 런타임: Cloudflare Workers 또는 Vercel Edge Functions (TBD)
- 형태: stateless 프록시, 단일 엔드포인트
POST /translate - 입력: 텍스트 또는 이미지(base64) + 타겟 언어 + 톤 옵션
- 출력: JSON (모든 텍스트 + 3개 mp3 base64)
- 사용자 데이터 저장 없음
6.3 외부 API
- LLM: Claude Haiku 또는 Gemini Flash (멀티모달, 저비용)
- TTS: Google Cloud TTS Standard
- OCR: 멀티모달 LLM에 직접 처리 (별도 OCR 불필요)
- STT: iOS
SFSpeechRecognizer(온디바이스, 무료)
7. 화면 흐름 (요약)
- Login → Tabs
- Home → Card Detail (재생 / 시트들)
- + → Input → Processing → Card Detail / Collection Detail
- Search → Card Detail
- Collection 헤더 탭 → Collection Detail → Card Detail
- Collections → Collection Detail → Card Detail
- Friends → Received Pouch → 읽기 전용 Collection Detail
- Me → 볼주머니 위젯 · 학습 달력
- Settings → Help · Info · Tweaks
- Home → Card Detail (재생 / 시트들)
상세 인터랙티브 트리는 ux.html.
8. 범위 (v1.0 / v1.1 / v1.5 / v2+)
v1.0 MVP 출시 목표
- 입력 3종 (타이핑 / 스크린샷 3단계 / 음성)
- LLM 통합 처리 5종 (번역 / 발음 / 카테고리 / 톤 / 대화 맥락)
- TTS 3개 + 두 재생 버튼 + 전체 재생
- 주머니 + 다대다 소속 + 카테고리 다중 + 톤 (생성 시 확정)
- 2단 필터 + 전역 검색
- 다언어 동시 지원
- 오프라인 정상 동작
- 씨앗 공유 (이미지 + mp3)
- 일일 볼주머니 10개 (볼주머니 메타포 + 비주얼 + 마일스톤 격려)
- 친구 (목록 + 받은 주머니 읽기)
- Me 화면 (프로필 + 통계 + 학습 달력)
- 설정 (테마 / 글자 크기 / 음성 속도·목소리 / 데이터 동기화·내보내기)
v1.1 출시 후 1-2주 follow-up
- 다중 선택 편집 모드 (씨앗 일괄 이동·삭제)
- 주머니 공유 (친구에게 보내기, 받은 주머니 정식 임포트)
- 대화 음성 차별화 (상대/나 다른 voice ID)
- 즐겨찾기 (☆)
- 재생 중 시각 피드백 강화 (현재 줄 강조 ✓ 완료, 단어 강조 ✓ 완료, 추가 인터랙션)
- 개별 대화 줄 탭 → 그 줄만 재생
- 마스코트 캐릭터 + 마일스톤 애니메이션 확장
v1.5 — 수익 검증 후
- 볼주머니 팩 IAP (50/200/500 추가 슬롯, App Store Consumable)
- 가격: $1.99 / $4.99 / $9.99 가이드라인
- 마진 95%+ (Haiku + TTS Standard 기준)
v2+ 이후 로드맵
- 클라우드 동기화 + 계정 + 가족 공유 (현재는 iCloud 동기화만)
- 사용자 정의 카테고리 / 자유 태그
- 플래시카드 모드 / 간격 반복 학습
- 발음 녹음 비교 (내 발음 vs 원어민)
- Lifetime unlock 검토
- Android
- 대화 전체 통합 mp3 (서버에서 합쳐 보내기)
- 비슷한 표현 추천 / 문화 노트
9. 운영 모델
- 출시: 무료 앱 (App Store)
- 일일 볼주머니: 씨앗 10개 (시작값)
- 수익화: v1.5에서 볼주머니 팩 IAP (구독 X, 소진형 consumable)
- 비용 추정: 활성 사용자 1,000명 ≈ 월 $50~100 · 1만 명 ≈ 월 $500~1,000
- IAP 도입 트리거: 사용자 규모 + 볼주머니 가득 비율 데이터로 결정
10. 미결 결정사항
- iOS 최소 버전: 16+ vs 17+ (17+면 Apple Translation 프레임워크 옵션 가능)
- 서버리스 플랫폼: Cloudflare Workers vs Vercel Edge
- LLM 선택: Claude Haiku vs Gemini Flash (한국어 품질 + 스크린샷 처리 + 비용)
- 일일 볼주머니 정확한 숫자: 10이 적절한지 시뮬레이션
- 톤 변경 동작: 새 씨앗 생성 vs 원본 교체 (현재 안: 새로 생성, 일일 볼주머니 +1 소비)
- 주머니 자동 생성 규칙: 입력 시 자동 분류 vs 사용자 선택
- 다중 편집 모드 진입: 길게 누르기 vs "편집" 버튼 (v1.1)
- 검색 범위: 현재 필터 결과 내 vs 전역 (현재 안: 전역)
- 대화 맥락 fallback: 단순 인사처럼 대화가 안 만들어지는 경우
- 음성 입력 길이 제한
- 마일스톤 임계값: 50/100/500 외 추가 지점 (10, 25, 1000?)
- 친구 시스템: 별도 계정 시스템 도입 시점 (v1.0 시작 가능?)
- 받은 주머니 임포트 정책: 복사본 vs 참조 (현재 안: 복사본, 출처 표시)