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?