AAYMA
RU
Войти

AI Hatshy

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

Доведённый продукт
Команда «smaguloveka» 10💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: smaguloveka
Кейс HackAlem.ai: Инновации — Самрук-Казына
Стадия: Доведённый продукт

Задача кейса: «Хаттама»: протокол и поручения по аудиозаписи совещания (каз./рус./смешанная речь)

Суть

Локальный ИИ-секретарь: по записи совещания на русском, казахском или смешанной речи строит транскрипт с диаризацией, поручения с ответственными и сроками, краткую и подробную сводку, экспорт в PDF/DOCX. Есть дашборд исполнения с напоминаниями, отправка в СЭД и MCP-сервер.

Как устроено

Аудио проходит через ffmpeg, затем Silero VAD, эмбеддинги NeMo TitaNet-small и агломеративную кластеризацию говорящих. Распознавание делает GigaAM-Multilingual CTC (int8 ONNX, CPU) с определением языка реплики по казахским буквам. LLM (по умолчанию Ollama) извлекает поручения по JSON-схеме, затем правила проверяют цитату в транскрипте и переводят RU/KZ-сроки в даты резолвером. Поверх этого работают голосовые профили (порог сходства ≥0,65), ИИ-помощник по всем встречам, вебхуки в СЭД и локальный MCP-сервер.

Ключевые решения

  • GigaAM-Multilingual CTC ONNX
  • Silero VAD
  • NeMo TitaNet-small
  • agglomerative clustering diarization
  • rule-based deadline resolver
  • quote verification
  • MCP server
  • voice profiles

Метрики

CER 0,6% (KZ) и 0,7% (смешанная речь); распознано 226 из 231 казахских букв; число голосов определено верно на 4/4 тестовых записях

Особенности

Распознавание, диаризация и LLM работают в закрытом контуре. Сроки считаются правилами, а не LLM, в том числе казахские формулировки («жұмаға дейін»). Качество измерено на синтетических KZ и смешанных записях с эталонами. Есть MCP-сервер на 9 инструментов для внешних агентов.

Стек

Python · ONNX Runtime · Ollama · React · ffmpeg · PDF/DOCX export

Модели

GigaAM-Multilingual · Ollama (локальная LLM) · OpenAI-совместимый API · NeMo TitaNet-small


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-c9414062-smaguloveka.

README

README.md

1. AI Hatshy — ИИ-секретарь совещаний с фиксацией поручений

Решение кейса HackAlem AI «Система автопротоколирования совещаний с фиксацией поручений». «Хатшы» по-казахски — «секретарь».

Коротко. Загружаете или записываете совещание, и через несколько минут получаете готовый протокол:

  • кто говорил и что сказал — на русском, казахском или вперемешку;
  • поручения: кто отвечает, что сделать, к какому сроку, с цитатой и моментом записи;
  • краткая и подробная сводка, PDF и DOCX;
  • дашборд исполнения, напоминания о сроках, отправка поручений в СЭД;
  • ИИ-помощник, которому можно задать вопрос по всем встречам.

Распознавание и разделение говорящих всегда выполняются на вашем сервере.

Оглавление: Описание · Почему это решение · Что реализовано · Как работает · Технологии · Архитектура · Установка · Проверка · Данные и интеграции · Ограничения · Deployed-версия · Масштабирование и развитие

2. Краткое описание

Проблема. Протоколы совещаний ведут вручную. Это отнимает время секретаря, а поручения, сроки и ответственные теряются или искажаются, и контролировать исполнение трудно.

Для кого.

  • Секретарь получает готовый протокол вместо ручной записи.
  • Руководитель видит исполнение поручений и просрочки на дашборде.
  • Ответственные получают свои поручения и напоминания.
  • ИТ-служба разворачивает решение в закрытом контуре и подключает его к СЭД.

Что делает система. Превращает запись совещания на русском, казахском или шала-казахском в протокол:

  • транскрипт с разделением по говорящим;
  • поручения с ответственным и сроком;
  • краткая и подробная сводка;
  • экспорт в PDF и DOCX.

Дальше система ведёт исполнение: статусы, напоминания, отправку во внешние системы.

Почему это решение

