콘텐츠 제작현행

이미지·음성 에셋

캐릭터 일관성과 비공개 전달, Gemini 고정 음원 검수를 위한 제작 기준입니다.

이미지 일관성

장면 배경과 캐릭터는 같은 일러스트 세계 안에서 제작한다. 실사 배경 위에 2D 캐릭터를 합성하지 않는다. 캐릭터의 얼굴·헤어·체형 정체성은 유지하되, 장면의 행동과 감정에 맞춰 포즈를 새로 그린다.

의상은 캐릭터의 국적·연령·성격과 현재 상황을 반영한다. 전 인물을 같은 색이나 시대감 있는 복장으로 통일하지 않는다.

모바일 최적화

원본은 품질을 보존하되 실제 앱 전달본은 휴대폰과 태블릿 해상도에 맞게 리사이즈하고 압축한다. 투명 이미지와 흰 배경 이미지 모두 불필요한 캔버스 여백을 제거한다.

비공개 에셋

학습 이미지와 음원은 비공개 객체 저장소에 저장한다. 앱은 원본 공개 URL을 갖지 않고, 인증된 요청을 통해 필요한 에셋을 전달받는다.

음성 제작

수업 대화와 자모 음성은 Gemini 기반 고정 파일로 제작한다. 런타임 TTS를 기본 발화로 사용하지 않는다.

모든 음원은 화자 ID, 대본 hash, 정상·느린 속도, 생성 모델과 버전, 생성 시각, 원어민 발음 QA를 기록한다. 음성과 transcript가 일치하지 않으면 게시하지 않는다.

K0·K1 전체 라이브 게시

K0-01K0-12와 K1-01K1-12의 자모·음절·어휘·받침·대화·표현·문법 예문 398개를 NORMAL, LEARNING_SLOW로 각각 제작해 796개 고정 파일을 게시했다. 24개 단원의 필수 참조, 길이 이상치, SHA-256과 R2 객체 누락을 전수 검사한다.

  • 24kHz mono MP3, 발화 단위 버전 자산
  • 비공개 R2 업로드 후 재다운로드 SHA-256 검증
  • MSSQL에서 단원·원천 ID·화자·속도·게시 버전 관리
  • Firebase Auth·App Check를 통과한 앱 요청에만 API proxy 전달
  • Flutter는 SHA-256 확인 후 사용자별 캐시에 저장
  • K1 대화는 turn 파일을 화자 순서로 연속 재생하고 문장별 정상·느린 재생 제공
  • K0 자음 이름을 단독 음가로 가르치지 않고 실제 음절·받침 맥락에서 소리를 제공
  • 전체 재생과 문장별 재생을 상호 차단하고 앱 생명주기 전환 시 재생 상태를 정리

이미지와 화자 프로필

K1 각 단원은 장면 가로·세로·대화 히어로와 화자 프로필을 DB의 asset role로 연결한다. Course 인덱스도 같은 게시 장면을 사용하므로 앱에 단원별 이미지 목록을 하드코딩하지 않는다. 앱은 인증 API와 해시 캐시를 통해 이미지를 가져오며 원본 공개 URL을 보관하지 않는다.

현재 운영 수량은 발화 398개, 파일 796개, 적용 단원 24개이며 필수 누락·길이 이상치·R2 해시 불일치는 모두 0건이다. 기기 TTS와 공개 R2 URL은 사용하지 않는다.

운영 키는 앱이나 공개 문서에 포함하지 않는다. 화면 공유 등으로 노출 이력이 생긴 API token·S3 access key는 폐기·재발급하고 Firebase Secret을 교체한 뒤 기존 키의 접근 불가를 확인해야 한다.

문서 업데이트 원칙

구현 상태가 바뀌면 코드·DB·테스트와 같은 변경에서 이 문서도 함께 갱신합니다.

개발 현황으로 돌아가기