Python
Junior
claude
Ответы
Вот архитектура онлайн-репетитора английского на FastAPI:
---
## 📁 Структура проекта
```
english_tutor/
├── app/
│ ├── main.py
│ ├── config.py
│ │
│ ├── api/
│ │ ├── routes/
│ │ │ ├── session.py # старт/стоп сессии
│ │ │ ├── audio.py # STT / TTS endpoints
│ │ │ ├── chat.py # текстовый fallback
│ │ │ └── progress.py # статистика юзера
│ │
│ ├── core/
│ │ ├── state_machine.py # FSM логика урока
│ │ ├── lesson_engine.py # генерация заданий
│ │ └── scoring.py # оценка ответов
│ │
│ ├── services/
│ │ ├── stt.py # Speech-to-Text
│ │ ├── tts.py # Text-to-Speech
│ │ ├── llm.py # LLM (Claude/GPT)
│ │ ├── pronunciation.py # анализ произношения
│ │ └── session_manager.py # управление сессиями
│ │
│ ├── models/
│ │ ├── session.py # Pydantic модели сессии
│ │ ├── user.py
│ │ └── lesson.py
│ │
│ └── db/
│ ├── repositories/
│ │ ├── user_repo.py
│ │ └── progress_repo.py
│ └── migrations/
│
├── frontend/ # опционально
└── docker-compose.yml
```
---
## 🔄 State Machine (FSM)
Сердце репетитора. Каждая сессия — это машина состояний:
```
IDLE
└─► GREETING # приветствие, определение уровня
└─► WARM_UP # разговорная разминка
└─► LESSON_INTRO
├─► VOCABULARY_DRILL # слова/карточки
├─► GRAMMAR_EXPLAIN # объяснение правила
├─► SPEAKING_TASK # юзер говорит
│ ├─► LISTENING_FEEDBACK # ошибки произношения
│ └─► RETRY / NEXT
├─► LISTENING_TASK # юзер слушает и повторяет
└─► WRAP_UP # итог, домашнее задание
└─► IDLE
```
Реализация через `transitions` (библиотека) или вручную:
```python
class TutorStateMachine:
states = ["idle", "greeting", "warm_up", "speaking_task", "feedback", "wrap_up"]
def __init__(self, session_id: str):
self.state = "idle"
self.session_id = session_id
self.context = {} # история, уровень, ошибки
async def transition(self, event: str, payload: dict) -> TutorResponse:
handler = getattr(self, f"on_{self.state}_{event}", None)
if handler:
return await handler(payload)
raise InvalidTransitionError(self.state, event)
```
---
## 🎙️ STT / TTS Pipeline
```
Юзер говорит
│
▼
[WebSocket / HTTP multipart]
│
▼
STT Service ──► Whisper (local) или Deepgram / AssemblyAI (cloud)
│ → транскрипция + confidence score
▼
Pronunciation Analyzer
│ → фонемный анализ (опционально: CMU Pronouncing Dict)
▼
LLM Service (Claude/GPT)
│ → оценка грамматики, генерация ответа репетитора
▼
TTS Service ──► ElevenLabs / OpenAI TTS / Edge-TTS (бесплатно)
│ → аудио с нужным акцентом и темпом
▼
[WebSocket → фронтенд]
```
**Рекомендации по инструментам:**
| Задача | Бесплатно | Платно |
|---|---|---|
| STT | Whisper (local) | Deepgram, AssemblyAI |
| TTS | Edge-TTS, Coqui | ElevenLabs, OpenAI |
| LLM | Ollama + Mistral | Claude, GPT-4 |
| Произношение | phonemizer | Speechace API |
---
## 🌐 API Endpoints
```
WebSocket:
WS /ws/session/{session_id} # основной реалтайм канал
HTTP:
POST /session/start # создать сессию, вернуть session_id
POST /session/{id}/audio # отправить аудио (multipart)
GET /session/{id}/state # текущее состояние FSM
POST /session/{id}/text # текстовый input (fallback)
GET /users/{id}/progress # прогресс, статистика
GET /lessons/ # доступные уроки/темы
```
---
## 💾 Модель данных
```python
class Session(BaseModel):
id: str
user_id: str
state: str # текущее состояние FSM
level: str # A1-C2
topic: str # тема урока
history: list[Message] # история диалога
errors: list[ErrorRecord] # накопленные ошибки
created_at: datetime
class ErrorRecord(BaseModel):
type: str # grammar / pronunciation / vocabulary
original: str
correction: str
timestamp: datetime
```
---
## ⚙️ Ключевые технические решения
**Redis** — хранение сессий и состояния FSM (быстро, TTL сессии)
**WebSocket** — для реалтайм аудио вместо polling
**Celery / BackgroundTasks** — тяжёлые задачи (STT, TTS) в фоне
**Системный промпт для LLM** — ключевая часть: передаёшь состояние FSM, уровень юзера, историю ошибок, текущую цель урока → LLM знает когда исправлять, когда хвалить, когда двигаться дальше
---
Хочешь углубиться в какой-то конкретный слой — FSM, WebSocket pipeline или структуру промптов для LLM?