ПреимуществоЧто за этим стоит (проверяется по репозиторию)
Закрытый контур по умолчаниюРаспознавание речи, диаризация и голосовые профили работают локально на CPU. LLM по умолчанию локальная (Ollama). Внешний API включается только явно и только для текста — интерфейс об этом предупреждает. React и шрифты лежат в репозитории, страницы не обращаются к CDN
Казахский и шала-казахский «из коробки»Одна модель GigaAM-Multilingual распознаёт RU и KZ без переключения языка. На тестовых записях ошибка по символам (CER) 0,6% для KZ и 0,7% для смешанной речи, распознано 226 из 231 казахских букв. Сроки понимаются и по-казахски: «жұмаға дейін», «он бесінші қазанға дейін»
Поручениям можно доверятьУ каждого поручения есть дословная цитата и таймкод, по клику играет запись. Сроки пересчитываются в даты правилами, а не «угадываются» LLM. Если цитата не нашлась в транскрипте, поручение помечается «требует проверки». Секретарь подтверждает поручения
Кто сказал — известноАвтоматическая диаризация. Имена подставляются по обращениям в речи («Гульмира Сериковна, вам слово») и по голосовым профилям. Число голосов определено верно на всех 4 тестовых записях
Полный цикл, а не только расшифровкаЗапись → протокол → PDF/DOCX → дашборд исполнения → напоминания и эскалация → выдержки ответственным → отправка в СЭД
ИИ-помощник по всем встречам«Где обсуждали бюджет и что решили?» — ответ со ссылкой на совещание и момент записи. Внутри встречи отвечает в её контексте. Язык ответа — RU, KZ или EN, как в интерфейсе
Интеграция с любой СЭДЛюбое подключение настраивается в интерфейсе: адрес, авторизация, свой JSON-шаблон. Отправка из карточки поручения или автоматически после протокола
Открыто для ИИ-агентов (MCP)Локальный MCP-сервер: Claude Code, Claude Desktop и другие агенты могут читать совещания, искать по стенограммам и вести поручения
Легко развернутьОдин сервер, модели распознавания ~0,63 ГБ, мастер первого запуска сам скачивает модели и помогает выбрать LLM
Качество измереноЭталоны поручений, синтетические KZ/RU+KZ записи, скрипты оценки и юнит-тесты лежат в репозитории, результаты — в eval/results.md

3. Что реализовано

Распознавание и протокол

