AAYMA
RU
Войти

Совещание без потерянных поручений

Локальный офлайн-секретарь совещаний: из аудио/видео строит транскрипт с диаризацией, извлекает саммари и поручения со сроками и ссылками на…

Рабочий MVP
Команда «Beaver» 10💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: 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 и семантическая проверка ссылок, участников, дат и интервалов.

Как работает решение

  1. Секретарь создаёт встречу, указывает дату, часовой пояс и участников.
  2. Выбирается REAL или FIXTURE, затем загружается локальная запись.
  3. В REAL локальные Whisper и ONNX-диаризатор создают реплики с временными метками и слотами говорящих. В FIXTURE берётся только заранее сохранённый пример; он помечается в интерфейсе как синтетический.
  4. Секретарь сопоставляет слоты говорящих с участниками и подтверждает карту. Это ручное подтверждение, а не биометрическая идентификация.
  5. Локальная Ollama-модель извлекает черновик протокола. Сроки считаются от даты совещания в его часовом поясе; неизвестные исполнитель и срок остаются null.
  6. Секретарь проверяет 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

В браузере:

  1. выберите FIXTURE — синтетический пример;
  2. создайте встречу с участниками p1:Данияр, p2:Айдана;
  3. выберите небольшой локальный аудиофайл и нажмите «Загрузить и обработать»;
  4. подтвердите speaker map, нажмите «Извлечь поручения»;
  5. проверьте 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 тестов, PASSreports/test-results.json
ASR на трёх WAV, сгенерированных espeakPASS, GPU-профильreports/real-asr/gpu-results.json
ASR + ONNX-диаризация на RU/KK/MIX файлахтехнический путь PASSreports/real-pipeline/speech-diarization.json
Полный локальный HTTP-путь для RUjob done, extraction HTTP 200, DOCX созданreports/real-pipeline/http-real-ru.json
Полный прямой путь KK и MIXконтрактный результат PASSfull-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.

Структура репозитория

Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
18
Авторы
2
Файлы
140
Ветки
1

Авторы коммитов

user 16RonyMacfly 2

История коммитов

  • 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 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.