Замер на машине разработки (Ryzen 7 8845HS, WSL2), не на демо-машине — там make latency надо прогнать трижды, разброс между прогонами до 20%. Распознавание — GigaAM v3 RNNT int8: фраза на 2 с за ~285 мс, WER 0% на 99 словах живой речи Golos. CTC не быстрее ни в одном из двух прогонов и ошибается чаще: время съедает общий энкодер, поэтому ступень деградации «RNNT не успевает → CTC» по скорости ничего не даёт. Синтез — Silero v5: в 10 раз быстрее реального времени, а не в 40, как заложено в STACK.md; первая фраза 100–250 мс в зависимости от длины. Частота синтеза на скорость не влияет, без профилирующего компилятора — на 13% быстрее. Сквозной бюджет: 600 мс endpointing + ~285 STT + ~150 TTS = ~1 с без LLM. Цель ≤ 1.5 с держится, только если LLM отдаёт первое предложение быстрее ~465 мс. Вопрос, считается ли филлер «алло?..» первым звуком, записан в LATENCY.md для людей. make models качает GigaAM и Silero VAD с Hugging Face. Silero TTS лежит на российском хосте, недоступном из-под VPN: скрипт не лезет на зеркала (.pt грузится через pickle — это чужой код) и честно говорит, откуда скачать вручную.
60 lines
2.8 KiB
Makefile
60 lines
2.8 KiB
Makefile
# Подъём стенда и рутина. Цели, которых ещё нет, честно падают
|
||
# и называют карточку, которая их закрывает, — README не должен врать.
|
||
|
||
UV ?= uv
|
||
COMPOSE ?= docker compose
|
||
|
||
.DEFAULT_GOAL := help
|
||
|
||
help: ## Список целей
|
||
@grep -hE '^[a-z-]+:.*##' $(MAKEFILE_LIST) | sed 's/:.*##/\t/' | expand -t22
|
||
|
||
dev: ## Поднять стенд: postgres + backend --reload + frontend
|
||
$(COMPOSE) up --build
|
||
|
||
down: ## Погасить стенд
|
||
$(COMPOSE) down
|
||
|
||
back: ## Только бэкенд, локально, без докера
|
||
cd backend && $(UV) run uvicorn app.main:app --reload --port 8000
|
||
|
||
front: ## Только фронтенд, локально
|
||
npm --prefix frontend install && npm --prefix frontend run dev
|
||
|
||
types: ## domain/events.py → frontend/src/shared/types/generated.ts
|
||
cd backend && $(UV) run --no-project --with 'pydantic>=2.7' python scripts/export_types.py
|
||
|
||
test: ## Тесты бэкенда
|
||
cd backend && $(UV) run --extra dev pytest -q
|
||
|
||
typecheck: ## Проверить фронтенд компилятором
|
||
npm --prefix frontend run typecheck
|
||
|
||
models: ## Скачать модели в backend/models/: эмбеддинги, GigaAM, Silero VAD; Silero TTS — вручную
|
||
cd backend && $(UV) run python scripts/models.py
|
||
|
||
seed: ## Залить сценарии из /scenarios в БД
|
||
cd backend && $(UV) run python scripts/seed.py
|
||
|
||
lesson: ## Запустить занятие и напечатать ссылки: make lesson s=<сценарий> m=<режим>
|
||
cd backend && $(UV) run --no-project --with websockets python scripts/start_lesson.py "$(s)" "$(m)"
|
||
|
||
latency: ## Замер задержки голосового контура по этапам — запускать на демо-машине
|
||
cd backend && $(UV) run --extra voice python scripts/latency.py
|
||
|
||
migrate: ## Накатить миграции
|
||
cd backend && $(UV) run alembic upgrade head
|
||
|
||
revision: ## Создать миграцию: make revision m="что изменилось"
|
||
cd backend && $(UV) run alembic revision --autogenerate -m "$(m)"
|
||
|
||
repl: ## Текстовый диалог со звонящим без голоса: make repl s=<сценарий>
|
||
cd backend && $(UV) run python scripts/repl.py "$(s)"
|
||
|
||
pregen: ## Дерево диалога и WAV первых реплик для офлайна
|
||
@echo "не реализовано — карточка tasks/lct-19-reference-dialog.md"; exit 1
|
||
|
||
demo: ## Поднять всё в демо-режиме: офлайн, прогретые модели
|
||
@echo "не реализовано — карточка tasks/lct-21-demo-readiness.md"; exit 1
|
||
|
||
.PHONY: help dev down back front types test typecheck lesson latency migrate revision models seed repl pregen demo
|