О проекте
Команда: Beaver
Кейс HackAlem.ai: Инновации — Самрук-Казына
Стадия: Рабочий MVP
Задача кейса: «Хаттама»: протокол и поручения по аудиозаписи совещания (каз./рус./смешанная речь)
Суть
Локальный офлайн-секретарь совещаний: из аудио/видео строит транскрипт с диаризацией, извлекает саммари и поручения со сроками и ссылками на реплики, после утверждения секретарём экспортирует DOCX.
Как устроено
Аудио загружается в FastAPI, фоново обрабатывается faster-whisper small (без перевода) и ONNX-экспортом pyannote для диаризации; секретарь вручную подтверждает карту speaker_id → участник. Локальная Ollama qwen2.5:3b извлекает поручения, сроки (считаются от даты встречи в её часовом поясе), вопросы по недостающим реквизитам; неизвестные поля остаются null. Результат валидируется JSON Schema и семантическими проверками, изменения пишутся в типизированный ledger, после ручного утверждения экспорт в DOCX через python-docx.
Ключевые решения
- faster-whisper
- pyannote ONNX diarization
- JSON Schema validation
- evidence ledger
- python-docx export
- REAL/FIXTURE modes
Особенности
Полностью локальный пайплайн без облака; каждое поручение привязано к временным интервалам транскрипта (evidence), журнал событий create/propose/accept/reject с воспроизведением по времени; честное разделение REAL и синтетического FIXTURE-режима и явная фиксация непроверенных сценариев.
Стек
Python · FastAPI · Uvicorn · SQLite · ONNX Runtime · Ollama · vanilla JS · python-docx · unittest
Модели
faster-whisper small (Systran) · Ollama qwen2.5:3b · pyannote-speaker-diarization-onnx
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-7d83393e-beaver.
README
README.mdСовещание без потерянных поручений
Локальный прототип секретаря совещаний: запись проходит через распознавание речи и диаризацию, затем из транскрипта формируется проверяемый протокол с поручениями, сроками и ссылками на реплики. Секретарь подтверждает соответствие голоса участнику, исправляет черновик и только после этого утверждает и экспортирует DOCX.
Проект рассчитан на команды, которым нужен воспроизводимый протокол без отправки аудио и текста во внешнее облако. Приложение работает на одном локальном компьютере и обрабатывает одно совещание за раз.
Что реализовано
- локальный веб-интерфейс на русском языке;
- два явно различающихся режима:
REAL(локальные модели) иFIXTURE(детерминированный синтетический пример); - загрузка аудио/видео и фоновая обработка с отображением статуса job;
- транскрибирование через локальный
faster-whisperбез перевода исходной речи; - диаризация через открытый ONNX-экспорт сегментации, после которой секретарь
вручную подтверждает
speaker_id → participant_id; - извлечение саммари, поручений, сроков, вопросов по отсутствующим реквизитам и предупреждений через локальную модель Ollama;
- evidence: каждая реплика, поручение и изменение связаны с существующими временными интервалами транскрипта;
- ручное исправление поручений с аудитом и типизированный ledger для событий
create/propose/accept/reject/cancelс воспроизведением по времени; - просмотр событий выбранного интервала («что обсуждали»);
- явное утверждение протокола человеком и экспорт черновика или утверждённой версии в DOCX;
- JSON Schema протокола версии 1.0 и семантическая проверка ссылок, участников, дат и интервалов.
Как работает решение
- Секретарь создаёт встречу, указывает дату, часовой пояс и участников.
- Выбирается
REALилиFIXTURE, затем загружается локальная запись. - В
REALлокальные Whisper и ONNX-диаризатор создают реплики с временными метками и слотами говорящих. ВFIXTUREберётся только заранее сохранённый пример; он помечается в интерфейсе как синтетический. - Секретарь сопоставляет слоты говорящих с участниками и подтверждает карту. Это ручное подтверждение, а не биометрическая идентификация.
- Локальная Ollama-модель извлекает черновик протокола. Сроки считаются от
даты совещания в его часовом поясе; неизвестные исполнитель и срок остаются
null. - Секретарь проверяет evidence, редактирует поля при необходимости, утверждает протокол и скачивает DOCX с соответствующей маркировкой.
Технологии и модели
| Слой | Реализация |
|---|---|
| Язык и запуск | Python 3.12, FastAPI, Uvicorn |
| Хранилище | SQLite (storage.py) |
| Интерфейс | HTML, CSS и vanilla JavaScript в static/ |
| Распознавание | faster-whisper / CTranslate2, локальная модель Systran/faster-whisper-small |
| Диаризация | ONNX Runtime, soundfile, scipy; локальный открытый экспорт FredrikKarlssonSpeech/pyannote-speaker-diarization-onnx |
| Извлечение протокола | Ollama на loopback (127.0.0.1:11434), модель qwen2.5:3b |
| Контракты и экспорт | jsonschema, python-docx, contract.schema.json, ledger.schema.json |
| Проверки | стандартный unittest, скрипты preflight.py, model_manifest.py, cli.py |
В рабочем режиме приложение не обращается к внешнему API. Hugging Face нужен только для предварительного скачивания весов в локальные каталоги; Ollama также запускается локально. Модели, записи и секреты не входят в Git.
Архитектура
graph LR
B[Браузер] --> A[FastAPI / app.py]
A --> S[SQLite / storage.py]
A --> SP[services/speech.py]
SP --> W[faster-whisper]
SP --> D[ONNX diarization]
A --> P[services/protocol.py]
P --> O[Ollama qwen2.5:3b]
P --> C[contracts.py + JSON Schema]
L[services/ledger.py] --> C
C --> X[services/export_docx.py]
X --> DOCX[DOCX]
Основные точки HTTP-контракта: POST /api/meetings, POST /api/meetings/{id}/audio, GET /api/jobs/{id}, GET /api/meetings/{id}/protocol, PUT /api/meetings/{id}/speaker-map, POST /api/meetings/{id}/extract, PATCH /api/meetings/{id}/tasks/{task_id}, POST /api/meetings/{id}/approve, GET /api/meetings/{id}/export.docx и POST /api/meetings/{id}/catch-up. Полный список и форматы находятся в API.md.
Интерфейс
Главный экран объединяет создание встречи, загрузку записи, транскрипт, подтверждение говорящих, поручения, вопросы секретарю и экспорт.

