О проекте
Команда: Aitalent
Кейс HackAlem.ai: Инновации — Самрук-Казына
Стадия: Рабочий MVP
Задача кейса: «Хаттама»: протокол и поручения по аудиозаписи совещания (каз./рус./смешанная речь)
Суть
Локальный ассистент секретаря: по аудио строит стенограмму с говорящими и метками языка, извлекает поручения, саммари и решения, ведёт дашборд поручений с напоминаниями и экспортирует протокол в DOCX и PDF.
Как устроено
ffmpeg приводит аудио к WAV 16 кГц. faster-whisper large-v3-turbo распознаёт речь с определением языка по фрагментам и подсказкой из казахской и русской лексики. Диаризация: эмбеддинги ECAPA-TDNN (SpeechBrain) плюс кластеризация scikit-learn, опционально pyannote. Локальная LLM в Ollama (qwen2.5:3b) возвращает JSON с поручениями, саммари и решениями, относительные сроки вроде «жұмаға дейін» пересчитываются в даты. Данные хранятся в SQLite, фоновая проверка раз в минуту создаёт напоминания, экспорт через python-docx и ReportLab со шрифтом DejaVu.
Ключевые решения
- faster-whisper large-v3-turbo
- SpeechBrain ECAPA-TDNN
- clustering diarization
- pyannote (optional)
- relative deadline normalization
- background reminders
Особенности
Диаризация на ECAPA и кластеризации не требует токенов HF. Запросы к внешним LLM заблокированы, пока не выставлен ALLOW_EXTERNAL_LLM. Клик по реплике проигрывает запись с этого места, приложена эталонная запись с протоколом для проверки.
Стек
Python · FastAPI · SQLite · python-docx · ReportLab · ffmpeg · scikit-learn · Docker Compose · HTML/JS
Модели
Whisper large-v3-turbo · Ollama qwen2.5:3b · qwen2.5:7b
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-476d5925-aitalent.
README
README.mdАвтопротокол совещаний
Прототип ИИ-ассистента секретаря: по аудиозаписи совещания на русском, казахском или смешанном языке («шала-казахский») делает стенограмму с разделением по говорящим, выделяет поручения (кто, что, к какому сроку), формирует краткое саммари и экспортирует протокол в DOCX и PDF.
Все модели работают локально. Аудио и текст совещаний не передаются во внешние облачные API, поэтому решение можно развернуть в закрытом контуре заказчика.
Проблема
Протоколы совещаний пишут вручную. Это отнимает время секретарей, а поручения, сроки и ответственные теряются или искажаются, из-за чего страдает контроль исполнительской дисциплины.
Что реализовано
| Требование кейса | Реализация |
|---|---|
| Распознавание речи | faster-whisper (large-v3-turbo по умолчанию), локально, CPU или GPU |
| Русский, казахский, смешанная речь | Мультиязычный режим Whisper с определением языка по фрагментам + подсказка с казахской и русской лексикой совещаний. У каждой реплики — метка «рус / қаз / смеш.» |
| Диаризация и привязка поручения к человеку | ECAPA-эмбеддинги (SpeechBrain) + кластеризация, без токенов и аккаунтов. Опционально pyannote. Говорящим можно присвоить имена, и поручения автоматически показываются с этими именами. LLM сама связывает прозвучавшие в обращениях имена с метками говорящих |
| Выделение поручений с ответственным и сроком | Локальная LLM (Ollama, qwen2.5:3b; на машине с GPU можно qwen2.5:7b) возвращает структурированный JSON. Относительные сроки («до пятницы», «жұмаға дейін», «келесі дүйсенбіге дейін») пересчитываются в даты от даты совещания |
| Саммари | Краткое содержание, таблица ключевых пунктов по направлениям (показатель и проблема по каждому докладу) и список принятых решений |
| Экспорт PDF/DOCX | Протокол с участниками, саммари, решениями, таблицей поручений и стенограммой. PDF со встроенным шрифтом DejaVu (поддерживает казахские буквы) |
Дополнительно:
- запись совещания прямо в браузере; перед записью секретарь подтверждает, что участники уведомлены о записи и ИИ-транскрибации (сценарий 1 кейса);
- прослушивание записи рядом со стенограммой: клик по реплике включает запись с этого места, звучащая реплика подсвечивается — удобно проверять спорные места протокола;
- поиск по стенограмме с подсветкой совпадений;
- дашборд поручений со статусами «в работе / скоро срок / просрочено / выполнено» и фильтрами;
- автоматические напоминания о приближении срока и просрочке (сценарий 2 кейса), видны на дашборде;
- классификация поручений по приоритету и направлению;
- редактирование срока и статуса поручения, повторный анализ после переименования говорящих;
- защита контура: если в настройках указан внешний адрес LLM, запрос блокируется;
Dockerfileиdocker-compose.ymlдля развёртывания on-premise.
Как работает
- Секретарь подтверждает уведомление участников и записывает совещание в браузере или загружает файл (mp3, wav, m4a, ogg, mp4, webm).
- ffmpeg приводит запись к WAV 16 кГц моно.
- faster-whisper распознаёт речь с таймкодами.
- Диаризация определяет, какой реплике какой говорящий соответствует.
- Локальная LLM получает стенограмму с метками говорящих и датой совещания и возвращает саммари, решения и поручения.
- Результат сохраняется в SQLite. Секретарь проверяет протокол, присваивает имена говорящим и скачивает DOCX или PDF.
- Фоновая проверка сроков раз в минуту создаёт напоминания по поручениям, у которых подходит или прошёл срок.
Архитектура
flowchart LR
UI[Веб-интерфейс<br/>запись / загрузка / дашборд] -->|REST| API[FastAPI]
API --> Q[Очередь обработки]
Q --> FF[ffmpeg]
FF --> STT[faster-whisper<br/>распознавание]
STT --> DIA[ECAPA + кластеризация<br/>или pyannote]
DIA --> LLM[Ollama / self-hosted LLM<br/>поручения и саммари]
LLM --> DB[(SQLite)]
API --> DB
API --> EXP[Экспорт DOCX / PDF]
REM[Проверка сроков] --> DB
| Файл | Назначение |
|---|---|
app/main.py | API, очередь обработки, напоминания |
app/stt.py | Конвертация аудио, распознавание, диаризация, разбор текстовой стенограммы |
app/llm.py | Промпт и извлечение поручений, саммари и решений |
app/export.py | Формирование DOCX и PDF |
app/db.py | Хранилище SQLite, статусы поручений |
app/static/index.html | Веб-интерфейс без внешних зависимостей и CDN |
Технологии
Python 3.10+, FastAPI, faster-whisper (CTranslate2), SpeechBrain ECAPA-TDNN, scikit-learn, Ollama с моделью Qwen2.5 3B, SQLite, python-docx, ReportLab, ffmpeg. Фронтенд на чистом HTML и JavaScript.
Системные требования
- Python 3.10–3.12
- ffmpeg
- 16 ГБ ОЗУ рекомендуется (Whisper large-v3-turbo + LLM 3B); на 8 ГБ используйте
WHISPER_MODEL=small. Если есть GPU NVIDIA, можно поставить более точнуюLLM_MODEL=qwen2.5:7b - около 8 ГБ на диске для моделей
- GPU NVIDIA необязателен, но ускоряет обработку в несколько раз
- интернет нужен только при первом запуске для скачивания моделей; дальше всё работает офлайн
Установка и запуск
1. ffmpeg
# Ubuntu / Debian
sudo apt install ffmpeg
# macOS
brew install ffmpeg
# Windows
winget install ffmpeg
2. Ollama и модель
Установите Ollama с https://ollama.com/download, затем:
ollama pull qwen2.5:3b
Ollama после установки работает как служба на http://localhost:11434. Если нет, запустите ollama serve.
3. Приложение
Linux / macOS:
git clone <URL репозитория>
cd <папка репозитория>
python3 -m venv .venv
source .venv/bin/activate
# Без GPU сначала поставьте облегчённый torch для CPU (быстрее скачивается):
pip install torch torchaudio --index-url https://download.pytorch.org/whl/cpu
pip install -r requirements.txt
cp .env.example .env
Windows (PowerShell):
git clone <URL репозитория>
cd <папка репозитория>
python -m venv .venv
# Один раз: разрешить запуск скрипта активации окружения
# (без этого PowerShell выдаёт ошибку «выполнение сценариев отключено в этой системе»)
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
.venv\Scripts\Activate.ps1
pip install torch torchaudio --index-url https://download.pytorch.org/whl/cpu
pip install -r requirements.txt
copy .env.example .env
Замечания для Windows:
- если ffmpeg устанавливали через
wingetуже после открытия PowerShell, закройте окно и откройте новое: иначе ffmpeg не будет найден. Можно также указать полный путь кffmpeg.exeв.env(FFMPEG_PATH); - права администратора и режим разработчика не нужны: модели скачиваются обычными файлами в
data/models.
4. Запуск
uvicorn app.main:app --host 0.0.0.0 --port 8000
Откройте http://localhost:8000. В правом верхнем углу зелёный индикатор означает, что локальная LLM доступна.
При первой обработке аудио скачаются модели Whisper (около 1,6 ГБ) и ECAPA (около 80 МБ) в папку data/models.
Запуск в Docker (закрытый контур)
cp .env.example .env
docker compose up -d --build
docker compose exec ollama ollama pull qwen2.5:3b
Переменные окружения
Все параметры описаны в .env.example. Основные:
| Переменная | По умолчанию | Назначение |
|---|---|---|
WHISPER_MODEL | large-v3-turbo | Модель распознавания: small, medium, large-v3, large-v3-turbo |
WHISPER_DEVICE | auto | cpu, cuda или автовыбор |
HF_TOKEN | пусто | Если задан и установлен requirements-pyannote.txt — диаризация pyannote |
DIAR_THRESHOLD | 0.65 | Порог кластеризации ECAPA, если число участников не указано |
LLM_BACKEND | ollama | ollama или openai_compatible (vLLM, NVIDIA NIM on-prem, LM Studio) |
LLM_BASE_URL | http://localhost:11434 | Адрес локального LLM-сервера |
LLM_MODEL | qwen2.5:3b | Модель LLM (qwen2.5:7b точнее, но на CPU работает в 2–3 раза медленнее) |
ALLOW_EXTERNAL_LLM | 0 | Запросы к нелокальным адресам блокируются, пока не выставлено 1 |
REMIND_DAYS_BEFORE | 1 | За сколько дней до срока напоминать |
Ни личные аккаунты, ни платные подписки для проверки не нужны.
Как проверить решение
Быстрая проверка без аудио (1–2 минуты). Проверяет выделение поручений, саммари, дашборд и экспорт.
- Откройте http://localhost:8000.
- Раскройте блок «Проверить без аудио — вставить стенограмму», нажмите «Вставить пример» (тот же текст лежит в
samples/sample_meeting.txt), укажите дату2026-09-23и нажмите «Сформировать протокол». - Ожидаемый результат (формулировки LLM могут немного отличаться) — три поручения:
- Ерлан: подготовить результаты тестирования, срок 25.09.2026 («жұмаға дейін» — до пятницы);
- Дана: передать тестовые данные, срок 24.09.2026, высокий приоритет («до завтра, это срочно»);
- Дана: подготовить презентацию для акимата, срок 28.09.2026 («келесі дүйсенбіге дейін» — до следующего понедельника);
- решение: запуск портала переносится на 1 октября.
- Нажмите «Скачать PDF» и «Скачать DOCX».
- Откройте вкладку «Поручения»: там счётчики по статусам, фильтры и напоминания (появляются в течение минуты).
Проверка на эталонной записи. В samples/audio.mp3 — смоделированное оперативное совещание (5 участников, 3,5 минуты), в samples/reference_protocol.docx — эталонная стенограмма и протокол, составленные вручную. Загрузите запись, укажите 5 участников и сравните полученные поручения с эталоном: шесть поручений, в том числе поручение юристу Ерлану, который сам в совещании не участвует.
Полная проверка с аудио.
- На вкладке «Новое совещание» отметьте уведомление участников.
- Загрузите тестовую запись из папки
samples/(если команда её приложила) или запишите совещание кнопкой записи, прочитав по ролямsamples/record_script.md. - Укажите число участников (3) — так диаризация точнее.
- Дождитесь обработки: статус этапов обновляется на странице. На CPU 2 минуты аудио обрабатываются примерно за 2–5 минут.
- Проверьте стенограмму с метками языка, присвойте имена говорящим и нажмите «Сохранить имена» — ответственные в поручениях обновятся.
Данные и интеграции
- Тестовые записи — смоделированные совещания с вымышленными именами, персональных данных нет.
- Внешних API нет. Модели скачиваются из открытых источников (Hugging Face — Whisper и ECAPA, Ollama — Qwen2.5) только при первом запуске. Для полностью изолированного контура их можно заранее перенести в
data/modelsи в хранилище Ollama. - Используемые открытые компоненты: faster-whisper (MIT), модели Whisper от OpenAI (MIT), SpeechBrain и модель spkrec-ecapa-voxceleb (Apache 2.0), Qwen2.5 (Apache 2.0), pyannote.audio (MIT, опционально), FastAPI, python-docx, ReportLab, шрифт DejaVu Sans.
Ограничения
- Качество распознавания казахской речи у Whisper заметно ниже, чем русской; для продакшена стоит дообучить модель на казахских корпусах. Модель задаётся в
WHISPER_MODEL, её можно заменить на дообученную версию в формате CTranslate2. - Диаризация ECAPA присваивает говорящего целой реплике Whisper, поэтому быстрые перебивания внутри одной фразы могут склеиться. Для лучшего качества — pyannote.
- Метка языка у реплики определяется эвристикой по казахским буквам и приблизительна.
- Подключение ботом к Teams, Zoom и Google Meet не реализовано: запись встречи загружается файлом или пишется в браузере.
- Напоминания показываются в интерфейсе; рассылки по почте и интеграции с СЭД нет.
- Поручения извлекаются LLM и требуют проверки секретарём, о чём сказано в протоколе.
- Нет авторизации пользователей: прототип рассчитан на работу во внутренней сети.
Развёрнутая версия
Нет: решение рассчитано на локальный запуск в контуре заказчика.
Авторы коммитов
История коммитов
- 2026-09-23 17:17docs: инструкция по установке для Windows PowerShellmakishevomar
- 2026-09-23 16:48fix: единая модель qwen2.5:3b в и настройках, восстановлены примеры в samplesmakishevomar
- 2026-09-23 16:19samples: по тех заданиюmakishevomar
- 2026-09-23 16:05feat: таблица ключевых пунктов по направлениям, эталонная запись и протокол для проверкиmakishevomar
- 2026-09-23 15:20feat: потоковый ответ с прогрессом, ускорение анализа наmakishevomar
- 2026-09-23 15:12feat: промежуточная стенограмма и прогресс во время распознаванияmakishevomar
- 2026-09-23 14:38feat: прослушивание записи по клику на реплику и поиск по стенограммеmakishevomar
- 2026-09-23 13:50fix: правильное имя файла .env.examplemakishevomar
Все коммиты (9)
- 2026-09-23 13:46feat: initial commit for meeting protocol prototypemakishevomar
Структура репозитория (22 файлов)
.env.example .gitignore Dockerfile README.md app/__init__.py app/config.py app/db.py app/export.py app/fonts/DejaVuSans-Bold.ttf app/fonts/DejaVuSans.ttf app/fonts/README.md app/llm.py app/main.py app/static/index.html app/stt.py docker-compose.yml requirements-pyannote.txt requirements.txt samples/audio.mp3 samples/record_script.md samples/reference_protocol.docx samples/sample_meeting.txt
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.