여행에서 만난 한마디를 담아 두고, 필요할 때 꺼내 쓰는 회화 앱
길게 외워 공부하는 도구가 아니라, 마주친 표현을 한 번 담아 두면 카드로 완성되고, 여행 현장에서 음성으로 꺼내 따라 말하게 해 주는 앱입니다. 모은 표현은 휘발되지 않고 사용자의 자산으로 쌓입니다.
한국어 한마디를 적으면 번역·한글 발음·원어민 음성·대화 맥락이 한 장의 카드(씨앗)로 완성되는 회화 앱.
현지어를 길게 공부하긴 부담스럽지만, 필요한 순간 말은 해 보고 싶은 여행자.
담기(입력) → 만들기(변환) → 보관(주머니·곳간) → 꺼내 쓰기(재생·따라 말하기) → 자산으로 누적, 다음 여행에서 다시.
"마주친 표현을 담아 두고, 그곳에서 쏙 꺼내 말하게 한다." 똑똑해지는 건 AI가 아니라 사용자의 볼주머니.
- 한 번 담은 표현을 여행 현장에서 다시 꺼내 재생·사용한다 (담기로 끝나지 않음).
- 볼주머니가 50개·100개로 쌓이고, 다음 여행에서 작년 주머니를 그대로 다시 연다.
- 네트워크가 없는 기내에서도 열람·재생이 끊기지 않는다.
- "한도 초과" 같은 압박 없이, 가득 차면 자연스럽게 멈추고 다음 날 다시 담는다.
지금 만드는 것, 그리고 일부러 하지 않는 것
경계가 이 문서에서 가장 중요한 부분입니다. "하지 않는 것"의 상당수는 브랜드 원칙을 경계로 옮긴 것입니다.
들어가는 것
- 2탭 구조 — 홈 / 나
- 입력 3종 — 타이핑 · 음성(온디바이스) · 스크린샷(OCR)
- 양방향(한→외 · 외→한) + 방향 자동 감지 & 1탭 수정
- 통합 변환 — 번역·한글 발음·음성(TTS)·대화 맥락(3턴)을 한 번에
- 씨앗 · 주머니(색 6종) · 카테고리(자동·수동) · 곳간(즐겨찾기)
- 일일 볼주머니 — 기본 10개, 광고로 +3/+1, 자정 리셋
- 검색 + 2단 필터(언어·카테고리, AND 누적)
- 전체 재생(씨앗·주머니·대화) · 오프라인 열람·검색·재생
- 라이트/다크 테마, 발음 속도·목소리 설정
- 소셜 로그인, 약관·개인정보, 도움말(FAQ)
하지 않는 것
- "한도 앱"이 아니다. 차감·만료·"한도 초과" 같은 차가운 압박 표현을 쓰지 않는다.
- 외우게 강요하지 않는다. 퀴즈·암기 테스트·스트릭 강제·압박성 푸시 없음.
- AI를 주체로 두지 않는다. 든든해지는 건 사용자의 볼주머니다.
- 톤(자동/정중/친근) 선택 v1.1
- 카드 공유 · 친구 · 소셜 v1.1
- 통계 · 달력 · 학습 리포트 v1.1
- 즐겨찾기 정렬(맨 앞)·다중 편집·빈 그룹 직접 생성 v1.1
- 햄스터 본격 캐릭터 애니메이션 v1.1
- 계정 클라우드 동기화 (로컬 저장 우선) v1.1+
움직이는 네 주체
요구사항은 이 역할들을 기준으로 적습니다. 경험 흐름 문서의 점 색(나·앱·현지인·함께)과 같은 구분입니다.
여행자 나 · 주체
표현을 담고 꺼내 쓰는 사람. 모든 주도권은 사용자에게 있다. 모은 표현은 그의 자산이다.
CheekPouch 앱
담은 한마디를 카드로 변환·보관·재생한다. 곁에서 응원하는 햄스터 톤 — 부담 없이, 다정하게.
현지인 상대
표현을 건네는 대상. 앱 사용자는 아니지만 대화 맥락·공유의 수신자로 설계에 등장한다.
외부 서비스 시스템
변환 LLM(번역·발음·대화) · 음성 합성(TTS) · 온디바이스 음성 인식 · OCR · 광고/추적 동의 · 로그인 제공자. 네트워크가 필요한 행위의 경계다.
여행의 시간 축을 따라가는 표현의 일생
씨앗은 여행의 시간 축 위에서 담기고, 익혀지고, 꺼내지고, 다시 쓰입니다. 각 단계에서 활성화되는 기능이 곧 다음 장(기능 명세)의 묶음 축입니다.
기능 — 여정 단계로 묶고, 카드마다 완료 기준을
접으면 한 줄 목적만 보이는 색인이 되고, 펼치면 요구사항·완료 기준·의존이 나옵니다. 화면 단위 디테일은 시각 프로토타입의 P 코드를 참조하세요.
›01타이핑으로 담기Type inputP0여행 전 목적 — 떠오른 한마디를 한국어로 적기만 하면 카드가 되게 한다.
- 텍스트 입력 + 번역 언어 최대 5개 동시 선택(즐겨찾기 quick-add)
- 한→외면 언어 1개↑ 필요, 외→한이면 언어 선택 무관
- 입력 즉시 방향 자동 감지 칩 표시, 완료 시 통합 변환 호출
- 한국어 한마디 + 언어 1개 → 변환 완료 카드가 생성된다
- 언어 N개 선택 시 N개 카드가 생긴다
›02스크린샷으로 담기Screenshot OCRP0여행 전 목적 — 블로그·사진 속 글자를 던지면 발화 단위로 나뉘어 카드가 된다.
- 소스 3종 — 보관함 · 카메라 · 클립보드 → 미리보기 → 글자 감지 → 확인
- 여러 문장을 발화 단위로 자동 분할
- 한·외 박스 혼합 시 방향별 카드로 자동 분할
- 이미지 1장 → 감지된 문장 수만큼 카드가 생긴다
- 혼합 이미지 → 한→외 / 외→한 그룹으로 나뉘어 생성된다
›03통합 변환Unified convertP0여행 전 목적 — 번역·발음·음성·대화 맥락을 한 번의 호출로 한 카드에 완성한다.
- 한 표현당 LLM 1회로 번역 · 한글 발음 · 대화 맥락(3턴) 생성
- 음성(TTS)은 외국어 원문·대화 라인에 대해 생성
- 생성 중 로딩, 성공 시 결과 화면으로 자동 전환, 실패 시 다시 시도
- 카드에 원문·발음·뜻·음성·대화 맥락이 모두 채워진다
- 변환 실패 시 자동 전환 없이 재시도 안내가 뜬다
›04방향 자동 감지Direction detectP0여행 전 목적 — "외국어로 뭐지?"와 "무슨 뜻이지?"를 자동으로 가른다.
- 스크립트 포함 여부로
한국어 → 외국어/외국어 → 뜻자동 판정 - 방향 칩 ⇄ 탭으로 1탭 수정
- 한국어 입력 → ko→fo, 외국어 입력 → fo→ko로 자동 표시
- ⇄ 탭 시 방향과 결과 언어 UI가 즉시 바뀐다
›05자동 분류Auto categoryP0여행 전 목적 — 만든 카드에 카테고리를 자동으로 달아 두고, 바로 고칠 수 있게 한다.
- 변환 시 카테고리 자동 부여(✨ 칩)
- 결과 화면에서 인라인 편집(× 제거 / + 추가)
- 새 카드에 카테고리 칩이 1개 이상 자동으로 붙는다
- 편집 결과가 카드와 카테고리 목록에 즉시 반영된다
›07오프라인 열람·재생OfflineP0이동 중 목적 — 네트워크가 없어도 모아둔 표현을 열고 듣게 한다.
- 담아둔 씨앗의 열람·검색·재생은 동작
- 새 생성·광고·외부 통신은 비활성, 헤더에 오프라인 배지
- 네트워크 의존 행은 미리 dim 처리해 탭 전 인지 가능
- 오프라인에서 그룹 열기·검색·전체 재생이 정상 동작한다
- 모든 [+] 생성 버튼이 비활성으로 보인다
›08전체 재생Play allP0이동 중 목적 — 그룹·리스트·대화를 차례로 들려줘 손대지 않고 복습하게 한다.
- 씨앗 리스트·주머니·대화를 순차 재생, 마지막까지 후 자동 정지(루프 없음)
- 일시정지(idx 보존)와 정지(idx=0) 분리
- 표현 재생과 대화 재생은 상호 배제
- 전체 재생이 끝 항목에서 멈추고 처음으로 리셋된다
- 일시정지 후 재개 시 멈춘 지점부터 이어진다
›09내 표현 듣기Speak itP0여행 중 목적 — 한 손 탭 한 번으로 외국어 음성을 들려주거나 따라 말하게 한다.
- 카드의 외국어 음성 재생 + 토큰 동기 하이라이트(단어/글자 단위)
- 한 손 사용 — 큰 메인 CTA, 폰 화면에 시선 안 뺏기게
- "내 표현 듣기" 탭 시 음성이 나오고 글자가 동기 강조된다
- 오프라인에서도 재생된다
›10대화 전체 듣기DialogueP0여행 중 목적 — 상대가 할 법한 말까지 미리 들려줘 대화 흐름을 그리게 한다.
- 상대/나 라인을 순차 재생(라인당 ~1.5s, 진행도 N/총)
- 대화 맥락은 통합 변환에서 3턴으로 함께 생성
- "대화 전체 듣기" 시 상대·나 라인이 차례로 재생된다
- 표현 재생 중 대화 재생을 누르면 표현 재생이 멈춘다
›11음성으로 즉석 담기Voice inputP0여행 중 목적 — 준비 못 한 말도 마이크로 말하면 그 자리에서 카드가 된다.
- 녹음 → 실시간 트랜스크립트 → 편집·번역 3단계(온디바이스 STT)
- 변환된 텍스트를 다듬어 통합 변환으로 카드화
- 마이크 권한 거부 시 안내 + 설정 열기
- 말한 내용이 텍스트로 잡혀 카드로 완성된다
- 그 자리에서 들려줄 수 있고 카드로 저장된다
›12톤 바꾸기Tone shiftP1여행 중 목적 — 같은 뜻을 자리에 맞는 온도(정중/친근)로 다시 만든다. v1.1
- 카드에서 톤 선택 → 같은 뜻을 해당 톤으로 재변환
- 처음부터 다시 검색하지 않고 톤만 전환
- 톤 변경 시 같은 의미의 새 표현·음성이 나온다
›13카드 공유ShareP1여행 후 목적 — 카드 이미지와 음성을 별도 작업 없이 그대로 건넨다. v1.1
- 카드에서 공유 → 카드 이미지 + 음성(mp3) 묶음
- 시스템 공유 시트로 전달
- 받는 쪽이 이미지로 보고 음성으로 바로 들을 수 있다
›14로컬 영속 저장Local storeP0늘 · 자산 목적 — 모은 표현이 휘발되지 않고 기기에 그대로 남게 한다.
- 씨앗·주머니·곳간·카테고리를 기기에 영속 저장
- 앱을 다시 열어도, 1년 뒤에도 그대로 유지
- 앱 재실행 후에도 모든 씨앗·주머니가 남아 있다
›15검색SearchP0늘 · 자산 목적 — 쌓인 표현 속에서 필요한 한 장을 단어로 바로 띄운다.
- 외국어·한국어·발음 부분일치 검색
- 홈 검색바에서 진입, 결과 탭 → 씨앗 상세
- 오프라인에서도 로컬 검색 동작
- 단어 입력 시 매칭 카드가 나오고, 없으면 빈 메시지
›162단 필터FilterP0늘 · 자산 목적 — 언어와 카테고리를 겹쳐 쌓인 표현을 두 번의 탭으로 좁힌다.
- 언어 + 카테고리 AND 누적 필터(공유 FilterSheet)
- 활성 필터 칩 + 결과 카운트("N개 중 M개"), 결과 0 → 보기 비활성
- 언어→카테고리 더하면 결과가 누적으로 좁혀진다
- 홈과 내 씨앗에서 같은 필터가 동작한다
›17곳간 (즐겨찾기)FavoritesP0늘 · 자산 목적 — 마음에 든 표현을 따로 비축해 어디서든 빨리 닿게 한다.
- 씨앗 상세에서 ⭐ 토글 → 곳간에 담기/빼기 + 토스트
- 곳간은 영구 보관함, "나" 탭에서 전체 보기
- 토글이 모든 화면에 즉시 반영
- ⭐ 토글 시 곳간 목록과 "나" 탭에 즉시 반영된다
›18일일 볼주머니Daily pouchP0늘 · 자산 목적 — 하루치 담기를 따뜻한 언어로 — "한도/차감"이 아니라 차오르는 볼주머니로.
- 하루 담기 기본 10개, 광고 시청 시 +3(허용)/+1(거부), 자정 리셋
- 담을 때마다 햄스터 볼이 부풀고, 가득 차면 "내일 또 같이 채워봐요"
- "한도 초과/차감" 같은 표현 금지(원칙)
- 10개를 담으면 더는 못 담고, 광고 후 캡이 +3/+1 늘어난다
- 자정에 오늘 담은 수가 0으로 리셋된다
›19마일스톤·휴식 피드백MilestoneP0늘 · 자산 목적 — 푸시하지 않고 함께 기뻐하고, 멈춤을 휴식으로 긍정한다.
- 50개·100개 등에서 작은 마일스톤 토스트
- 가득 찼을 때 압박 대신 휴식 카피
- 마일스톤 도달 시 축하 토스트가 한 번 뜬다
- 가득 참 안내에 압박성 문구가 없다
›20다음 여행에서 다시 꺼내기ReuseP0늘 · 자산 목적 — 작년 주머니를 그대로 열어 0에서 시작하지 않게 한다.
- 지난 여행 주머니·씨앗이 그대로 남아 다시 열람·복습
- 전체 재생으로 바로 복습
- 1년 뒤에도 작년 그룹을 열어 전체 재생할 수 있다
›21테마 (라이트·다크)ThemeP0늘 · 기반 목적 — 라이트·다크 모두에서 포근함을 유지한다.
- 모든 화면이 라이트·다크 지원, 설정에서 시스템/라이트/다크 전환
- 색은 토큰으로만 참조(하드코딩 금지)
- 테마 전환 시 전 화면 색이 일관되게 바뀐다
›22로그인·계정·약관AccountP0늘 · 기반 목적 — 가입 마찰을 최소화하고 계정·약관 흐름을 갖춘다.
- 소셜 로그인으로 진입 → 홈
- 로그아웃·계정 탈퇴, 약관·개인정보 처리방침(진입 화면으로 정확히 복귀)
- 네트워크 의존 행은 오프라인에서 비활성
- 로그인 성공 시 홈으로 이동한다
- 약관을 닫으면 들어온 화면으로 돌아온다
기능이 다루는 명사들
기능이 만지는 객체와, 무엇이 어디에 속하는지. 명사와 소유 관계만 정리합니다 — 필드 수준 스키마는 구현 레포에서 다룹니다.
🌱 씨앗 Seed
표현 한 개. 외국어 원문·한글 발음·뜻·음성·대화 맥락을 담은 카드. 자산의 최소 단위.
소유: 사용자 (영속)👜 주머니 Pouch
씨앗을 주제별로 묶는 컨테이너(색 6종). 씨앗과 다대다.
소유: 사용자 (영속)🏷️ 카테고리 Category
자동/수동 분류 태그. 씨앗이 참조하며 필터 축이 된다.
소유: 사용자 (영속)⭐ 곳간 Favorites
마음에 든 씨앗을 따로 비축하는 영구 집합(씨앗 참조).
소유: 사용자 (영속)🐹 볼주머니 Daily pouch
오늘 담은 수·캡·광고 부스트. 사용자에 속하는 하루치 카운터.
소유: 사용자 (자정 리셋 · 휘발)🙂 사용자 User
이름·오늘 볼주머니·총 씨앗 수·최근 본 씨앗. 모든 자산의 소유자.
소유: 최상위전제와 경계 조건
상세한 기술·보안 정책은 별도 기술 문서의 몫입니다. 여기선 제품 경계에 직접 닿는 전제만 둡니다.
- 오프라인 우선 — 열람·검색·재생은 네트워크 없이. 새 생성·변환·광고만 온라인 필요.
- 플랫폼 중립 — 이 사양서는 특정 플랫폼을 명시하지 않는다. 구현 세부는 각 구현 레포에서 관리.
- 비용 경계 — 변환은 표현당 LLM 1회를 넘지 않게 설계(통합 변환). 일일 볼주머니가 호출량의 자연스러운 상한이 된다.
아직 정하지 않은 것
- 곳간과 주머니의 역할 구분. 곳간(즐겨찾기)과 주머니(주제 묶음)가 사용자에게 충분히 다르게 느껴지는가? 혼동되면 한쪽을 흡수할 여지.
- 일일 볼주머니 캡 정책. 기본 10개·광고 +3/+1이 변환 비용과 사용자 리듬 사이에서 적정한가? 데이터로 조정 대상.
- 방향 자동 감지 정확도. 짧은 입력·혼합 스크립트에서 오판 시 1탭 수정으로 충분한가, 더 강한 신호가 필요한가?