프로젝트 기간 | 2025.09.01 ~ ing
토토리는 난독 아동과 읽기에 어려움을 겪는 아동이 흥미를 잃지 않고 반복 학습할 수 있도록 관심사 기반 동화와 취약 음운 퀴즈를 제공하는 모바일 학습 서비스입니다. 낭독 음성을 분석해 생략·대치·삽입 오류와 읽기 유창성을 기록하고 다음 학습에 반영합니다.
Totori_AI는 토토리의 AI 추론 및 언어 분석 서버입니다. 관심사 음성을 텍스트로 변환하고, 읽기 수준에 맞는 동화·퀴즈를 생성하며, 아동 낭독 분석에는 Whisper STT 전사와 Levenshtein Distance를 사용합니다.
- Python 3.11
- FastAPI·Uvicorn
- OpenAI API
- Wav2Vec 2.0·CTC Decoder
- Whisper STT
- Levenshtein Distance
- PyTorch
- Redis
- KoNLPy·MeCab
- ElevenLabs API
- Whisper 기반 낭독 음성 전사
- Levenshtein Distance 기반 생략·대치·삽입 오류 분류
- 관심사 음성 STT
- 관심사 음성을 바탕으로 맞춤 동화 생성
- 읽기 수준별 어휘·문장 제약 적용
- 낭독 속도(WCPM)와 누적 오류의 Redis 임시 저장
- 취약 발음 기반 퀴즈 생성·채점
- 퀴즈 음성 TTS 생성
| 복지희 | 정유진 |
|---|---|
@jettieb |
@nomellc |
| AI Developer | AI Developer |
| 조사 탈락/대치 분석 로직, Whisper 및 Wav2vec 2.0 연결, 배포 |
음운 오류 패턴 분석 로직, 동화 낭독 음성 분석, OpenAI API 기반 동화 생성, 퀴즈 생성 담당 |
Totori_AI/
├── app/
│ ├── api/
│ │ ├── stt_router.py # STT API
│ │ ├── story_router.py # 동화 생성 API
│ │ ├── reading_router.py # 낭독 분석 API
│ │ └── quiz_router.py # 퀴즈 API
│ ├── clients/ # ElevenLabs 클라이언트
│ ├── common/ # 단계별 상수와 한국어 사전
│ ├── core/ # Redis 연결
│ ├── schemas/ # Pydantic 요청·응답 모델
│ ├── services/ # 생성·STT·발음 분석 로직
│ ├── utils/ # 음성·정렬·프롬프트 유틸리티
│ ├── .env # 직접 생성, Git 추적 제외
│ └── main.py # FastAPI 진입점
├── .python-version
├── requirements.txt
└── README.md
- Python 3.11.9 권장
- Redis 7
- FFmpeg
- MeCab과 한국어 사전
- OpenAI API 키
- ElevenLabs API 키
음성 모델 실행을 위해 충분한 메모리와 저장 공간이 필요합니다. 관심사 입력에 사용하는 Whisper의 기본 모델은 medium이며 개발 환경에서는 더 작은 모델을 사용할 수 있습니다.
git clone https://github.com/Team-CtrlS/Totori_AI.git
cd Totori_AImacOS에서 Homebrew를 사용하는 경우:
brew install ffmpeg mecab mecab-ko-dic다른 운영체제에서는 패키지 관리자에 맞게 FFmpeg, MeCab, mecab-ko-dic을 설치하세요.
python3.11 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt로컬 Redis를 사용하거나 Docker로 실행합니다.
docker run --name totori-redis \
-p 6379:6379 -d redis:7-alpine연결 확인:
redis-cli ping
# PONGapp/.env를 생성합니다. 애플리케이션은 시작할 때 이 경로의 파일을 읽습니다.
OPENAI_API_KEY=your-openai-api-key
REDIS_HOST=localhost
REDIS_PORT=6379
ELEVENLABS_API_KEY=your-elevenlabs-api-key
ELEVENLABS_BASE_URL=https://api.elevenlabs.io/v1
ELEVENLABS_VOICE_ID=your-voice-id
ELEVENLABS_MODEL_ID=eleven_multilingual_v2
# 선택 사항: 기본값은 medium
WHISPER_MODEL=medium
# 설치 환경에 따라 경로를 변경하세요.
MECABRC=/opt/homebrew/etc/mecabrc
MECAB_DIC_PATH=/opt/homebrew/lib/mecab/dic/mecab-ko-dicIntel Mac이나 Linux에서는 MeCab 설치 경로가 다를 수 있습니다. 다음 명령으로 실제 설정 파일과 사전 경로를 확인한 뒤 값을 수정하세요.
mecab-config --sysconfdir
mecab-config --dicdir저장소 루트에서 실행합니다.
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload정상 실행 확인:
curl http://localhost:8000/
# {"status":"ok"}- API 문서: http://localhost:8000/docs
- OpenAPI JSON: http://localhost:8000/openapi.json
첫 실행 시 Whisper 모델을 내려받고 메모리에 로드하므로 시간이 오래 걸릴 수 있습니다. 빠른 개발 확인에는 아래처럼 작은 모델을 사용하세요.
WHISPER_MODEL=base| Method | 경로 | 설명 |
|---|---|---|
GET |
/ |
서버 상태 확인 |
POST |
/ai/stt/transcribe |
음성 파일 STT |
POST |
/ai/story/make |
관심사 음성 기반 동화 생성 |
POST |
/ai/reading/analyze |
페이지 낭독 분석 및 결과 누적 |
POST |
/ai/reading/complete/{child_id}/{book_id} |
누적 분석 결과 반환 및 삭제 |
POST |
/ai/quiz/generate |
취약점 기반 퀴즈 생성 |
POST |
/ai/quiz/analyze |
퀴즈 답변 음성 채점 |
관심사 음성
→ STT
→ 아동 레벨·이전 오류 패턴 결합
→ LLM 동화 텍스트 및 이미지 프롬프트 생성
→ Spring Boot에서 이미지·TTS 생성
→ 동화 콘텐츠 저장
아동 낭독 음성
→ Whisper STT 전사문 추출
→ 원문과 전사문을 Levenshtein Distance로 정렬
→ 생략·대치·삽입 오류와 WCPM 계산
→ Redis 임시 저장 후 학습 완료 시 백엔드 반환
언어모델이 문맥상 자연스러운 단어로 자동 교정하면 실제 발음 오류가 사라질 수 있습니다.
| 종류 | 형식 | 용도 |
|---|---|---|
| 관심사 음성 | WAV, M4A, MP3 | 동화 주제 추출 |
| 낭독 음성 | WAV, M4A, MP3 | 오류 유형과 WCPM 분석 |
| 원문 | UTF-8 문자열 | 전사 결과 비교 기준 |
| 아동 레벨 | L1~L6 |
동화·퀴즈 난이도 조절 |
| 분석 결과 | JSON | 생략·대치·삽입, 조사 오류, 평균 WCPM |
실제 아동 음성은 개인정보와 연구윤리 문제로 공개 저장소에 커밋하지 않습니다.
권장 샘플 구조:
samples/
├── audio/
│ ├── interest_sample.wav # 관심사 입력 예시
│ └── reading_sample.wav # 낭독 입력 예시
├── text/
│ └── reading_original.txt # 낭독 원문
└── expected/
└── reading_result.json # 기대 분석 결과
Python 문법을 빠르게 확인하려면 다음 명령을 사용합니다.
python -m compileall appRedis가 실행 중인지, REDIS_HOST와 REDIS_PORT가 실제 주소와 같은지 확인하세요. 애플리케이션은 시작 단계에서 Redis에 연결합니다.
환경변수 파일의 위치가 저장소 루트가 아니라 app/.env인지 확인하세요.
MECABRC와 MECAB_DIC_PATH를 현재 운영체제의 실제 설치 경로로 바꾸세요.
Whisper 모델 다운로드 또는 로딩이 원인일 수 있습니다. WHISPER_MODEL=base나 small로 낮춰 확인하세요.
학습 체크포인트, 전처리 방식, CTC Decoder 설정이 같은지 확인하세요. 체크포인트가 저장소 외부에 있다면 다운로드 링크와 로컬 배치 경로가 README 또는 배포 문서에 명시되어 있어야 합니다.
ELEVENLABS_API_KEY, ELEVENLABS_BASE_URL, ELEVENLABS_VOICE_ID, ELEVENLABS_MODEL_ID를 모두 확인하세요.



