О проекте
Команда: Armabulati
Кейс HackAlem.ai: Инновации — Самрук-Казына
Стадия: Доведённый продукт
Задача кейса: «Хаттама»: протокол и поручения по аудиозаписи совещания (каз./рус./смешанная речь)
Суть
Локальный ИИ-ассистент для протоколов совещаний. Распознаёт русскую, казахскую и смешанную речь, разделяет говорящих, извлекает поручения, решения и сроки. Контролирует исполнение (статусы, напоминания, ICS), экспортирует в PDF, DOCX и JSON; есть аккаунты пользователей.
Как устроено
PyAV приводит запись к моно 16 кГц, faster-whisper large-v3-turbo в int8 на CPU распознаёт речь; для казахского и смешанного режима есть отдельная казахская Whisper-модель. Диаризация: эмбеддинги WeSpeaker ResNet34-LM в ONNX и AgglomerativeClustering. Qwen3-4B Q4_K_M через llama.cpp по JSON-схеме извлекает поручения, длинные транскрипты режутся на части с перекрытием. Каждое поручение проверяется на ссылки на реплики, даты разбираются относительно даты встречи. FastAPI, очередь и SQLite; «радар внимания» подсвечивает проблемные поручения.
Ключевые решения
- faster-whisper large-v3-turbo
- Kazakh Whisper fine-tune INT8
- WeSpeaker ResNet34-LM
- AgglomerativeClustering diarization
- JSON schema extraction
- deadline normalization
- ICS export
Особенности
Отдельная казахская ASR-модель для смешанной речи. Полностью офлайн на CPU, установка одной командой на Windows. CI собирает релизы. Сверх протокола есть контроль исполнения: статусы, просрочки, повестка следующей встречи, экспорт в календарь.
Стек
Python · FastAPI · Uvicorn · SQLite · ONNX Runtime · llama.cpp · ReportLab · python-docx · Vanilla JavaScript · GitHub Actions
Модели
Whisper large-v3-turbo · Kazakh Whisper large-v3-turbo · WeSpeaker ResNet34-LM · Qwen3-4B (llama.cpp)
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-2bfd8c42-armabulati.
README
README.mdDauys Hunt — от голоса к действиям
Локальный ИИ-ассистент для протоколирования совещаний и контроля поручений.
Проект команды Armabulati для HackAlem AI. Помогает секретарю превратить запись встречи в транскрипт, краткое содержание и список действий с ответственными и сроками. Руководителю доступны статусы исполнения и напоминания.
Проверки и выпуск · Скачать релиз · Изменения 0.3.1
Аудио и текст обрабатываются на вашем компьютере. Облачные API для распознавания и анализа не используются. Интернет нужен для первоначальной установки и, если настроен, входа через Google/Facebook. Вход по email работает локально.
Вход и личное пространство
При открытии приложения доступны вход и регистрация по email. При регистрации пароль нужно ввести дважды. Первая регистрация автоматически переносит прежние совещания в созданный аккаунт. Другие пользователи получают отдельное пространство.
Google и Facebook подключаются через .env; до настройки ключей кнопки неактивны. Инструкция по аккаунтам, OAuth и безопасности.
Возможности
- Личные аккаунты, регистрация по email, вход/выход, смена пароля и изоляция данных; подготовлены интеграции Google/Facebook.
- Современная тема Dauys Hunt: индиго, бирюзовые и коралловые акценты, адаптивный экран входа.
- Цвет поручения зависит от срока: спокойный голубой → янтарный → мягкий красный за день до срока; выполненные задачи зелёные.
- Загрузка MP3, WAV, M4A, OGG, WEBM, MP4, FLAC, AAC и MKV; до 250 МБ и 2 часов.
- Запись микрофона в браузере после подтверждения уведомления участников.
- Локальное распознавание русского, казахского и смешанного языка; выбор языка в форме.
- Акустическая диаризация: голосовые эмбеддинги WeSpeaker и кластеризация, автоматическое или заданное число говорящих.
- Транскрипт с временными метками, прослушиванием записи, исправлением текста и говорящего.
- Поручения, ответственные, формулировки сроков, решения и саммари от локальной языковой модели.
- Ссылка каждого поручения на реплики-основания. Неоднозначные даты помечаются для проверки.
- Подтверждение имён голосовых групп, редактирование и проверка поручений.
- Статусы «К исполнению», «В работе», «Выполнено»; просрочка вычисляется по дате.
- Общий список поручений, поиск, фильтры, напоминания о ближайших и просроченных сроках.
- PDF, DOCX и JSON; опциональная замена известных имён при экспорте.
- Отдельный импорт текстового транскрипта, явно помеченный как текстовый сценарий.
- Локальная SQLite, очередь обработки, повтор после ошибки.
- Быстрый и точный режимы распознавания; кэш повторной загрузки идентичных записей.
- Транскрипт доступен ещё во время обработки; видны таймер, активность генерации и времена этапов.
- «Радар внимания»: отсутствующий ответственный, неопределённый/неподтверждённый срок, просрочка и непроверенные задачи.
- Поиск по исходным репликам с соседним контекстом и распределение длительности речи между голосовыми группами.
- Повестка следующей встречи из открытых поручений; экспорт проверенных задач в календарь (ICS).
- Ручное добавление пропущенных поручений с обязательной ссылкой на реплики-основания.
- Единые SVG-иконки; подсказки через 1,5 секунды при наведении или фокусе с клавиатуры.
Быстрый запуск: Windows
Проверенная среда: Windows x64, Python 3.12, CPU, 16 ГБ RAM. Рекомендуется закрыть тяжёлые приложения и иметь хотя бы 6 ГБ свободной RAM и 10 ГБ свободного места. GPU не обязателен. Обработка на CPU занимает минуты и зависит от длины записи.
git clone https://github.com/BAITC-Hacks/hack-2bfd8c42-armabulati.git
cd hack-2bfd8c42-armabulati
python --version
powershell -NoProfile -ExecutionPolicy Bypass -File setup.ps1
powershell -NoProfile -ExecutionPolicy Bypass -File run.ps1
Если python не найден, передайте путь к Python 3.12:
powershell -NoProfile -ExecutionPolicy Bypass -File setup.ps1 -Python "C:\path\to\python.exe"
Откройте http://127.0.0.1:8765. Для последующих запусков достаточно start.cmd или run.ps1. Остановка — Ctrl+C в терминале. Не запускайте несколько серверов с одной базой данных.
Установка вручную:
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.lock.txt
.\.venv\Scripts\python.exe scripts\setup_models.py
.\.venv\Scripts\python.exe -m uvicorn app.main:app --host 127.0.0.1 --port 8765
Скрипт скачивает Whisper large-v3-turbo для русского, специализированную казахскую Whisper large-v3-turbo, WeSpeaker ResNet34-LM, Qwen3-4B Q4_K_M и официальную CPU-сборку llama.cpp b11120. Казахские веса (~1,62 ГБ) один раз преобразуются в CPU INT8 (~0,81 ГБ); PyTorch и конвертер устанавливаются отдельно в runtime/asr-convert, при работе приложения не нужны. Ревизии зафиксированы в models.lock.json, версии Python-пакетов — в requirements.lock.txt. Локальный манифест сохраняется в models/manifest.json.
Обновление до 0.3.1: сохраните data/ и .env, остановите сервер, обновите исходники и выполните python scripts/setup_models.py. Для казахского и смешанного режима необходима новая модель. В старой записи нажмите «Распознать заново» и выберите «Қазақша» или «Қазақша + русский». Исходный протокол сохранится. Причина исправления и ограничения качества описаны в проверке речи.
Для закрытого контура выполните установку на разрешённой машине, затем перенесите исходники, models/, runtime/ и подготовленные для целевой ОС зависимости. Во время работы интернет не требуется. Виртуальные окружения не следует переносить между разными ОС и путями установки.
Linux
Автоматическое скачивание llama.cpp реализовано для Windows x64. На Linux необходимо самостоятельно установить/собрать совместимый llama-server, указать ALEM_LLAMA=/absolute/path/to/llama-server и установить DejaVu Sans (fonts-dejavu-core). Создайте venv, установите зависимости, выполните python scripts/setup_models.py, затем запустите Uvicorn. Linux-сценарий не проверен.
Сценарий для жюри
- Запустите приложение, зарегистрируйтесь или войдите; в «Состоянии системы» убедитесь, что установлены все четыре модели.
- Нажмите «Новое совещание», укажите тему и фактическую дату встречи. От неё считаются относительные сроки.
- Загрузите запись, выберите язык и, если известно, количество говорящих. Подтвердите уведомление участников.
- Дождитесь статуса «Готов к проверке». Модели действительно обрабатывают файл; готовые результаты по имени файла не подставляются.
- Откройте транскрипт, прослушайте реплики и подтвердите имена голосовых групп.
- В поручениях раскройте основание, уточните ответственного и дату, отметьте проверку и сохраните.
- Измените статус одного поручения на «Выполнено». Проверьте общий список и напоминания.
- Экспортируйте PDF и DOCX. Перезапустите приложение — результаты сохраняются.
Для быстрой проверки текстового сценария импортируйте examples/meeting-mixed.txt. Это синтетический пример RU/KZ, не тест распознавания речи. В нём два поручения и отклонённое предложение заказать сервер: последнее не должно становиться задачей.
Архитектура и технологии
Браузер: HTML / CSS / JavaScript
│ localhost, HTTP
▼
FastAPI ───────── SQLite + локальные аудиофайлы
│ последовательная очередь
▼
Отдельный Python-процесс
PyAV → mono 16 kHz → faster-whisper (int8, CPU)
→ слова и временные метки
WeSpeaker ONNX → эмбеддинги → кластеризация голосов
│ процесс завершён, память освобождена
▼
llama.cpp (localhost, временный API-ключ)
Qwen3-4B → JSON по схеме → проверка ссылок на реплики
│
Разбор дат → поручения / решения / саммари
▼
Проверка секретарём → PDF / DOCX / JSON / контроль сроков
Языковая модель запускается на этапе анализа и завершается после него. Одновременно обрабатывается одно совещание. Длинные транскрипты разбиваются на части с перекрытием контекста.
| Компонент | Реализация |
|---|---|
| API и очередь | FastAPI, Uvicorn, ThreadPoolExecutor |
| Хранение | SQLite с WAL, каталог data/ |
| Декодирование | PyAV; отдельная установка FFmpeg не требуется |
| Speech-to-text | faster-whisper, Whisper large-v3-turbo |
| Диаризация | WeSpeaker, ONNX Runtime, Kaldi fbank, AgglomerativeClustering |
| Анализ текста | Qwen3-4B, llama.cpp, JSON schema |
| Экспорт | ReportLab, python-docx |
| Интерфейс | Vanilla JavaScript, адаптивный CSS; без CDN и внешних шрифтов |
Структура проекта
app/
main.py API, загрузка, редактирование
speech.py распознавание и диаризация
analysis.py локальная LLM, JSON-схема, проверка оснований
pipeline.py очередь и обработка ошибок
dates.py нормализация сроков и просрочка
store.py SQLite и журнал изменений
export.py PDF, DOCX, замена известных имён
web/ интерфейс
scripts/ установка моделей
examples/ синтетический текст для демонстрации
tests/ проверки логики, API и экспорта
models.lock.json
requirements.lock.txt
setup.ps1 / run.ps1 / start.cmd
Каталоги models/, runtime/, .venv/, data/ и пользовательские записи не публикуются в GitHub.
Проверки и фактический результат
.\.venv\Scripts\python.exe -m pytest -q
node --test tests/*.test.cjs
На Windows 23.09.2026: 34 Python-теста и 7 JavaScript-тестов пройдено. Проверены даты, статусы, основания, обезличивание, PDF/DOCX, защита API, хранение, кэш и изоляция его параметров, HTTP-сценарий загрузки/правок/повтора с подменённым ИИ, поиск, радар, повестка, безопасный ICS и состав выпускаемого архива. JavaScript-тесты проверяют задержку подсказок 1500 мс, отмену при уходе курсора, клавиатуру и исключение касаний. Дополнительно проверены регистрация/вход/выход, хеширование паролей, отзыв и срок сессий, CSRF, ограничение попыток, миграция прежних записей, запрет доступа другого аккаунта, изоляция кэша, OAuth state/PKCE/обмен кода с подменёнными ответами сервисов и переходы цветов дедлайна. Модели в автоматических тестах не скачиваются и не вызываются.
Полный запуск настоящих моделей на записи №2: 303,72 с до готовности, повторный импорт с теми же параметрами — 2,15 с. Получены 71 реплика и 5 поручений, проверены ответы экспорта PDF/DOCX. Это измерение на одном компьютере, не гарантия скорости или полноты. Условия и результаты проверок.
Для отдельной проверки настоящего аудиоконвейера запустите сервер и выполните:
.\.venv\Scripts\python.exe scripts/smoke_test.py "C:\path\meeting.mp3" --date 2026-09-23 --language ru --mode fast --repeat --email [email protected]
Скрипт запросит пароль аккаунта в терминале без отображения. Используйте запись, на обработку которой у вас есть право. Скрипт создаёт два совещания, проверяет PDF/DOCX и попадание повторного импорта в кэш. Времена этапов остаются локально в data/smoke-latest.json.
Скорость и полезные инструменты
Повторная запись кэшируется только внутри аккаунта владельца и определяется по SHA-256 содержимого, а не имени файла. Результат переиспользуется только при совпадении даты, языка, числа говорящих, режима и версии конвейера/манифеста моделей. Ручные правки и статусы исходного совещания не копируются. Удаление совещания-источника удаляет связанный кэш.
Быстрый режим сокращает число рассматриваемых вариантов распознавания с 3 до 1. Подходит для чистой записи, но может ухудшить точность; для сложной/смешанной речи оставлен точный режим по умолчанию. Просмотр транскрипта не требует окончания генерации саммари. Качество извлечения всё ещё требует проверки человеком.
Во вкладке «Инструменты» доступны радар проверки, баланс разговора, повестка и календарь. Баланс — доля длительности распознанных реплик, не оценка сотрудников. Поиск в транскрипте использует слова и их начала, а не генеративные ответы. В календарь попадают только незавершённые, проверенные поручения с подтверждённой датой.
CI/CD
Workflow .github/workflows/ci-release.yml запускается на push в main, pull request и вручную:
Статус на 23.09.2026: workflow добавлен, но первый запуск GitHub Actions остановлен до выделения runner из-за ограничения аккаунта организации. Успешный прогон Windows/Ubuntu и автоматический выпуск пока не подтверждены. Предварительные выпуски, проверенные только локально, явно помечаются Pre-release; их нельзя считать результатом CI.
- Устанавливает зафиксированные зависимости на Windows и Ubuntu, запускает тесты, проверку Python/JavaScript и сборку архива.
- Сохраняет JUnit-результаты проверок в Actions.
- Только после успешных проверок
mainсобирает архив с SHA-256 и публикует GitHub Release с уникальным тегомbuild-<номер>-<commit>.
Архив содержит исходники и установочные скрипты. Модели, бинарные движки, записи, база, секреты и venv исключаются явным списком разрешённых файлов. После скачивания архива сначала выполните setup.ps1, затем start.cmd. Это автоматическая доставка приложения для локального запуска; размещения пользовательских данных на веб-сервере нет.
Реальная проверка предоставленного Совещание №1.mp3: 274,25 секунды, завершены распознавание, диаризация и анализ; сформировано 8 поручений. Число голосовых групп при этом запуске задано вручную — 6. В эталонном протоколе перечислено 10 поручений: результат требует проверки полноты и не является доказательством 100% точности. Запись, эталон и результат содержат пользовательские данные и в репозиторий не включены.
Проверка казахской и смешанной речи: добавлен воспроизводимый локальный замер WER/CER. Качество казахского и смешанного аудио, полнота поручений и точность границ говорящих пока не измерены на размеченной выборке. Тесты API не заменяют оценку моделей. Экспорт проверен программно; полная визуальная проверка всех вариантов длинных документов ещё не выполнена.
Соответствие кейсу
| Требование | Реализация и граница проверки |
|---|---|
| Распознавание речи | Локальный Whisper; основной путь проверен на MP3 №1 |
| Русский | Проверен основной аудиосценарий |
| Казахский / смешанный | Мультиязычная модель, режимы kk / mixed; качество аудио отдельно не измерено |
| Ответственный и срок | Локальная LLM, исходные формулировки, редактор и подтверждение |
| Различение говорящих | Акустические эмбеддинги и кластеризация; подтверждение имён человеком |
| Саммари и протокол | Локальная модель, транскрипт с таймкодами |
| PDF / DOCX | Оба формата, включая кириллицу |
| Закрытый контур | Локальные модели; runtime не скачивает модели автоматически |
| Контроль исполнения | Статусы, фильтры, просрочка, напоминания в интерфейсе |
Приватность и известные ограничения
- Внешние сервисы при установке: PyPI, Hugging Face и GitHub. Скачиваются веса и движок; содержимое совещаний не передаётся. Лицензии моделей и зависимостей определяются их авторами.
- Сервер привязан к
127.0.0.1. Добавлены аккаунты, scrypt, HttpOnly-сессии, CSRF/Origin-проверки, ограничение попыток входа, CSP и изоляция данных. Нет корпоративного SSO/MFA, подтверждения email, шифрования SQLite/аудио и организационных ролей. Не публикуйте порт напрямую в интернет; подробнее — безопасность и OAuth. - Диаризация группирует похожие голоса, а не устанавливает личность. Шум, короткие реплики и одновременная речь ухудшают качество; число групп может быть неверным. Имена и привязки подтверждает секретарь.
- Модель может пропустить поручение, ошибиться в имени, сроке или саммари. Существование реплик-оснований проверяется программно; достоверность вывода проверяет человек.
- «К пятнице», «на следующей неделе», даты без года и нераспознанные сроки требуют подтверждения. Исходная формулировка сохраняется. Нормализация сложных казахских дат ограничена.
- Повторы и уточнения через границы частей длинного транскрипта могут обрабатываться неточно.
- Обезличивание заменяет известные имена буквальным совпадением. Склонения, организации и косвенные идентификаторы могут остаться. Перед демонстрацией реальных данных нужна ручная проверка.
- Напоминания обновляются каждые 4 секунды в открытом приложении. Браузерные уведомления требуют разрешения; фоновой рассылки email/SMS при закрытом приложении нет.
- Бот для Teams/Zoom/Google Meet, потоковая транскрибация, интеграция с СЭД и голосовая биометрическая идентификация не реализованы. Вход — запись файла или микрофона с последующей обработкой.
- Удаление убирает запись и данные совещания из приложения; это не криптографическое стирание свободных страниц SQLite и резервных копий.
Развёртывание и развитие
Рабочая версия запускается локально. Публичного веб-деплоя нет. GitHub содержит исходники и инструкции; GitHub Pages не исполняет Python и локальные AI-модели этого проекта.
Для корпоративного размещения нужны сервер в закрытом контуре, корпоративная аутентификация/MFA, TLS, роли, управление хранением и резервными копиями. Направления развития: оценка RU/KZ/code-switching на размеченных записях, улучшение диаризации, сравнение полноты поручений с эталонами, фоновые уведомления и адаптеры СЭД.
Проект разработан с участием Codex. README описывает фактическую реализацию, а не гарантию оценки жюри.
Авторы коммитов
История коммитов
- 2026-09-23 17:20fix: add specialized Kazakh ASR and protect mixed speech decodingEra0602
- 2026-09-23 16:30feat: launch Dauys Hunt accounts, OAuth integration and deadline themesEra0602
- 2026-09-23 15:39feat: add delayed icon tooltips and document measured verificationEra0602
- 2026-09-23 15:17feat: improve meeting workspace, cache imports and automate verified releasesEra0602
- 2026-09-23 14:47feat: add local Alem AI meeting assistant and Russian setup guideEra0602
Структура репозитория (59 файлов)
.env.example .github/workflows/ci-release.yml .gitignore CHANGELOG.md README.md VERSION app/__init__.py app/analysis.py app/auth.py app/cache.py app/config.py app/dates.py app/export.py app/insights.py app/main.py app/pipeline.py app/speech.py app/speech_quality.py app/store.py docs/accounts.md docs/speech-quality.md docs/verification.md examples/meeting-mixed.txt models.lock.json requirements.lock.txt requirements.txt run.ps1 scripts/check_speech.py scripts/package_release.py scripts/reset_password.py scripts/setup_kazakh.py scripts/setup_models.py scripts/smoke_test.py setup.ps1 start.cmd tests/auth_helpers.py tests/deadlines.test.cjs tests/icon_tooltips.test.cjs tests/test_api.py tests/test_auth.py tests/test_cache_release.py tests/test_core.py tests/test_insights.py tests/test_retranscribe.py tests/test_speech_check.py tests/test_stream.py tests/test_workflow.py web/app.js web/auth.js web/dauys.css web/deadlines.js web/icons.css web/icons.js web/icons.svg web/index.html web/mark.svg web/refinements.css web/style.css web/tools.js
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.