SUDA(μλ€) λ CODA, μ¦ λμΈ λΆλͺ¨λμ μ²μΈ μλ κ° λ μμ°μ€λ½κ² λνν μ μλλ‘ λλ Android κΈ°λ° μμ΄Β·μμ± μν΅ μλΉμ€μ λλ€.
μΉ΄λ©λΌλ‘ μ
λ ₯λ μμ΄ μμμ μλ²λ‘ μ μ‘νμ§ μκ³ , Android κΈ°κΈ° λ΄λΆμμ MediaPipe λλλ§ν¬ μΆμΆκ³Ό TFLite/LiteRT μμ΄ μΈμ λͺ¨λΈ μΆλ‘ μ ν΅ν΄ μ€μκ°μΌλ‘ μ²λ¦¬ν©λλ€.
μ΄ν μΆμΆλ λ¨μ΄ λλ λ¬Έμ₯μ Spring Boot API Gatewayλ₯Ό ν΅ν΄ Gemini κΈ°λ° λ¬Έλ§₯ 보μ κ³Ό CLOVA TTS/STTλ₯Ό κ±°μ³ μλ§κ³Ό μμ±μΌλ‘ λ³νλ©λλ€.
SSAFY 14κΈ° A404ν
On-Device AI κΈ°λ° μμ΄ μΈμ Β· μμ± λ³ν Β· νμ΅ λ¦¬ν¬νΈ νλ«νΌ
|
|
|
|
| κ³μΈ΅ | κΈ°μ | μ€λͺ |
|---|---|---|
| Mobile | Android, Kotlin, Jetpack Compose, Hilt | μ± νλ©΄, μΉ΄λ©λΌ/λ§μ΄ν¬ μ μ΄, μν κ΄λ¦¬ |
| On-Device AI | MediaPipe, TensorFlow Lite, LiteRT, Qwen LiteRT-LM | λλλ§ν¬ μΆμΆ, μμ΄ μΆλ‘ , μ¨λλ°μ΄μ€ λ¬Έμ₯ λ³ν |
| Backend | Java 21, Spring Boot 4.0.5, Spring Security, JPA | μΈμ¦/μΈκ°, μλ νλ‘ν, νμ΅/ν΄μ¦/리ν¬νΈ API |
| AI Server | Python 3.12, FastAPI, PyTorch | μλ² μΈ‘ μμ΄ μΈμ μΆλ‘ API |
| Database | PostgreSQL 16, Redis 7, Flyway | μμ λ°μ΄ν°, ν ν°/μΊμ, λ§μ΄κ·Έλ μ΄μ |
| External API | Gemini, NAVER CLOVA TTS/STT/Speech | λ¬Έλ§₯ κ΅μ , μμ± ν©μ±, μμ± μΈμ |
| Infra | Docker, Docker Compose | λ‘컬/λ°°ν¬ νκ²½ 컨ν μ΄λ κ΅¬μ± |
.
βββ backend/ # Spring Boot API μλ²
βββ mobile/ # Android μ±
βββ ai/ # μμ΄ μΈμ AI μλ² λ° νμ΅/μΆλ‘ μ½λ
βββ docs/ # API, ERD, μν€ν
μ², μꡬμ¬ν λ¬Έμ
βββ exec/ # ν¬ν
λ§€λ΄μΌ λ° μ μΆ μ°μΆλ¬Ό
βββ docker-compose.yml # Backend, DB, Redis, AI μλ² ν΅ν© μ€ν
βββ docker-compose.ai.yml # AI μλ² λ¨λ
λ°°ν¬μ© Compose
| λλ©μΈ | μ€λͺ |
|---|---|
| Auth | νμκ°μ , λ‘κ·ΈμΈ, ν ν° μ¬λ°κΈ, λ‘κ·Έμμ, λ€μ΄λ² OAuth, λΉλ°λ²νΈ μ¬μ€μ |
| Child Profile | μλ νλ‘ν μμ±, μ‘°ν, μμ , μμ |
| Translation | μμ΄ β μμ± λ³ν, μμ± β ν μ€νΈ λ³ν, STT μ€μ μ‘°ν |
| Communication | λν μΈμ μμ±/μ’ λ£, λν λ©μμ§ λ° λΆμ κ΄λ¦¬ |
| Learn | νμ΅ μΉ΄ν κ³ λ¦¬, λμ΄λ, λ¨μ΄ λͺ©λ‘ μ‘°ν |
| Quiz | ν΄μ¦ μΈμ μμ±, νμ¬ λ¬Έμ μ‘°ν, λ΅μ μ μΆ, κ²°κ³Ό μ‘°ν |
| Report | νμ΅ μμ½, μΉ΄ν κ³ λ¦¬λ³ μ§λ, μ·¨μ½ λ¨μ΄, ν΄μ¦ κΈ°λ‘, λν μμ½ |
| Sign | μμ΄ μΆλ‘ API, FastAPI AI μλ² μ°λ |
SUDAλ λͺ¨λ°μΌκ³Ό μλ² μμͺ½μμ μμ΄ μΈμμ μ²λ¦¬ν μ μλλ‘ λͺ¨λΈμ λΆλ¦¬ν΄ μ΄μν©λλ€.
| λͺ¨λΈ | μμΉ | μ©λ |
|---|---|---|
best_sign_model_v7_float16.tflite |
Android assets | μ¨λλ°μ΄μ€ μμ΄ μΈμ |
best_sign_model_v6_float16.tflite |
Android assets | μ¨λλ°μ΄μ€ μμ΄ μΈμ |
best_sign_model_v6.pt |
AI server artifact | FastAPI μλ² μΈ‘ μμ΄ μΆλ‘ |
Qwen2.5 LiteRT-LM |
λ³λ λ€μ΄λ‘λ λλ λ‘컬 κ²½λ‘ | μ¨λλ°μ΄μ€ λ¬Έμ₯ λ³ν |
- MediaPipe κΈ°λ° μ/λͺΈ/μΌκ΅΄ λλλ§ν¬ μΆμΆ
- TCN / Transformer κ³μ΄ μμ΄ μΈμ λͺ¨λΈ μ€ν
- λͺ¨λ°μΌ νμ¬λ₯Ό μν TFLite λ³ν λ° float16 κ²½λν
- μλ² μΆλ‘ μ© PyTorch TCN λͺ¨λΈκ³Ό FastAPI inference endpoint μ 곡
| Method | Endpoint | μ€λͺ |
|---|---|---|
POST |
/api/v1/auth/signup |
νμκ°μ |
POST |
/api/v1/auth/login |
λ‘κ·ΈμΈ |
POST |
/api/v1/auth/refresh |
ν ν° μ¬λ°κΈ |
POST |
/api/v1/auth/oauth/naver |
λ€μ΄λ² OAuth λ‘κ·ΈμΈ |
GET |
/api/v1/children |
μλ νλ‘ν λͺ©λ‘ μ‘°ν |
POST |
/api/v1/children |
μλ νλ‘ν μμ± |
POST |
/api/v1/translation/sign-to-speech |
μμ΄ λ¬Έμ₯ μμ± λ³ν |
POST |
/api/v1/translation/speech-to-text |
μμ± ν μ€νΈ λ³ν |
POST |
/api/v1/comms/sessions |
λν μΈμ μμ± |
PATCH |
/api/v1/comms/sessions/{sessionId}/end |
λν μΈμ μ’ λ£ |
GET |
/api/v1/learn/categories |
νμ΅ μΉ΄ν κ³ λ¦¬ μ‘°ν |
GET |
/api/v1/learn/words |
νμ΅ λ¨μ΄ μ‘°ν |
POST |
/api/v1/learn/quizzes/sessions |
ν΄μ¦ μΈμ μμ± |
POST |
/api/v1/sign/inference |
μμ΄ μΆλ‘ μμ² |
GET |
/api/v1/children/{childId}/reports/summary |
νμ΅ λ¦¬ν¬νΈ μμ½ |
루νΈμ .env νμΌμ μμ±ν©λλ€.
cp .env.example .envμ£Όμ νκ²½λ³μλ λ€μκ³Ό κ°μ΅λλ€.
POSTGRES_DB
DB_URL
DB_USERNAME
DB_PASSWORD
REDIS_PASSWORD
AUTH_JWT_SECRET
GMS_KEY
CLOVA_CLIENT_ID
CLOVA_CLIENT_SECRET
CLOVA_SPEECH_SECRET_KEY
NAVER_CLIENT_ID
NAVER_CLIENT_SECRET
SIGN_AI_BASE_URL
BACKEND_SIGN_AI_BASE_URL
SLLM_MODEL_DOWNLOAD_URL
cd backend
./gradlew bootRunλΉλ λ° κ²μ¦:
cd backend
./gradlew spotlessCheck --no-daemon
./gradlew build -x test --no-daemoncd mobile
./gradlew assembleDebugλλ°μ΄μ€ μ€μΉ:
./gradlew installDebugκ²μ¦:
cd mobile
./gradlew ktlintCheck detekt lintDebug testDebugUnitTest assembleDebug --no-daemonDB, Redis, Backendλ₯Ό μ€νν©λλ€.
docker compose up -d --buildλ‘컬 AI μλ²κΉμ§ ν¨κ» μ€ννλ €λ©΄ λ€μ profileμ μ¬μ©ν©λλ€.
docker compose --profile local-ai up -d --buildGPU μλ²μμ AI μλ²λ§ λ¨λ λ°°ν¬ν κ²½μ°:
docker compose -f docker-compose.ai.yml up -d --buildμ©λ, λΌμ΄μ μ€, 보μ λ¬Έμ λ‘ μλ νμΌμ Gitμ ν¬ν¨νμ§ μμ΅λλ€.
mobile/app/src/main/assets/models/holistic_landmarker.task
λ€μ΄λ‘λ:
https://storage.googleapis.com/mediapipe-models/holistic_landmarker/holistic_landmarker/float16/1/holistic_landmarker.task
AI μλ² μ€ν μ artifact λλ ν°λ¦¬μ μλ νμΌμ΄ νμν©λλ€.
best_sign_model_v6.pt
train_config_v6.json
label_map_v6.json
model.py
μ¨λλ°μ΄μ€ λ¬Έμ₯ λ³νμ© Qwen λͺ¨λΈμ Gitμ ν¬ν¨νμ§ μμ΅λλ€.
mobile/local.propertiesμ λ‘컬 λͺ¨λΈ κ²½λ‘λ₯Ό μ§μ ν μ μμ΅λλ€.
QWEN_MODEL_LOCAL_PATH=C:/path/to/Qwen2.5-1.5B-Instruct_multi-prefill-seq_q8_ekv4096.litertlmλλ κΈ°λ³Έ μμΉμ λ°°μΉν μ μμ΅λλ€.
mobile/local-models/Qwen2.5-1.5B-Instruct_multi-prefill-seq_q8_ekv4096.litertlm
| λ¬Έμ | κ²½λ‘ |
|---|---|
| API λͺ μΈ | docs/api/api-spec.md |
| ERD | docs/architecture/erd.md |
| μμ€ν νλ¦ | docs/architecture/system-flow.md |
| μꡬμ¬ν λͺ μΈ | docs/specs/requirements.md |
| κΈ°λ₯ λͺ μΈ | docs/specs/features.md |
| λͺ¨λ°μΌ μ€ν κ°μ΄λ | mobile/README.md |
| AI μλ² μ€ν κ°μ΄λ | ai/ai-server/README.md |
| ν¬ν λ§€λ΄μΌ | docs/porting-manual.md |
![]() κΉνμ Android |
![]() μ€νμ AI & Infra |
![]() κΉλ―Όμ Backend |
![]() κΉμμ° AI |
![]() λμμ§ Backend |
![]() μνν Android |
μλ νμΌμ Gitμ ν¬ν¨νμ§ μμ΅λλ€.
.env
*.pem
*.key
*.pt
*.pth
ai/model-artifacts/
local.properties
keystore.properties
secrets.xml
secret, API key, λΉλ°λ²νΈ, κ°μΈ λ‘컬 κ²½λ‘λ 컀λ°νμ§ μμ΅λλ€.





