О проекте
Команда: 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.md1. 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,65 | app/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.md | app/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, выбор LLM | app/setup.py |
| Настройки по разделам | ИИ и модели, интеграции, MCP, приватность, система | web/index.html |
| Мобильная версия | /m: главная, запись с микрофона, поручения, уведомления; устанавливается на телефон как веб-приложение (manifest) | web/mobile.html |
| Прочее | Переобработка записи, удаление совещания вместе с аудио, светлая и тёмная тема, переключатель RU / KZ / EN (навигация и ИИ-помощник) | app/main.py, web/index.html |
4. Как работает решение
-
Вход. «Новое совещание» → загрузить аудио- или видеофайл (MP3, WAV, M4A, MP4 и другие форматы ffmpeg) или записать совещание в браузере. При записи участники слышат уведомление.
-
Обработка (в фоне, по одному совещанию, с прогрессом на экране):
- подготовка аудио;
- разделение говорящих;
- распознавание речи;
- выделение поручений, ответственных и сроков;
- формирование сводки и протокола.
-
Результат. Страница совещания с вкладками:
- «Краткая сводка»;
- «Подробная сводка»;
- «Транскрипт»: говорящие, теги языка, плеер, переход по таймкоду.
Справа — поручения с ответственным, сроком, цитатой и уверенностью.
-
Работа с протоколом. Подтвердить поручения, поправить имена, скачать PDF/DOCX, разослать выдержки, отправить поручения в СЭД.
-
Контроль. Раздел «Поручения» показывает статусы и сроки, «Уведомления» — напоминания о приближении срока и просрочке.
-
Вопросы. «Спросить ИИ» — по всем встречам или по открытой.
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.
- по умолчанию gemma4 (8B, Q4_K_M) в Ollama на
- 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 ГБ, плюс записи совещаний |
| Python | 3.12 | uv сам скачает 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. Откройте:
- http://localhost:8000 — веб-версия;
- http://localhost:8000/m — мобильная версия.
Остановить сервер — Ctrl+C в том же терминале. Проверить, что сервер отвечает и модели на месте:
curl -s http://localhost:8000/api/setup
В ответе "models_ready":true — модели найдены, "llm_ready":true — LLM доступна.
7.5. Первый запуск: «Мастер настройки»
При первом открытии в браузере мастер проведёт по четырём шагам:
- Приветствие — что делает система и что будет установлено.
- Модели распознавания и диаризации. Если шаг 3 из 7.3 пропущен, нажмите «Скачать всё» — прогресс виден в окне, файлы лягут в
models/. - ИИ для поручений и саммари. Выберите одно и нажмите «Проверить подключение»:
- Локально — модель Ollama, по умолчанию
gemma4. Если её нет, мастер скачает её сам (Ollama должна быть запущена). Данные не покидают компьютер. - OpenAI-совместимый API — вставьте свой ключ. Ключ хранится только в локальной базе
data/hatshy.db(папкаdata/в.gitignore) и в браузер не возвращается. Подойдёт и свой сервер в контуре организации, например vLLM: укажите его адрес. Аудио при этом всё равно распознаётся локально, во внешний API уходит только текст.
- Локально — модель Ollama, по умолчанию
- Готово — откроется дашборд. Модель можно сменить позже: «Настройки» → «ИИ и модели». Мастер можно открыть снова оттуда же.
Дальше — сценарий проверки из раздела 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. Как проверить решение
- Мастер настройки откроется при первом запуске: модели → «✓ Установлено», выберите LLM.
- Обработка. «Новое совещание» → «Загрузить файл» →
samples/shala_meeting.mp3(шала-казахский, 95 с, 4 участника, эталон —samples/shala_meeting.gold.json). Подойдут и записи организаторов изspec/. - Протокол. Вкладки «Краткая сводка», «Подробная сводка», «Транскрипт» (имена, теги
RU/KZ/RU+KZ, переход по таймкоду). Справа — поручения с датами сроков, их можно подтвердить. - Экспорт. «Экспорт PDF / DOCX», включите «Анонимизировать ФИО».
- Напоминания. «Уведомления» → «Демо: текущая дата», например
2026-10-01. Появятся «Срок через N дн.» и «Просрочено», письма — вdata/outbox/. - ИИ-помощник. «Спросить ИИ»: «Где обсуждали охрану труда и что решили?» — ответ со ссылками. Внутри протокола: «Кто что должен сделать?». Переключите язык на KZ или EN — помощник ответит на нём.
- Голосовой профиль. «Участники» → «Из совещания»: выделите на шкале реплику участника, прослушайте, сохраните.
- Интеграции. «Настройки» → «Интеграции» → «+ Добавить»: адрес любого HTTP-приёмника → «Проверить подключение». Затем откройте поручение → «Отправить в «…»»: в истории появится код ответа.
- MCP. Подключите командой из раздела 7 и спросите Claude: «Какие поручения просрочены?».
- Автопроверки:
.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):
-
Распознавание (синтетические записи, нарезка по эталонным границам реплик):
Язык CER WER KZ 0,6% 3,9% RU+KZ 0,7% 6,1% RU 1,7% 5,0% Казахских букв распознано 226 из 231.
-
Диаризация: число голосов верно на всех 4 записях с известным составом — 5, 5, 4 и 3.
-
Поручения:
Запись LLM Найдено из эталона Ответственный Срок Совещание №1 (организаторы) gpt-5.2 11/11 (precision 79%) 10/11 11/11 Совещание №2 (организаторы) gpt-5.2 8/10 (precision 89%) 8/8 7/8 Шала-казахская gemma4 4/4 4/4 4/4 Казахская gemma4 5/5 5/5 5/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.
- Сеть во время работы по умолчанию не нужна. Наружу данные уходят только в двух случаях:
- в «Настройках» выбран OpenAI API — туда уходит текст транскрипта для LLM;
- настроена интеграция на внешний адрес — туда уходят данные поручений.
- Интеграция с СЭД и другими системами. Работает через исходящие 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. Новые клиенты подключаются без изменений сервера.
Шаги к масштабу организации (план)
- PostgreSQL вместо SQLite, несколько воркеров обработки вместо одного.
- Авторизация (SSO / LDAP), роли секретаря, руководителя и исполнителя на сервере.
- Docker-образ и Helm-чарт для закрытого контура.
- Разбиение длинных встреч на части для 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/ юнит-тесты
Авторы коммитов
История коммитов
- 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 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.