TM Taeyang Moon
Demo · 아키텍처 해설

StoryMine — 아이가 주인공인 AI 그림동화 (음성낭독)

말로 들려주면 캐릭터·삽화·내레이션까지 자동 생성하는 모바일 PWA

Azure OpenAI gpt-5.4gpt-image-1 삽화음성 낭독(TTS)병렬 이미지 생성Container AppsPostgreSQL(키리스 MI)개인정보 최소화(PIPA)PWA

StoryMine은 아이가 말로 들려준 이야기를 받아, 아이를 닮은 주인공 캐릭터를 만들고, 페이지마다 삽화를 그리고, 목소리로 읽어주는 모바일 우선 동화책 PWA입니다. 한국어와 영어를 지원하며, "한 번 만들면 끝나는 장난감"이 아니라 책장·시리즈·다운로드·과금까지 갖춘 하나의 작은 서비스로 설계했습니다.


1. 무엇을, 누구를 위해


2. 사용자 흐름

말하기/입력          설계            집필            삽화 + 낭독(동시)         리더
(STT·사진)  ─▶  이야기 구조  ─▶  페이지 글  ─▶  gpt-image-1 ┐            자동 넘김
아이 이름·나이      (gpt-5.4)       (gpt-5.4)     Neural TTS  ┘─▶ 저장 ─▶  ◀ 이전/다음 ▶
  1. 입력 — 음성(브라우저 STT)이나 텍스트로 이야기 아이디어를 받고, 처음 한 번 아이 사진·이름을 받습니다.
  2. 캐릭터화(vision) — 아이 사진을 그 자리에서만 멀티모달 모델에 보내 "둥근 갈색 머리, 하늘색 후드티…" 같은 영어 캐릭터 묘사(anchor) 를 생성하고, 사진 원본은 즉시 폐기합니다(저장 안 함).
  3. 설계 → 집필 — gpt-5.4가 나이·언어·페이지 수에 맞춰 이야기 구조와 페이지별 글을 씁니다. 주인공 이름은 부모가 정한 값으로 고정합니다.
  4. 삽화 + 낭독(동시 생성) — 페이지마다 gpt-image-1로 삽화를, Azure Neural TTS로 음성을 동시에 만듭니다.
  5. 리더 — 글 캡션은 그림을 가리지 않도록 옅은 그라데이션 위에 얹고, 페이지가 음성 길이에 맞춰 자동으로 넘어갑니다.

3. 아키텍처

                    ┌──────────────────────────── Azure ────────────────────────────┐
  모바일 브라우저    │                                                                │
   (PWA, 단일 HTML) │   Container Apps (FastAPI)                                      │
        │  HTTPS     │      │  키리스(Managed Identity, AAD 토큰)                       │
        └───────────┼─────▶│──▶ Azure OpenAI  gpt-5.4      (이야기 설계·집필)          │
                    │      │──▶ Azure OpenAI  gpt-image-1  (페이지 삽화)               │
                    │      │──▶ Azure AI Speech  Neural TTS (페이지 음성)              │
                    │      │──▶ (vision) 멀티모달 — 사진→캐릭터 묘사, 사진 미저장        │
                    │      │                                                          │
                    │      └──▶ PostgreSQL Flexible Server (키리스/MI)                 │
                    │             · 사용자·세션·책·페이지·사용량(과금)                  │
                    │             · assets 테이블(BYTEA): 표지·삽화·음성 바이트         │
                    └────────────────────────────────────────────────────────────────┘

4. 핵심 구성요소

구성 역할 메모
Azure OpenAI gpt-5.4 이야기 설계 + 페이지 집필 + 사진→캐릭터 묘사(vision) 키리스(AAD)
Azure OpenAI gpt-image-1 페이지 삽화 1024² 텍스트 앵커로 캐릭터 일관성 유지
Azure AI Speech (Neural TTS) 페이지 음성 낭독(SSML) ko/en 프리셋 보이스, 키리스(resource_id)
Container Apps FastAPI 호스팅(스케일 0~N) 이미지는 ACR
PostgreSQL Flexible 책·페이지·사용량 + 에셋 바이트 키리스(MI), 자산까지 한 곳

5. 설계 결정 & 트레이드오프 (핵심)

5-1. 캐릭터 일관성 — "seed" 대신 텍스트 앵커

이미지 모델에는 페이지 간 동일 인물을 보장하는 seed가 없습니다. 그래서 vision이 만든 영어 캐릭터 묘사(anchor)모든 페이지 프롬프트 앞에 고정으로 붙여 같은 주인공을 유지합니다. 대신 페이지마다 "이 장면의 핵심 행동·배경·카메라 앵글을 다르게"를 강제해 그림이 스토리 진행을 적극적으로 반영하도록 했습니다(비슷비슷한 그림 방지).

5-2. 대기시간 — 페이지 삽화·음성 병렬 생성

삽화와 음성은 페이지 간 독립적이라 ThreadPool로 동시에 생성합니다(동시성 조절 가능). 8~16페이지를 순차로 그리면 수 분이 걸리지만, 병렬화로 체감 대기를 크게 줄였습니다. "만드는 동안 다른 책을 보거나 또 만들 수 있게" 비동기 진행 UX와 짝을 이룹니다.

5-3. 보안 — 전구간 키리스(Managed Identity)

OpenAI·Speech·DB 모두 키 없이 AAD 토큰/Managed Identity로 접근합니다. 키 유출·로테이션 부담이 없고, 환경변수에 비밀이 없습니다.

5-4. 거버넌스 회피 — 에셋을 Blob이 아니라 Postgres에

중앙 거버넌스가 스토리지 publicNetworkAccess를 주기적으로 잠그는 환경입니다. 에셋이 모두 앱 프록시(브라우저가 스토리지에 직접 안 감)라는 점을 이용해, 이미지·음성 바이트를 Postgres assets(BYTEA) 로 옮겨 거버넌스와 무관하게 동작하도록 했습니다. URL은 그대로 유지됩니다.

5-5. 개인정보 최소화 — 아이 사진을 저장하지 않음

아이 사진은 캐릭터 묘사를 만드는 순간에만 쓰고 즉시 폐기합니다. 보관 항목은 로그인 계정 + 아이 별명(이름) + 글로 된 캐릭터 설명뿐이며, 썸네일은 사진이 아니라 이름 기반 익명 아바타(SVG) 로 만듭니다. 시작 시 과거에 저장됐던 사진 자산도 자동 삭제합니다.

5-6. 사용자별 격리 & 과금 한도

책·아이 프로필·사용량은 모두 로그인 user_id로 격리됩니다(다른 사람 책장이 섞이지 않음). 과금은 무료(평생 1권) / $9(월 10권) / $19(월 30권) 로, 사용량 테이블로 월 한도를 강제합니다(개발 중에는 한도를 크게 열어둠).


6. 개인정보·규제

아동 대상 서비스라 데이터 보호가 1순위입니다.

규제 수치·요건은 시점에 따라 바뀔 수 있어 공식 출처(law.go.kr, pipc.go.kr) 확인을 전제로 합니다.


7. 비용·성능 관점


8. 한계 & 향후


한 줄 정리

키리스 Azure AI(스토리·삽화·음성) + Container Apps + Postgres 위에, 개인정보 최소화(사진 미저장)병렬 생성으로 빠른 체감을 핵심 가치로 얹은, 아이가 주인공인 개인용 동화 서비스입니다.

← 데모 목록학습 포털 홈