Заполненный экран показывает транскрипт с временными метками, speaker map, evidence и действие скачивания DOCX.

Установка и запуск
1. Python-окружение
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/python scripts/cli.py test
requirements.txt устанавливает только Python-зависимости. Веса моделей не
скачиваются автоматически.
2. Подготовка локальных моделей (один раз при доступной сети)
ASR-модель должна находиться в models/faster-whisper-small:
.venv/bin/pip install huggingface_hub
.venv/bin/python - <<'PY'
from huggingface_hub import snapshot_download
snapshot_download("Systran/faster-whisper-small", local_dir="models/faster-whisper-small")
snapshot_download(
"FredrikKarlssonSpeech/pyannote-speaker-diarization-onnx",
local_dir="models/pyannote-onnx",
)
PY
Локальный runtime Ollama должен содержать qwen2.5:3b. В текущем окружении
используется бинарник .local/bin/ollama и каталог models/ollama (оба
игнорируются Git):
mkdir -p models/ollama
OLLAMA_HOST=127.0.0.1:11434 \
OLLAMA_MODELS="$PWD/models/ollama" \
OLLAMA_NO_CLOUD=1 \
.local/bin/ollama serve
В другом терминале при необходимости выполните .local/bin/ollama pull qwen2.5:3b. Если бинарник Ollama ещё не подготовлен в окружении, его нужно
установить отдельно до запуска этого шага.
3. Переменные окружения
Для CPU достаточно значений по умолчанию. Для проверенного GPU-профиля RTX 3070 использовались:
export WHISPER_MODEL_PATH="$PWD/models/faster-whisper-small"
export PYANNOTE_MODEL_PATH="$PWD/models/pyannote-onnx"
export WHISPER_DEVICE=cuda
export WHISPER_COMPUTE_TYPE=float16
export OLLAMA_HOST=http://127.0.0.1:11434
export OLLAMA_MODEL=qwen2.5:3b
export OLLAMA_NO_CLOUD=1
export OLLAMA_BIN="$PWD/.local/bin/ollama"
export LD_LIBRARY_PATH="$PWD/.venv/lib/python3.12/site-packages/nvidia/cublas/lib:$PWD/.venv/lib/python3.12/site-packages/nvidia/cuda_nvrtc/lib:$LD_LIBRARY_PATH"
На CPU задайте WHISPER_DEVICE=cpu и WHISPER_COMPUTE_TYPE=int8.
4. Запуск приложения
.venv/bin/python scripts/preflight.py --json --strict
.venv/bin/python scripts/cli.py run --host 127.0.0.1 --port 8000
Откройте http://127.0.0.1:8000. Остановить сервер можно командой:
.venv/bin/python scripts/cli.py stop
Как проверить решение
Быстрый сценарий для жюри не требует моделей и показывает весь интерфейс:
.venv/bin/python scripts/cli.py test
.venv/bin/python check_examples.py
.venv/bin/python scripts/cli.py run --host 127.0.0.1 --port 8000
В браузере:
- выберите
FIXTURE — синтетический пример; - создайте встречу с участниками
p1:Данияр, p2:Айдана; - выберите небольшой локальный аудиофайл и нажмите «Загрузить и обработать»;
- подтвердите speaker map, нажмите «Извлечь поручения»;
- проверьте evidence и статус черновика, затем утвердите и скачайте DOCX.
Для проверки окружения с локальными моделями:
DIARIZATION_MODEL_PATH="$PWD/models/pyannote-onnx" \
OLLAMA_BIN="$PWD/.local/bin/ollama" \
.venv/bin/python scripts/preflight.py --json --strict
.venv/bin/python -m unittest discover -s tests -v
Фактические артефакты текущей проверки:
| Проверка | Результат | Артефакт |
|---|---|---|
| Unit, контрактные, protocol, ledger и DOCX-тесты | 18 тестов, PASS | reports/test-results.json |
ASR на трёх WAV, сгенерированных espeak | PASS, GPU-профиль | reports/real-asr/gpu-results.json |
| ASR + ONNX-диаризация на RU/KK/MIX файлах | технический путь PASS | reports/real-pipeline/speech-diarization.json |
| Полный локальный HTTP-путь для RU | job done, extraction HTTP 200, DOCX создан | reports/real-pipeline/http-real-ru.json |
| Полный прямой путь KK и MIX | контрактный результат PASS | full-kk_case.json, full-mix_case.json |
Данные и интеграции
examples/содержит три вымышленных JSON-эталона дляFIXTURE; это не результаты распознавания.- Загруженные записи и SQLite-файл хранятся локально в
data/и не отслеживаются Git. - Контракт протокола описан в
contract.schema.json, история изменений — вledger.schema.json. - Входной текст транскрипта передаётся модели как данные в разделённом блоке; он не является инструкцией и не получает права выполнять команды.
- Сетевые адреса моделей и Ollama ограничены локальными путями и loopback; произвольные URL для скачивания моделей запрещены.
Ограничения текущей версии
- Реальные прогонки выполнены на синтетической речи, созданной
espeak. Это подтверждает технический pipeline, но не качество распознавания живой записи: в KK/MIX отчётах текст и определённый язык могут быть ошибочными. - ONNX-адаптер выдаёт слоты активности говорящих. Связь слота с человеком подтверждает секретарь; голосовая биометрическая идентификация не выполняется.
- Гейтированный оригинальный snapshot
pyannote/speaker-diarization-community-1в текущем окружении недоступен, поэтому используется открытый ONNX-экспорт. scripts/cli.py verify --profile full --offlineоставляет проверки новой естественной RU/KK/MIX записи и браузерного offline E2E какNOT RUNи возвращает код 2, пока эти проверки не выполнены отдельно.- Поддерживается одно совещание за раз. Нет интеграций Teams/Zoom/Meet, удалённой очереди, промышленной аутентификации или распознавания лиц.
- Скорость и качество извлечения зависят от локального Ollama и выбранной
модели; при отсутствии модели
REALзавершается явной ошибкой и не заменяется fixture-путём.
Deployed-версия
Публичной или удалённой deployed-версии нет. Запуск предусмотрен локально по адресу http://127.0.0.1:8000.
Структура репозитория
app.py,storage.py— HTTP-приложение и SQLite;services/speech.py— ASR и диаризация;services/protocol.py— извлечение протокола;services/ledger.py— история событий;services/export_docx.py— экспорт;static/— интерфейс;scripts/cli.py,scripts/preflight.py— запуск и проверки;AGENTS.md,API.md,DEMO.md— правила, API и сценарий демонстрации.
Авторы коммитов
История коммитов
- 2026-09-23 17:53docs: rewrite README for juryuser
- 2026-09-23 17:48Add populated protocol UI previewuser
- 2026-09-23 17:46Add current interface screenshot to READMEuser
- 2026-09-23 17:45Run REAL RU KK and mixed pipelines locallyuser
- 2026-09-23 17:41Record full verification with explicit unrun casesuser
- 2026-09-23 17:41Keep full verification nonzero for unrun casesuser
- 2026-09-23 17:41Complete local REAL speech diarization and HTTP pipelineuser
- 2026-09-23 17:28Document GPU Whisper setupuser
Все коммиты (18)
- 2026-09-23 17:27Enable GPU Whisper profile and record real speech casesuser
- 2026-09-23 17:18Refresh local runtime manifestuser
- 2026-09-23 17:17Record GPU runtime limitationuser
- 2026-09-23 17:13Run three synthetic speech ASR casesuser
- 2026-09-23 17:12deluser
- 2026-09-23 17:07Integrate evidence ledger and local model verificationuser
- 2026-09-23 16:36featuser
- 2026-09-23 15:56Update testuser
- 2026-09-23 15:49Update testRonyMacfly
- 2026-09-23 15:05Create testRonyMacfly
Структура репозитория (140 файлов)
.env.example .gitignore ACCEPTANCE.md AGENTS.md API.md DEMO.md FINAL_EVALUATION_AUDIT.md MASTER_PROMPT.md README.md SOURCES.md SPRINT.md TEST_REPORT.md agent_tasks/A_speech.md agent_tasks/B_protocol.md agent_tasks/C_ui.md agent_tasks/D_qa_export.md agent_tasks/E_vision_optional.md app.py check_examples.py config.py contract.schema.json contracts.py examples/01_mixed_deadline.json examples/02_ru_missing_fields.json examples/03_kk_no_new_task.json ledger.schema.json models/manifest.json prompts/extract.txt protocol_evidence_upgrade/BUILD_STATUS.md protocol_evidence_upgrade/COMPETITIVE_SPEC.md protocol_evidence_upgrade/EVALUATOR_GUIDE.md protocol_evidence_upgrade/INDEPENDENT_QA_AGENT.md protocol_evidence_upgrade/PACKAGE_MANIFEST.json protocol_evidence_upgrade/README.md protocol_evidence_upgrade/SOURCES.md protocol_evidence_upgrade/START_COMPETITIVE.md protocol_evidence_upgrade/hackathon_agent_pack/.gitignore protocol_evidence_upgrade/hackathon_agent_pack/ACCEPTANCE.md protocol_evidence_upgrade/hackathon_agent_pack/AGENTS.md protocol_evidence_upgrade/hackathon_agent_pack/API.md protocol_evidence_upgrade/hackathon_agent_pack/AUTONOMOUS_SETUP.md protocol_evidence_upgrade/hackathon_agent_pack/DEMO.md protocol_evidence_upgrade/hackathon_agent_pack/LAUNCH_PROMPT.md protocol_evidence_upgrade/hackathon_agent_pack/MASTER_PROMPT.md protocol_evidence_upgrade/hackathon_agent_pack/README.md protocol_evidence_upgrade/hackathon_agent_pack/SOURCES.md protocol_evidence_upgrade/hackathon_agent_pack/SPRINT.md protocol_evidence_upgrade/hackathon_agent_pack/START_ALL_AGENTS.md protocol_evidence_upgrade/hackathon_agent_pack/agent_tasks/A_speech.md protocol_evidence_upgrade/hackathon_agent_pack/agent_tasks/B_protocol.md protocol_evidence_upgrade/hackathon_agent_pack/agent_tasks/C_ui.md protocol_evidence_upgrade/hackathon_agent_pack/agent_tasks/D_qa_export.md protocol_evidence_upgrade/hackathon_agent_pack/agent_tasks/E_vision_optional.md protocol_evidence_upgrade/hackathon_agent_pack/check_examples.py protocol_evidence_upgrade/hackathon_agent_pack/contract.schema.json protocol_evidence_upgrade/hackathon_agent_pack/examples/01_mixed_deadline.json protocol_evidence_upgrade/hackathon_agent_pack/examples/02_ru_missing_fields.json protocol_evidence_upgrade/hackathon_agent_pack/examples/03_kk_no_new_task.json protocol_evidence_upgrade/reference_core/.gitignore protocol_evidence_upgrade/reference_core/README.md protocol_evidence_upgrade/reference_core/evidence_core/__init__.py protocol_evidence_upgrade/reference_core/evidence_core/__main__.py protocol_evidence_upgrade/reference_core/evidence_core/app.py protocol_evidence_upgrade/reference_core/evidence_core/audit.py protocol_evidence_upgrade/reference_core/evidence_core/contract.schema.json protocol_evidence_upgrade/reference_core/evidence_core/export_docx.py protocol_evidence_upgrade/reference_core/evidence_core/ledger.py protocol_evidence_upgrade/reference_core/evidence_core/ledger.schema.json protocol_evidence_upgrade/reference_core/fixtures/01_mixed_deadline.json protocol_evidence_upgrade/reference_core/fixtures/02_ru_missing_fields.json protocol_evidence_upgrade/reference_core/fixtures/03_kk_no_new_task.json protocol_evidence_upgrade/reference_core/fixtures/ledger_mixed.json protocol_evidence_upgrade/reference_core/pytest.ini protocol_evidence_upgrade/reference_core/reports/browser-component-results.json protocol_evidence_upgrade/reference_core/reports/http-smoke.json protocol_evidence_upgrade/reference_core/reports/protocol-example.docx protocol_evidence_upgrade/reference_core/reports/reference-junit.xml protocol_evidence_upgrade/reference_core/reports/reference-results.json protocol_evidence_upgrade/reference_core/reports/reference-server.log protocol_evidence_upgrade/reference_core/reports/ui-downloaded-protocol.docx protocol_evidence_upgrade/reference_core/reports/ui-reference.png protocol_evidence_upgrade/reference_core/requirements-browser.txt protocol_evidence_upgrade/reference_core/requirements.txt protocol_evidence_upgrade/reference_core/scripts/browser_check.py protocol_evidence_upgrade/reference_core/scripts/browser_component_check.py protocol_evidence_upgrade/reference_core/scripts/verify_reference.py protocol_evidence_upgrade/reference_core/static/app.js protocol_evidence_upgrade/reference_core/static/index.html protocol_evidence_upgrade/reference_core/static/style.css protocol_evidence_upgrade/reference_core/tests/test_core.py protocol_evidence_upgrade/requirements-status.json reports/core-final/junit.xml reports/core-final/results.json reports/core/junit.xml reports/core/results.json reports/data-manifest.json reports/evaluate/junit.xml reports/evaluate/results.json reports/full-final/junit.xml reports/full-final/results.json reports/full-real-final/junit.xml reports/full-real-final/results.json reports/full/junit.xml reports/full/results.json reports/gpu/status.json reports/real-asr/gpu-results.json reports/real-asr/results.json reports/real-pipeline/full-kk_case.json reports/real-pipeline/full-mix_case.json reports/real-pipeline/full-ru.docx reports/real-pipeline/full-ru.json reports/real-pipeline/http-real-ru.json reports/real-pipeline/speech-diarization.json reports/test-results.json reports/ui/interface.png reports/ui/populated-preview.html reports/ui/protocol-preview.png requirements-traceability.json requirements.txt scripts/__init__.py scripts/cli.py scripts/model_manifest.py scripts/preflight.py services/__init__.py services/export_docx.py services/ledger.py services/protocol.py services/speech.py static/app.js static/index.html static/style.css storage.py test tests/__init__.py tests/acceptance/__init__.py tests/acceptance/test_export_docx.py tests/acceptance/test_preflight.py tests/test_app.py tests/test_ledger.py tests/test_protocol.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.