О проекте
Команда: gestspeak
Кейс HackAlem.ai: Инновации — Самрук-Казына
Стадия: Доведённый продукт
Задача кейса: «Хаттама»: протокол и поручения по аудиозаписи совещания (каз./рус./смешанная речь)
Суть
Локальный ассистент совещаний: из аудио/видео или транскрипта формирует протокол и поручения с ответственными и сроками, позволяет секретарю проверить их по цитатам и вести реестр исполнения с экспортом PDF/DOCX.
Как устроено
Аудио обрабатывается локальным faster-whisper (RU/KK/mixed) и диаризацией sherpa-onnx или pyannote, реплики сопоставляются по времени с голосовыми кластерами. Поручения и саммари извлекает локальная Ollama/Qwen2.5 либо, при её отсутствии, правила RU/KK; у каждого поручения сохраняется цитата и ID реплик, сроки считаются от даты встречи. FastAPI с очередью и SQLite, интерфейс на React/TypeScript, всё работает без облачных API.
Ключевые решения
- faster-whisper
- sherpa-onnx diarization
- pyannote
- Ollama Qwen2.5
- rule-based извлечение поручений RU/KK
- парсинг относительных сроков
- привязка к цитатам
- экспорт PDF/DOCX
Метрики
33 автопроверки пройдены; синтетическая RU-запись 9,6 с обработана Whisper tiny + sherpa-onnx за 33,7 с; 10 поручений с цитатами на тексте кейса
Особенности
Полностью закрытый контур (локальные веса, без облачных API), каждое поручение проверяемо по исходной цитате и ID реплик; честный отчёт VALIDATION с ограничениями (WER/DER не измерены, tiny ошибается).
Стек
Python · FastAPI · SQLite · TypeScript · React · Docker · Docker Compose · GitHub Actions
Модели
faster-whisper · Qwen2.5 (Ollama) · sherpa-onnx · pyannote · TitaNet
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-a7c30eea-gestspeak.
README
README.md
GestSpeak
Обсудили. Зафиксировали. Выполнили.
Локальный ассистент совещаний для кейса Самрук-Казына. Превращает запись или транскрипт в протокол, поручения с ответственными и сроками, а затем помогает контролировать исполнение. Русский, қазақша и смешанная речь; аудио и текст остаются внутри организации.
Быстрый запуск · Демо за 3 минуты · Установка моделей · API · Результаты проверок
От разговора до исполнения
| 01 · Записать | 02 · Проверить | 03 · Исполнить |
|---|---|---|
| Загрузите запись, включите микрофон или вставьте транскрипт | Уточните имена, проверьте цитаты, ответственных и сроки | Скачайте PDF/DOCX и отслеживайте поручения в общем реестре |
Поручение можно проверить по источнику. У каждого действия сохраняются исходная цитата, ID реплик и произнесённый срок. Голосовой кластер и ответственный за поручение — отдельные сущности. Секретарь подтверждает результат перед исполнением.
Быстрый запуск
Нужно: Node.js 22.13+, npm и Python 3.9+. Установка зависимостей требует интернета.
git clone https://github.com/BAITC-Hacks/hack-a7c30eea-gestspeak.git
cd hack-a7c30eea-gestspeak
bash scripts/setup.sh
bash scripts/start-local.sh
Откройте http://127.0.0.1:8000 · документация API: http://127.0.0.1:8000/docs.
Повторный запуск: bash scripts/start-local.sh. Данные сохраняются в data/. Базовая установка включает текстовый сценарий, демо и экспорт; аудиомодели устанавливаются отдельно по инструкции. На машине финальной проверки лёгкий аудиопрофиль установлен и запущен.
Покажите жюри за 3 минуты
- Создайте результат через API: «Новое совещание» → «Текст» → пример «Русский» → уведомление участников → «Сформировать протокол».
- Проверьте поручение: откройте аудит датчиков; сравните цитаты и итоговый срок 15 октября после обсуждения двух и трёх недель.
- Подтвердите исполнителя и срок: сохраните поручение, переведите его в статус «В работе».
- Покажите контроль: откройте реестр поручений и напоминания, скачайте PDF или DOCX.
- Покажите языки: создайте встречу из казахского или смешанного текста. Укажите дату встречи для расчёта относительных сроков.
Для мгновенного обзора доступен «Открыть демопример» с десятью заранее размеченными поручениями. Он явно помечен в интерфейсе и экспортах; это пример рабочего процесса, а не результат распознавания. Дата 23.09.2026 выбрана как база относительных сроков, поскольку в исходном кейсе дата заседания не указана.
Возможности
| Возможность | Как реализована |
|---|---|
| Распознавание речи RU / KK / mixed | Локальный мультиязычный faster-whisper; качество зависит от выбранных весов |
| Диаризация | Локальная sherpa-onnx или pyannote; сопоставление голосовых интервалов словам по времени |
| Имена участников | Ручная привязка голосового кластера к человеку |
| Поручения и саммари | Локальная Ollama / Qwen2.5; при её отсутствии — явно обозначенный режим правил RU/KK/mixed |
| Проверка результата | Исходные реплики, цитаты, редактирование, подтверждение ответственного и срока |
| Контроль исполнения | Статусы, фильтры, реестр и внутренние напоминания за 3 дня и при просрочке |
| Документы | PDF со встроенным Noto Sans, DOCX и JSON; поддержка кириллицы и казахских символов |
| Аудио и видео | WAV, MP3, M4A, MP4, WEBM, OGG, FLAC, MOV; до 250 МБ и 2 часов; микрофон на localhost/HTTPS |
| Хранение и API | SQLite, журнал событий, удаление встречи, FastAPI / OpenAPI |
| Закрытый контур | Локальные веса и шрифты, отключённая телеметрия, изолированная runtime-сеть Docker |
Что проверено
| Проверка | Фактический результат |
|---|---|
| Автоматические проверки | 33 различные проверки прошли: 29 базовых и 4 дополнительных аудиопроверки |
| Интерфейс | TypeScript и производственная сборка выполнены; статический интерфейс отвечает HTTP 200 |
| Текст кейса → живой API | 10 поручений, у каждого есть цитата и ID реплик; получены корректные PDF и DOCX |
| Локальный аудиопрогон | Синтетическая RU-запись 9,613 с обработана Whisper tiny + sherpa-onnx за 33,70 с |
| Развёртывание на Mac | Служба launchd, автозапуск, HTTP 200; ASR и диаризация доступны в /api/health |
Границы результата. Tiny ошибается: в техническом прогоне были неверное имя и «38 сентября». Качество казахского и смешанного ASR, двухголосой диаризации и LLM не измерено. Ollama на машине проверки не установлена, поэтому поручения извлекаются локальными правилами. Десять поручений на тексте кейса — проверка конкретного сценария, а не общая метрика точности.
GitHub Actions настроен, но runner заблокирован биллингом организации. Docker/GPU и браузерный визуальный прогон не проверены. Полный отчёт с командами и артефактами: VALIDATION.md.
Архитектура
flowchart LR
UI[Браузер] --> API[FastAPI · очередь]
API --> W[Локальный Whisper]
API --> D[sherpa-onnx / pyannote]
W --> T[Реплики · голоса · время]
D --> T
API -->|Готовый текст| T
T --> L[Локальная Ollama / правила]
L --> V[Проверка цитат · сроки RU/KK]
V --> DB[(SQLite)]
DB --> H[Проверка секретарём]
H --> DB
DB --> E[PDF · DOCX · реестр · напоминания]
Сроки рассчитываются от даты встречи: «15 октября» использует её год, «к среде» — ближайшую среду с пометкой неоднозначности, «на следующей неделе» — рабочий интервал понедельник–пятница. Неизвестный срок остаётся пустым. Уточнения и смысловые выводы требуют проверки человеком.
| Каталог / модуль | Ответственность |
|---|---|
| backend/gestspeak | API, ASR, диаризация, извлечение, SQLite и экспорт |
| frontend/app | Интерфейс совещаний, поручений и проверки |
| backend/tests | Даты, происхождение полей, API и документы |
| examples | RU, KK, mixed и синтетические записи |
| scripts | Установка, модели, локальный запуск и служба macOS |
Воспроизводимость
source .venv/bin/activate
pip install pytest==8.4.1 pypdf==5.9.0
PYTHONPATH=backend pytest backend/tests -q
cd frontend
npm run typecheck
npm run build
Тесты не измеряют WER/CER, DER или точность LLM. Для оценки нужны отдельные анонимизированные или синтетические записи с эталонными репликами, голосовыми интервалами, поручениями и сроками.
| Документ | Что внутри |
|---|---|
| Демонстрация | Сценарий защиты и последовательность действий |
| Установка и модели | CPU-профиль, полный AI-контур, Docker, GPU и автозапуск на Mac |
| API | Запросы, асинхронная обработка, экспорт и ошибки |
| Проверки | Фактические результаты и ограничения |
| Безопасность | Локальная обработка, доступ, хранение и границы прототипа |
Ценность для заказчика
Секретарь получает черновик с проверяемыми источниками. Руководитель видит что сделать, кто отвечает и когда срок. История встречи, поручения и документы находятся в одном рабочем пространстве.
| Критерий хакатона | Что можно показать |
|---|---|
| Работоспособность · 25 | Путь от записи/текста до подтверждённого поручения и документа |
| Техническая реализация · 25 | Локальные модели, очередь, источники, календарные правила, API |
| README и воспроизводимость · 25 | Скрипты, примеры, подготовка весов, Docker и отчёт проверок |
| Ценность · 15 | Проверка секретарём, ответственные, сроки и контроль исполнения |
| Потенциал · 10 | JSON для СЭД, независимые AI-адаптеры, проверяемость результата |
Баллы в таблице — веса организатора. Следующие этапы: измерение качества на данных заказчика, адаптер СЭД, уведомления, роли доступа и масштабирование очереди. Бот-участник Teams/Zoom/Meet, потоковая транскрипция, email, промышленная СЭД, SSO/RBAC и биометрическая идентификация пока не реализованы; записи платформ можно загрузить файлом.
Приватность и лицензии
Аудио и текст не отправляются во внешние облачные AI API. OpenAI/NVIDIA hosted API не используются: это ограничение кейса. NVIDIA GPU и TitaNet доступны в локальной конфигурации. Веса подготавливаются отдельно; при отсутствии моделей приложение сообщает об этом, сохраняя данные локально.
Базовый режим рассчитан на одного доверенного пользователя на localhost. Для сети нужны GESTSPEAK_API_TOKEN, внутренний TLS reverse proxy и точный список GESTSPEAK_ALLOWED_ORIGINS; подробности в SECURITY.md. Записи, база, .env и веса исключены из Git.
Код — MIT. Библиотеки и модели сохраняют собственные лицензии; Noto Sans — SIL OFL, pyannote требует принятия условий модели. GestSpeak не аффилирован с Notion или OpenAI.
Авторы коммитов
История коммитов
- 2026-09-23 17:59feat(web): shorten the live demo path and link tasks to their meetingMuhammad
- 2026-09-23 17:58docs: polish jury presentation and organize setup and API guidesMuhammad
- 2026-09-23 17:51feat(deploy): run the local application as a managed macOS serviceMuhammad
- 2026-09-23 17:47fix(ai): verify native audio pipeline and record reproducible validationMuhammad
- 2026-09-23 17:41docs: publish reproducible setup API guide and hackathon demo checklistMuhammad
- 2026-09-23 17:40fix(api): recover contextual assignments and harden meeting lifecycleMuhammad
- 2026-09-23 17:40feat(ai): add offline CPU speech and diarization model profileMuhammad
- 2026-09-23 17:36fix(web): simplify workspace and make recording and review flows reliableMuhammad
Все коммиты (17)
- 2026-09-23 17:05build: package isolated deployment and reproducible launch scriptsMuhammad
- 2026-09-23 17:05docs: prepare judge quickstart, architecture and honest validation reportMuhammad
- 2026-09-23 17:05test: verify multilingual deadlines, exports, persistence and access controlsMuhammad
- 2026-09-23 17:05feat(web): build Notion-inspired meeting and assignment workspaceMuhammad
- 2026-09-23 17:05feat(api): add meeting workflow, task review and PDF DOCX exportsMuhammad
- 2026-09-23 17:05feat(ai): add offline ASR, diarization and evidence-checked task extractionMuhammad
- 2026-09-23 17:05chore: establish local-only configuration and meeting data modelsMuhammad
- 2026-09-23 15:12Create startyarosru0235
- 2026-09-23 14:47Create StartZanderrr
Структура репозитория (73 файлов)
.dockerignore .env.example .github/workflows/ci.yml .gitignore Dockerfile LICENSE README.md assets/fonts/NotoSans-Regular.ttf assets/fonts/OFL.txt backend/gestspeak/__init__.py backend/gestspeak/dates.py backend/gestspeak/demo.py backend/gestspeak/engine.py backend/gestspeak/exports.py backend/gestspeak/lightweight_audio.py backend/gestspeak/main.py backend/gestspeak/schema.py backend/gestspeak/store.py backend/requirements-ai.txt backend/requirements-light.txt backend/requirements-tested.txt backend/requirements.txt backend/tests/conftest.py backend/tests/test_api_regressions.py backend/tests/test_core.py backend/tests/test_extraction.py backend/tests/test_lightweight_audio.py compose.yaml docs/API.md docs/DEMO.md docs/SECURITY.md docs/SETUP.md docs/VALIDATION.md docs/audio-smoke.json docs/cover.svg docs/light-dependencies-manifest.json docs/light-models-manifest.json examples/audio/README.md examples/audio/synthetic-russian.txt examples/audio/synthetic-russian.wav examples/audio/synthetic-two-speakers.wav examples/kazakh.txt examples/mixed.txt examples/samruk.txt frontend/.gitignore frontend/.openai/hosting.json frontend/app/globals.css frontend/app/layout.tsx frontend/app/page.tsx frontend/components.json frontend/components/ui/alert-dialog.tsx frontend/components/ui/button.tsx frontend/components/ui/checkbox.tsx frontend/components/ui/dialog.tsx frontend/components/ui/native-select.tsx frontend/components/ui/table.tsx frontend/components/ui/tabs.tsx frontend/lib/sample-transcripts.ts frontend/lib/utils.ts frontend/next.config.ts frontend/package-lock.json frontend/package.json frontend/public/favicon.svg frontend/public/fonts/NotoSans-Regular.ttf frontend/tsconfig.json frontend/vite.config.ts scripts/deploy-macos.py scripts/dev.sh scripts/prepare-light-models.py scripts/prepare-models.py scripts/setup.sh scripts/smoke-local-audio.py scripts/start-local.sh
Ветки (2)
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.