ФункцияРеализацияКод
Распознавание речи RU / KZ / шала-казахскийМодель GigaAM-Multilingual large CTC (int8 ONNX, CPU) с общим словарём RU+KZ. Язык каждой реплики (RU / KZ / RU+KZ) определяется по казахским буквам и служебным словамapp/pipeline/asr.py, app/pipeline/text.py
Диаризация (кто говорит)Silero VAD → голосовые эмбеддинги NeMo TitaNet-small → агломеративная кластеризация (число голосов подбирается автоматически) → поиск смены говорящего внутри длинных фрагментов. Имена — по обращениям в речи; говорящего можно переименовать вручнуюapp/pipeline/diarize.py, app/pipeline/llm/speaker_names.py
Голосовые профили (узнавание по тембру)Профиль создаётся по фрагменту обработанного совещания или по 20-секундной записи с микрофона. Для фрагмента есть окно со шкалой записи, подсветкой реплик, прослушиванием и превью текста. Хранится только вектор голоса. В новых совещаниях имя подставляется «по голосу» при сходстве ≥ 0,65app/voice.py
Поручения с ответственным и срокомLLM извлекает поручения по JSON-схеме. Затем правила без LLM: цитата должна найтись в транскрипте, срок пересчитывается резолвером от даты совещания (RU и KZ формулировки), определяются срочность и направлениеapp/pipeline/llm/*, app/pipeline/protocol.py
Краткая сводкаКраткое содержание, решения, повестка с таймкодами, ключевые цифры, доля речиapp/pipeline/protocol.py
Подробная сводкаОтчёт для тех, кто не был на встрече: разбор каждого вопроса (обсуждение, факты и цифры, решения, поручения, риски, открытые вопросы), позиции участников, следующие шаги, выводapp/pipeline/report.py
Экспорт PDF / DOCXСтруктура эталонных протоколов организаторов: тема, краткое содержание, решения, таблица «Поручение / Ответственный / Срок», стенограмма с таймкодами, участники, подписи. Разделы выбираются, есть анонимизация ФИОapp/export/*

Контроль исполнения

ФункцияРеализацияКод
Уведомление о записи (сценарий 1)При старте записи проигрывается объявление на казахском и русском (app/static/consent.mp3), отметка сохраняетсяweb/index.html
Напоминания (сценарий 2)Правила «за 3 дня», «в день срока», «ежедневно при просрочке», «эскалация куратору через 2 дня просрочки». Напоминания получают и исполнитель, и куратор поручения (кто поручил). Лента уведомлений и письма .eml в data/outbox/. Для демонстрации можно подставить «текущую дату»app/reminders.py
Дашборд поручений«В работе / Просрочено / Выполнено», исполнительская дисциплина, сроки на две недели, нагрузка по ответственным, направления, доска и список с фильтрамиweb/index.html
Выдержки ответственнымКаждому ответственному — письмо с его поручениями и цитатами (data/outbox/). Рассылаются автоматически сразу после формирования протокола (правило можно выключить) или кнопкой «Разослать выдержки»app/reminders.py, app/pipeline/runner.py

ИИ и интеграции

ФункцияРеализацияКод
ИИ-помощник «Спросить ИИ»Чат по совещаниям на любом экране. Вне встречи — индекс всех совещаний и найденные по вопросу фрагменты транскриптов; внутри встречи — вся встреча. Ответ кратко, со ссылками на протокол и момент записи. Язык ответа как в интерфейсеapp/assistant.py
Интеграции с СЭД и другими системамиЛюбое HTTP-подключение: метод, авторизация (Bearer-токен или свой заголовок), стандартный JSON или свой шаблон с подстановками {{title}}, {{owner}}, {{due}} и др., проверка подключения. Отправка кнопкой из карточки поручения или автоматически после протокола; результат — в истории порученияapp/integrations.py
Локальный MCP-сервер9 инструментов для ИИ-агентов, в том числе список и детали совещаний, поиск по стенограммам, поручения, их статусы и напоминания, загрузка записи, экспорт протокола. Транспорт stdio, только локальный API. Подробно — docs/MCP.mdapp/mcp_server.py, scripts/mcp.sh
Выбор LLMЛокальная Ollama (по умолчанию) или OpenAI-совместимый API (OpenAI либо свой сервер, например vLLM в контуре заказчика)app/llm_settings.py

Удобство

ФункцияРеализацияКод
Запись в браузереМикрофон или звук конференции (например, через BlackHole). Текст появляется во время записи; протокол — после «Завершить». Нельзя случайно начать вторую запись поверх первой; брошенная запись завершается автоматическиweb/index.html, app/pipeline/runner.py
Мастер первого запускаПроверка и скачивание моделей с прогрессом, загрузка моделей в Ollama, выбор LLMapp/setup.py
Настройки по разделамИИ и модели, интеграции, MCP, приватность, системаweb/index.html
Мобильная версия/m: главная, запись с микрофона, поручения, уведомления; устанавливается на телефон как веб-приложение (manifest)web/mobile.html
ПрочееПереобработка записи, удаление совещания вместе с аудио, светлая и тёмная тема, переключатель RU / KZ / EN (навигация и ИИ-помощник)app/main.py, web/index.html

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

  1. Вход. «Новое совещание» → загрузить аудио- или видеофайл (MP3, WAV, M4A, MP4 и другие форматы ffmpeg) или записать совещание в браузере. При записи участники слышат уведомление.

  2. Обработка (в фоне, по одному совещанию, с прогрессом на экране):

    1. подготовка аудио;
    2. разделение говорящих;
    3. распознавание речи;
    4. выделение поручений, ответственных и сроков;
    5. формирование сводки и протокола.
  3. Результат. Страница совещания с вкладками:

    • «Краткая сводка»;
    • «Подробная сводка»;
    • «Транскрипт»: говорящие, теги языка, плеер, переход по таймкоду.

    Справа — поручения с ответственным, сроком, цитатой и уверенностью.

  4. Работа с протоколом. Подтвердить поручения, поправить имена, скачать PDF/DOCX, разослать выдержки, отправить поручения в СЭД.

  5. Контроль. Раздел «Поручения» показывает статусы и сроки, «Уведомления» — напоминания о приближении срока и просрочке.

  6. Вопросы. «Спросить ИИ» — по всем встречам или по открытой.

5. Технологии

  • Язык и сервер: Python 3.12, FastAPI, uvicorn, SQLite, ffmpeg.
  • Распознавание речи: GigaAM-Multilingual large CTC, int8 ONNX, ~592 МБ, лицензия MIT; запускается через onnx-asr.
  • Диаризация и голосовые профили: sherpa-onnx; Silero VAD (ONNX); NeMo TitaNet-small (ONNX, 38 МБ). Кластеризация, поиск смены говорящего, имена по обращениям и сравнение голосов написаны в проекте.
  • LLM:
    • по умолчанию gemma4 (8B, Q4_K_M) в Ollama на localhost:11434;
    • как вариант — OpenAI-совместимый Chat Completions API со структурированным выводом (JSON Schema);
    • на момент замеров использовалась модель gpt-5.2.
  • MCP: официальный Python SDK mcp, транспорт stdio.
  • Экспорт: python-docx; fpdf2 со шрифтом Montserrat (OFL, есть казахские буквы ә ғ қ ң ө ұ ү һ і).
  • Интерфейс: HTML-шаблоны дизайн-макета на dc-runtime (app/static/support.js) и React 18 UMD. React и шрифты IBM Plex лежат в app/static/.
  • Тестовые данные: macOS TTS (голоса Aru kk_KZ и Milena ru_RU) и ffmpeg.

Полный список сторонних компонентов и лицензий — в THIRD_PARTY.md.

6. Архитектура проекта

Браузер: веб (/) и мобильный (/m)            ИИ-агент (Claude Code / Desktop)
  │  REST, загрузка файлов, запись в браузере          │ stdio
  ▼                                                    ▼
FastAPI  app/main.py  ◄──────────── REST ──────── app/mcp_server.py (только localhost)
  │
  ├─ SQLite data/hatshy.db — совещания, реплики, говорящие, поручения, уведомления, профили, интеграции
  ├─ app/pipeline/runner.py — очередь обработки (по одной задаче); live-распознавание; сторож брошенных записей
  │    1. audio.py         ffmpeg → 16 кГц
  │    2. diarize.py       Silero VAD → TitaNet → кластеризация → реплики
  │       voice.py         узнавание говорящих по голосовым профилям
  │    3. asr.py, text.py  GigaAM по каждой реплике, регистр имён, тег языка
  │    4. llm/extract.py   LLM (Ollama или OpenAI-совместимый API) → участники, поручения, саммари (JSON)
  │    5. protocol.py      имена, проверка цитат (llm/verifier.py), сроки (llm/deadline_resolver.py)
  │    6. report.py        подробная сводка
  │    7. integrations.py  автоотправка поручений (если включена)
  ├─ app/assistant.py     ИИ-помощник: индекс совещаний + поиск фрагментов → LLM → ответ со ссылками
  ├─ app/reminders.py     напоминания, эскалация, выдержки → data/outbox/*.eml
  ├─ app/integrations.py  HTTP-вебхуки во внешние системы (СЭД, трекеры, боты), журнал отправок
  ├─ app/export/          PDF (fpdf2) и DOCX (python-docx)
  ├─ app/setup.py         мастер: статус и скачивание моделей, загрузка моделей в Ollama
  └─ app/llm_settings.py  выбор провайдера LLM; ключ хранится только в data/

Ответ LLM не принимается на веру: цитата поручения сверяется с транскриптом, срок пересчитывается правилами, имя ответственного сверяется с говорящими. Контракт API описан в CONTRACT.md.

7. Установка и запуск

Система целиком работает на одном компьютере: веб-интерфейс, API, распознавание, диаризация и LLM. Docker и сборка фронтенда не нужны: интерфейс — статические файлы из web/ и app/static/, библиотеки и шрифты уже лежат в репозитории.

7.1. Что нужно

ТребованиеКомментарий
ОСmacOS или LinuxПроверено на macOS, MacBook Pro M1 Pro 16 ГБ. На Linux команды те же, но запуск там не проверялся. Windows не проверялся
Память16 ГБС локальной gemma4 на 16 ГБ этап LLM идёт 5–10 минут; с OpenAI API — 35–43 с
Диск~11 ГБ свободноМодели распознавания 0,63 ГБ, gemma4 9,6 ГБ, зависимости Python ~0,3 ГБ, плюс записи совещаний
Python3.12uv сам скачает Python 3.12, если его нет в системе
uvменеджер пакетов Python
ffmpegдекодирование аудио и видеоЛюбые форматы: mp3, wav, m4a, webm, mp4
Ollamaлокальная LLMНе нужна, если выбрать OpenAI-совместимый API
Интернеттолько для установкиДальше работа без сети: модели читаются из models/

7.2. Установка инструментов (один раз)

macOS (через Homebrew):

brew install git ffmpeg uv
# Ollama: приложение с https://ollama.com/download (после запуска работает в фоне)
# или из Homebrew в виде службы:
brew install ollama && brew services start ollama

Linux (Ubuntu/Debian):

sudo apt update && sudo apt install -y git ffmpeg curl
curl -LsSf https://astral.sh/uv/install.sh | sh     # uv
curl -fsSL https://ollama.com/install.sh | sh       # Ollama (ставится как служба)

Проверка: ffmpeg -version, uv --version, ollama --version — каждая команда печатает версию.

7.3. Установка проекта

# 1. Код
git clone https://github.com/BAITC-Hacks/hack-c9414062-smaguloveka.git
cd hack-c9414062-smaguloveka

# 2. Окружение Python и зависимости
uv venv --python 3.12 .venv
uv pip install --python .venv/bin/python -r pyproject.toml

# 3. Модели распознавания и диаризации в models/ (~0,63 ГБ, один раз).
#    Шаг можно пропустить: те же модели скачает «Мастер настройки» в браузере.
./scripts/download_models.sh

# 4. Локальная LLM (~9,6 ГБ, один раз). Тоже можно скачать из мастера.
ollama pull gemma4

Что скачивается в шаге 3:

  • GigaAM-Multilingual large CTC, int8 ONNX, 592 МБ — распознавание RU, KZ и смешанной речи;
  • Silero VAD, 2 МБ — поиск речи в записи;
  • NeMo TitaNet-small, 38 МБ — «отпечатки» голосов для диаризации и голосовых профилей.

7.4. Запуск

.venv/bin/python -m uvicorn app.main:app --port 8000

Сервер готов, когда в терминале появится Uvicorn running on http://127.0.0.1:8000. Откройте:

Остановить сервер — Ctrl+C в том же терминале. Проверить, что сервер отвечает и модели на месте:

curl -s http://localhost:8000/api/setup

В ответе "models_ready":true — модели найдены, "llm_ready":true — LLM доступна.

7.5. Первый запуск: «Мастер настройки»

При первом открытии в браузере мастер проведёт по четырём шагам:

  1. Приветствие — что делает система и что будет установлено.
  2. Модели распознавания и диаризации. Если шаг 3 из 7.3 пропущен, нажмите «Скачать всё» — прогресс виден в окне, файлы лягут в models/.
  3. ИИ для поручений и саммари. Выберите одно и нажмите «Проверить подключение»:
    • Локально — модель Ollama, по умолчанию gemma4. Если её нет, мастер скачает её сам (Ollama должна быть запущена). Данные не покидают компьютер.
    • OpenAI-совместимый API — вставьте свой ключ. Ключ хранится только в локальной базе data/hatshy.db (папка data/ в .gitignore) и в браузер не возвращается. Подойдёт и свой сервер в контуре организации, например vLLM: укажите его адрес. Аудио при этом всё равно распознаётся локально, во внешний API уходит только текст.
  4. Готово — откроется дашборд. Модель можно сменить позже: «Настройки» → «ИИ и модели». Мастер можно открыть снова оттуда же.

Дальше — сценарий проверки из раздела 8.

7.6. Где лежат данные

ПутьЧто там
models/модели распознавания (скачиваются один раз)
data/hatshy.dbбаза SQLite: совещания, транскрипты, поручения, настройки, ключ API
data/uploads/загруженные и записанные аудиофайлы
data/outbox/письма-напоминания и выдержки из протокола в формате .eml

Начать с чистого листа: остановите сервер и удалите папку data/ — при следующем запуске снова откроется мастер. Модели в models/ останутся.

7.7. Дополнительно

Доступ с телефона или другого компьютера в сети. Запустите сервер с --host 0.0.0.0 и откройте http://<IP-компьютера>:8000. Запись с микрофона браузеры разрешают только на localhost или по HTTPS, поэтому для записи с другого устройства нужен HTTPS (например, через обратный прокси). Загрузка файлов работает и по HTTP.

Обновление до новой версии:

git pull
uv pip install --python .venv/bin/python -r pyproject.toml

Затем перезапустите сервер. Данные в data/ сохраняются.

Подключить MCP к Claude Code (веб-сервер должен быть запущен), подробнее — docs/MCP.md:

claude mcp add ai-hatshy -- "$PWD/scripts/mcp.sh"

Переменные окружения — все необязательны, см. .env.example:

  • OLLAMA_URL (по умолчанию http://localhost:11434), LLM_MODEL (gemma4:latest) — локальная LLM;
  • HATSHY_DATA (./data) — каталог данных;
  • ASR_THREADS (4) — потоки процессора для распознавания;
  • OPENAI_API_KEY, OPENAI_BASE_URL, OPENAI_MODEL — если выбран OpenAI-совместимый API. Ключ также можно ввести в интерфейсе.

7.8. Если что-то не работает

СимптомПричина и решение
В интерфейсе «Сервер недоступен: Failed to fetch»Сервер остановлен или перезапускается. Запустите его снова (7.4) и обновите страницу
address already in use при запускеПорт 8000 занят. Освободите его: lsof -ti:8000 | xargs kill — или запустите на другом: --port 8001
Совещание сразу уходит в ошибку после загрузки файлаСкорее всего, не установлен ffmpeg. Проверьте: ffmpeg -version
Мастер пишет, что LLM недоступнаOllama не запущена: откройте приложение Ollama или выполните ollama serve. Список моделей — ollama list
Модели не скачиваютсяНет доступа к GitHub или Hugging Face. Повторите ./scripts/download_models.sh или «Скачать» в мастере, когда сеть появится
Этап «Выделение поручений…» идёт долгоЛокальная LLM на 16 ГБ работает 5–10 минут. Ускорить: закрыть тяжёлые приложения или выбрать OpenAI-совместимый API
Запись с микрофона не стартуетБраузер не выдал доступ к микрофону. Разрешите его в настройках сайта; открывайте по localhost или HTTPS

Журнал сервера печатается в терминал, где он запущен.

8. Как проверить решение

  1. Мастер настройки откроется при первом запуске: модели → «✓ Установлено», выберите LLM.
  2. Обработка. «Новое совещание» → «Загрузить файл» → samples/shala_meeting.mp3 (шала-казахский, 95 с, 4 участника, эталон — samples/shala_meeting.gold.json). Подойдут и записи организаторов из spec/.
  3. Протокол. Вкладки «Краткая сводка», «Подробная сводка», «Транскрипт» (имена, теги RU / KZ / RU+KZ, переход по таймкоду). Справа — поручения с датами сроков, их можно подтвердить.
  4. Экспорт. «Экспорт PDF / DOCX», включите «Анонимизировать ФИО».
  5. Напоминания. «Уведомления» → «Демо: текущая дата», например 2026-10-01. Появятся «Срок через N дн.» и «Просрочено», письма — в data/outbox/.
  6. ИИ-помощник. «Спросить ИИ»: «Где обсуждали охрану труда и что решили?» — ответ со ссылками. Внутри протокола: «Кто что должен сделать?». Переключите язык на KZ или EN — помощник ответит на нём.
  7. Голосовой профиль. «Участники» → «Из совещания»: выделите на шкале реплику участника, прослушайте, сохраните.
  8. Интеграции. «Настройки» → «Интеграции» → «+ Добавить»: адрес любого HTTP-приёмника → «Проверить подключение». Затем откройте поручение → «Отправить в «…»»: в истории появится код ответа.
  9. MCP. Подключите командой из раздела 7 и спросите Claude: «Какие поручения просрочены?».
  10. Автопроверки:
    .venv/bin/python -m unittest -v              # сроки RU/KZ, тег языка, регистр имён, VAD
    .venv/bin/python scripts/test_export.py      # экспорт PDF/DOCX, анонимизация
    .venv/bin/python scripts/asr_check.py        # CER/WER распознавания на samples/
    .venv/bin/python scripts/try_diar.py samples/*.mp3 spec/*.mp3   # число голосов
    .venv/bin/python scripts/eval.py --api http://localhost:8000 --id <id совещания> --gold samples/shala_meeting.gold.json
    

Результаты, полученные в день хакатона (подробно — samples/asr_report.md, eval/results.md):

  • Распознавание (синтетические записи, нарезка по эталонным границам реплик):

    ЯзыкCERWER
    KZ0,6%3,9%
    RU+KZ0,7%6,1%
    RU1,7%5,0%

    Казахских букв распознано 226 из 231.

  • Диаризация: число голосов верно на всех 4 записях с известным составом — 5, 5, 4 и 3.

  • Поручения:

    ЗаписьLLMНайдено из эталонаОтветственныйСрок
    Совещание №1 (организаторы)gpt-5.211/11 (precision 79%)10/1111/11
    Совещание №2 (организаторы)gpt-5.28/10 (precision 89%)8/87/8
    Шала-казахскаяgemma44/44/44/4
    Казахскаяgemma45/55/55/5

    Эталон для записей организаторов размечен по текстам протоколов, а само аудио местами от них отличается.

  • Время на 1,5–4,5-минутную запись:

    • аудио, диаризация и распознавание — 12–19 с;
    • LLM через OpenAI API — 35–43 с;
    • локальная gemma4 на ноутбуке 16 ГБ — 5–10 минут.

    Ответ ИИ-помощника через OpenAI API — 3–10 с.

9. Данные и интеграции

  • Данные кейса. Записи и протоколы организаторов лежат в spec/. На их основе вручную размечен эталон eval/gold.json: 21 поручение, дословные цитаты.
  • Синтетические казахская и шала-казахская записи сгенерированы scripts/make_samples.sh (кейс это допускает) и лежат в samples/ со сценариями и эталонами.
  • Сеть при установке:
    • PyPI;
    • Hugging Face — GigaAM и Silero VAD;
    • GitHub Releases sherpa-onnx — TitaNet;
    • реестр Ollama — модель LLM.
  • Сеть во время работы по умолчанию не нужна. Наружу данные уходят только в двух случаях:
    1. в «Настройках» выбран OpenAI API — туда уходит текст транскрипта для LLM;
    2. настроена интеграция на внешний адрес — туда уходят данные поручений.
  • Интеграция с СЭД и другими системами. Работает через исходящие HTTP-запросы: подойдёт любая система, которая принимает JSON по HTTP (REST API или входящий вебхук) — СЭД, таск-трекер, Bitrix24, Telegram-бот и т. п.
    • Формат запроса задаётся шаблоном с подстановками полей поручения.
    • Авторизация: Bearer-токен или свой заголовок.
    • Для систем с другим протоколом (SOAP/XML, OAuth-потоки) нужен небольшой адаптер.
  • Встроенные каналы: письма (выдержки и напоминания) в локальный data/outbox/; звук Zoom / Teams / Meet — через системное аудиоустройство.
  • MCP. MCP-сервер обращается только к локальному API. Текст, который он возвращает, получает модель ИИ-клиента.
  • Секреты. В репозитории их нет. Ключ OpenAI и токены интеграций вводятся в интерфейсе и хранятся только в локальной базе data/hatshy.db; каталог data/ и .env в .gitignore.

10. Ограничения

  • Конференции. Нет бота-участника Zoom / Teams / Meet, звук захватывается через системное устройство. Облачные боты противоречат требованию закрытого контура.
  • Live-режим. Во время записи показывается только текст, без разделения по говорящим. Говорящие и поручения появляются после «Завершить».
  • Качество измерено на синтетике. Казахский и шала-казахский проверены на TTS-записях. На живых записях точность распознавания, диаризации и порог узнавания по голосу (0,65) не измерялись, разметки нет.
  • Диаризация. Перекрывающаяся речь не обрабатывается. Короткие реплики, вклеенные в чужую речь без паузы, могут достаться соседнему говорящему.
  • ASR без пунктуации. Регистр имён восстанавливается эвристически.
  • Длинные встречи. Транскрипт отправляется в LLM целиком, до 32k токенов контекста. Разбиение 1–2-часовых встреч на части не реализовано.
  • Скорость локальной LLM. На ноутбуке 16 ГБ локальная LLM работает минутами. Ускорить можно меньшей моделью, GPU-сервером (не проверено) или OpenAI-совместимым API.
  • Интеграции. Готовых коннекторов под конкретные СЭД нет, есть универсальные HTTP-вебхуки. SMTP-отправки нет, письма пишутся в outbox.
  • Однопользовательский режим. Авторизации и ролей на сервере нет, переключатель ролей работает только в интерфейсе. SQLite рассчитан на один сервер.
  • Перевод интерфейса. KZ / EN переводят навигацию и ИИ-помощника, остальные тексты интерфейса на русском.
  • Анонимизация в экспорте теряет падеж имени.
  • Мобильная версия проверялась меньше веб-версии. Запись с микрофона на телефоне требует HTTPS или localhost.

11. Deployed-версия

Публичной развёрнутой версии нет. Решение запускается локально по инструкции из раздела 7, так и задумано для закрытого контура.

12. Масштабирование и развитие

Этот раздел описывает, как решение можно развивать. Всё, что не реализовано, помечено «план».

Почему архитектура масштабируется

  • Этапы разделены: API, очередь обработки, распознавание, LLM, интеграции. Каждый этап — отдельный модуль (app/pipeline/*) с понятным входом и выходом, поэтому их можно разнести по разным серверам.
  • LLM подключается по OpenAI-совместимому API. Её можно вынести на GPU-сервер заказчика (например, vLLM) без изменения кода, достаточно указать адрес в настройках.
  • Модели распознавания и диаризации в формате ONNX. Они работают на CPU; на GPU-серверах можно использовать onnxruntime с CUDA — план, не проверено.
  • Всё управляется через REST API и MCP: веб, мобильная версия и ИИ-агенты работают с одним и тем же API. Новые клиенты подключаются без изменений сервера.

Шаги к масштабу организации (план)

  1. PostgreSQL вместо SQLite, несколько воркеров обработки вместо одного.
  2. Авторизация (SSO / LDAP), роли секретаря, руководителя и исполнителя на сервере.
  3. Docker-образ и Helm-чарт для закрытого контура.
  4. Разбиение длинных встреч на части для LLM.

Новые клиенты и каналы

  • Мобильная версия. Уже есть веб-приложение /m: главная, запись, поручения, уведомления, установка на телефон. План: нативное приложение с push-уведомлениями о сроках.
  • Смарт-часы (план). Напоминания о сроках и кнопка «Выполнено» на Apple Watch / Wear OS через мобильное приложение. Сервер уже отдаёт поручения и принимает смену статуса через API.
  • Любые СЭД и мессенджеры. Уже есть универсальные вебхуки с шаблонами. План: готовые коннекторы для популярных СЭД и Telegram-бот с кнопками «Выполнено / Перенести срок».
  • ИИ-агенты. Уже есть MCP-сервер. План: действия агента по расписанию, например утренний дайджест просроченных поручений (промпт overdue_digest в MCP-сервере уже есть).
  • Конференции (план). Бот-участник для Zoom / Teams / Meet в контуре заказчика; потоковая диаризация во время записи.

Структура репозитория
app/main.py              FastAPI: API и раздача интерфейса
app/pipeline/            аудио, диаризация, ASR, текст, LLM-извлечение и проверка, подробная сводка, очередь
app/export/              PDF и DOCX
app/reminders.py         напоминания, эскалация, выдержки
app/voice.py             голосовые профили (узнавание по тембру)
app/assistant.py         ИИ-помощник по совещаниям
app/integrations.py      интеграции (HTTP-вебхуки)
app/mcp_server.py        локальный MCP-сервер; scripts/mcp.sh — запуск; docs/MCP.md — описание
app/setup.py             мастер настройки
app/llm_settings.py      выбор LLM
app/static/              dc-runtime, React UMD, шрифты, consent.mp3, манифест мобильной версии
web/index.html           веб-интерфейс; web/mobile.html — мобильный; web/design_*.dc.html — исходный макет
scripts/                 загрузка моделей, генерация тестовых записей, оценка и проверки
samples/                 синтетические KZ и RU+KZ совещания с эталонами и отчётом ASR
spec/                    материалы кейса: ТЗ, протоколы и записи организаторов
eval/                    эталон поручений (gold.json) и результаты оценки (results.md)
tests/                   юнит-тесты
Звёзды
⭐ 0
Форки
0
Язык
HTML
Последний push
в прошлом месяце
Коммиты
11
Авторы
1
Файлы
99
Ветки
2

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

smaguloveka 11

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

  • 2026-09-23 17:54README: подробная инструкция локального запуска; словарь перевода интерфейса KZ/ENsmaguloveka
  • 2026-09-23 17:53Словарь перевода KZ/EN (i18n.json) для слоя переводаsmaguloveka
  • 2026-09-23 17:48Сценарий 2 по ТЗ: напоминания куратору, автоматические выдержки; слой перевода KZ/ENsmaguloveka
  • 2026-09-23 17:36README для жюри, настройки по разделам, помощник на RU/KZ/EN, фавиконsmaguloveka
  • 2026-09-23 17:26Голосовые профили, ИИ-помощник, интеграции-вебхуки, локальный MCP-серверsmaguloveka
  • 2026-09-23 17:00README по структуре организаторов, результаты оценки, исправления live-записиsmaguloveka
  • 2026-09-23 16:53Live-запись: статус «Идёт запись» в списке, автозавершение брошенной записиsmaguloveka
  • 2026-09-23 16:50Веб: «Настройки» внизу сайдбара над профилем, язык и тема — в правом верхнем углуsmaguloveka
Все коммиты (11)
  • 2026-09-23 16:47AI Hatshy: локальный ИИ-секретарь совещаний с фиксацией порученийsmaguloveka
  • 2026-09-23 15:46chore: save AI Hatshy implementation in progress #22smaguloveka
  • 2026-09-23 14:38Делаю ресёрчsmaguloveka
Структура репозитория (99 файлов)
.env.example
.gitignore
CONTRACT.md
README.md
THIRD_PARTY.md
app/__init__.py
app/assistant.py
app/config.py
app/db.py
app/export/__init__.py
app/export/common.py
app/export/docx_export.py
app/export/pdf_export.py
app/integrations.py
app/llm_settings.py
app/main.py
app/mcp_server.py
app/pipeline/__init__.py
app/pipeline/asr.py
app/pipeline/audio.py
app/pipeline/diarize.py
app/pipeline/llm/__init__.py
app/pipeline/llm/deadline_resolver.py
app/pipeline/llm/extract.py
app/pipeline/llm/speaker_names.py
app/pipeline/llm/verifier.py
app/pipeline/protocol.py
app/pipeline/report.py
app/pipeline/runner.py
app/pipeline/text.py
app/reminders.py
app/setup.py
app/static/apple-touch-icon.png
app/static/consent.mp3
app/static/favicon-32.png
app/static/favicon.svg
app/static/fonts.css
app/static/fonts/ibm-plex-mono-cyrillic-400-normal.woff2
app/static/fonts/ibm-plex-mono-latin-400-normal.woff2
app/static/fonts/ibm-plex-mono-latin-500-normal.woff2
app/static/fonts/ibm-plex-sans-cyrillic-400-normal.woff2
app/static/fonts/ibm-plex-sans-cyrillic-500-normal.woff2
app/static/fonts/ibm-plex-sans-cyrillic-600-normal.woff2
app/static/fonts/ibm-plex-sans-cyrillic-ext-400-normal.woff2
app/static/fonts/ibm-plex-sans-cyrillic-ext-500-normal.woff2
app/static/fonts/ibm-plex-sans-cyrillic-ext-600-normal.woff2
app/static/fonts/ibm-plex-sans-latin-400-normal.woff2
app/static/fonts/ibm-plex-sans-latin-500-normal.woff2
app/static/fonts/ibm-plex-sans-latin-600-normal.woff2
app/static/fonts/pdf/Montserrat-Bold.ttf
app/static/fonts/pdf/Montserrat-Italic.ttf
app/static/fonts/pdf/Montserrat-Regular.ttf
app/static/fonts/pdf/OFL.txt
app/static/i18n.js
app/static/i18n.json
app/static/mobile/icon-512.png
app/static/mobile/icon.svg
app/static/mobile/manifest.json
app/static/mock/meeting_1.json
app/static/mock/state.json
app/static/mock/state_m.json
app/static/support.js
app/voice.py
docs/MCP.md
eval/gold.json
eval/results.md
pyproject.toml
samples/asr_report.md
samples/asr_results.json
samples/kk_meeting.gold.json
samples/kk_meeting.mp3
samples/kk_meeting.script.md
samples/kk_meeting.turns.json
samples/kk_meeting.wav
samples/shala_meeting.gold.json
samples/shala_meeting.mp3
samples/shala_meeting.script.md
samples/shala_meeting.turns.json
samples/shala_meeting.wav
scripts/asr_check.py
scripts/download_models.sh
scripts/eval.py
scripts/export_fixture.json
scripts/make_samples.sh
scripts/mcp.sh
scripts/test_export.py
scripts/try_diar.py
scripts/try_pipeline.py
spec/HackAlem AI_ Система автопротоколирования совещаний с фиксацией поручений.md
spec/Протокол_совещания№1.docx.md
spec/Протокол_совещания№2.docx.md
spec/Совещание №1.mp3
spec/Совещание №2.mp3
tests/__init__.py
tests/test_core.py
web/design_mobile.dc.html
web/design_web.dc.html
web/index.html
web/mobile.html
Ветки (2)

Обсуждение 0 комментариев

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

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