О проекте
Команда: h3aven
Кейс HackAlem.ai: Инновации — Самрук-Казына
Стадия: Рабочий MVP
Задача кейса: «Хаттама»: протокол и поручения по аудиозаписи совещания (каз./рус./смешанная речь)
Суть
Локальный ассистент совещаний: по аудиозаписи строит транскрипт со спикерами, summary, решения, риски и поручения с ответственными и сроками. Протокол можно редактировать и экспортировать в PDF, DOCX, MD и JSON.
Как устроено
Загрузка аудио → FFmpeg → faster-whisper (large-v3 при GPU от 6 ГБ, иначе small) → диаризация через diarize или pyannote.audio с резервной разметкой по тексту → совмещение сегментов → LLM-анализ через локальную Ollama (например qwen2.5:3b), опционально NVIDIA NIM, с rule-based fallback. Обработка идёт фоновыми задачами FastAPI с этапами. Правки сохраняются, документы генерируются заново через python-docx и ReportLab.
Ключевые решения
- faster-whisper
- диаризация спикеров (diarize/pyannote)
- текстовая диаризация как fallback
- извлечение поручений LLM
- rule-based fallback анализ
- фоновые задачи
Особенности
Полностью локальный контур STT, диаризации и LLM с автоматическим выбором размера Whisper по доступной видеопамяти. Внешний анализатор включается только явным флагом ALLOW_CLOUD_ANALYSIS. Ограничения описаны честно: точность STT и диаризации не заявляется.
Стек
Python · FastAPI · Uvicorn · Pydantic · FFmpeg · Ollama · python-docx · ReportLab · HTML/CSS/JS · Streamlit
Модели
faster-whisper large-v3 · Whisper small · Qwen2.5:3b via Ollama · NVIDIA NIM · pyannote.audio
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-6c526967-h3aven.
README
README.mdSÖZDE — AI Meeting Assistant
Система подготовки протоколов корпоративных совещаний. Превращает запись в транскрипт, краткое содержание, решения и поручения с ответственными и сроками. Предназначена для руководителей и команд, проводящих встречи на русском, казахском и смешанном RU/KZ.
Основной интерфейс — HTML-лендинг с окном Open meeting workspace.
Что реализовано
- Загрузка MP3, WAV, MP4, M4A, WEBM, OGG, FLAC до 500 МБ и прослушивание записи.
- Локальное распознавание, разметка спикеров и транскрипт с временными отметками.
- Извлечение summary, повестки, решений, рисков и поручений с ответственными, сроками и подтверждающими фрагментами.
- Фоновая обработка с реальными этапами и прошедшим временем; восстановление статуса после обновления страницы при работающем сервере.
- История встреч, поиск по транскрипту, исправление имён и поручений, контроль статусов.
- Экспорт PDF, DOCX, Markdown и JSON. После сохранения правок документы формируются заново.
- Диагностика FFmpeg, GPU и Ollama.
Пользовательский сценарий
- Открыть рабочее окно, выбрать запись, нажать Create meeting protocol.
- Система подготавливает аудио, распознаёт речь, разделяет спикеров, анализирует содержание и создаёт документы.
- В Protocol проверить текст, имена, решения и сроки; исправить ошибки.
- Сохранить правки и скачать протокол. Вернуться к встрече через History, обновить статусы в Task control.
Язык и спикеры определяются автоматически. Технические параметры задаются при настройке сервера.
Технологии
| Компонент | Реализация |
|---|---|
| Интерфейс | HTML, CSS, JavaScript, Fetch API |
| Backend | Python, FastAPI, Uvicorn, Pydantic |
| Подготовка записи | FFmpeg |
| Распознавание | faster-whisper / Whisper |
| Диаризация | diarize; опционально pyannote.audio |
| Анализ текста | Локальная Ollama, резервный анализ по правилам, опционально NVIDIA NIM |
| Документы | python-docx, ReportLab |
| Хранение | Файлы и JSON, без отдельной БД |
| Дополнительный интерфейс | Streamlit в app.py; основной запуск использует HTML + FastAPI |
Архитектура
fronttt.html + fronttt.css + fronttt.js
│ загрузка / статус / правки / экспорт
▼
server.py
▼
pipeline/audio_processor.py → stt.py → diarization.py
▼
transcriber.py: совмещение сегментов
▼
llm_analyzer.py → export.py
▼
temp/api/meeting_*/ → результат в браузере
run.py запускает сервер, assets/ содержит ресурсы интерфейса, tests/ и evals/ — проверки и инструменты оценки.
| Маршрут | Назначение |
|---|---|
| POST /jobs | Загрузить запись и получить идентификатор фоновой задачи |
| GET /jobs/{id} | Статус и этап |
| GET /meetings | История |
| GET /meetings/{id} | Результат |
| PUT /meetings/{id} | Сохранение summary, поручений и имён |
| GET /meetings/{id}/download/{kind} | PDF, DOCX, Markdown, JSON |
| POST /transcribe | Синхронная обработка для API-клиентов |
| GET /health, GET /capabilities | Диагностика и возможности |
Установка и запуск
1. Подготовка
Нужны Python (для воспроизведения рекомендуется 3.12), FFmpeg и свободное место для моделей и записей. GPU необязателен. Интернет нужен для установки зависимостей и первоначальной загрузки моделей.
Установите FFmpeg и добавьте его в PATH. На Windows также можно положить ffmpeg.exe в корень проекта.
python --version
ffmpeg -version
Откройте PowerShell в корне проекта, где находятся run.py и requirements.txt.
2. Зависимости
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install --upgrade pip
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
Copy-Item .env.example .env
Если .env уже настроен, не копируйте его повторно. Активация виртуального окружения для этих команд не требуется.
3. Анализ текста
Без Ollama и внешних API доступен резервный анализ по правилам. Он не равнозначен полноценному анализу языковой моделью.
Для локального AI-анализа установите Ollama и загрузите одну из предусмотренных кодом моделей, например:
ollama pull qwen2.5:3b
ollama serve
Если служба Ollama уже работает, повторный ollama serve не нужен. Backend использует http://127.0.0.1:11434. Значение OLLAMA_HOST из примера окружения сейчас не переключает этот адрес в основном API.
Базовые параметры в .env:
ALLOW_CLOUD_ANALYSIS=0
DEVICE=auto
OLLAMA_MODEL=auto
Для фоновых задач без явного STT_MODEL выбирается large-v3 при обнаруженном GPU с памятью не менее 6 ГБ, иначе small. Администратор может задать STT_MODEL вручную. Лёгкая модель экономит ресурсы, но качество нужно оценивать на целевых записях.
Опциональный backend pyannote требует зависимостей из requirements-optional.txt, HF_TOKEN и доступа к соответствующим моделям. Для базового запуска токен не обязателен.
4. Запуск
.\.venv\Scripts\python.exe run.py
Откройте http://127.0.0.1:8000 → Open meeting workspace.
API-документация: http://127.0.0.1:8000/docs.
Держите терминал сервера открытым во время обработки. Двойной щелчок по fronttt.html не запускает backend.
Linux/macOS, при установленном FFmpeg:
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
cp .env.example .env
.venv/bin/python run.py
Как проверить решение жюри
- Запустите сервер и откройте рабочее окно.
- В System readiness → Check readiness проверьте FFmpeg и, если нужен локальный AI-анализ, Ollama.
- В New meeting загрузите свою запись. Для быстрой первой проверки удобен фрагмент на 30–60 секунд. Если в корне локальной копии есть MP3, они также доступны в списке примеров; записи не включаются в Git.
- Нажмите Create meeting protocol, дождитесь завершения этапов.
- В Protocol сопоставьте текст и временные отметки с аудио. Проверьте предупреждения, имена, поручения и сроки.
- Исправьте имя или поручение, нажмите Save protocol and regenerate exports, скачайте PDF/DOCX и проверьте наличие правок.
- Откройте History и Task control, измените статус поручения и сохраните.
После загрузки запись обрабатывается на сервере: окно можно закрыть или обновить. Перезапуск сервера прерывает незавершённую обработку — потребуется повторная загрузка.
Проверены выдача HTML/CSS/JS и API, сохранение правок и экспорт документов. Жизненный цикл фоновой задачи проверен с имитацией распознавания. Это не подтверждает точность STT/диаризации или скорость на реальных записях; измеренные показатели качества не заявляются.
Данные и интеграции
Входные данные — записи пользователя и, при наличии, локальные примеры в корне проекта. Исходники аудио, промежуточные файлы и протоколы сохраняются в temp/api/. Автоматическая очистка истории не реализована.
STT и голосовая диаризация работают локально. Для работы без сети необходимо заранее загрузить модели и проверить запуск в конкретном окружении.
NVIDIA NIM — необязательный внешний анализатор текста. Он включается только при ALLOW_CLOUD_ANALYSIS=1 и наличии NVIDIA_API_KEY; модель задаёт NVIDIA_MODEL. В этом режиме транскрипт передаётся внешнему сервису, поэтому режим не является полностью локальным. Ключи хранятся в серверном .env, исключённом из Git.
Интеграции Teams, Zoom, Google Meet и СЭД в backend не реализованы. Выгрузка документа не является автоматической интеграцией с СЭД.
Ограничения
- Первый запуск может скачивать модели. CPU, длинные записи и локальный LLM увеличивают ожидание. Интерфейс показывает этапы, а не точный процент или прогноз завершения.
- При недоступности голосовой диаризации используется резервная разметка по тексту. Она не является достоверным определением говорящего по голосу.
- Имена извлекаются из текста и могут исправляться вручную. Биометрическая идентификация не реализована.
- Резервный анализ по правилам ограничен, особенно на смешанной речи. Относительные сроки могут оставаться в форме «до пятницы».
- Задачи выполняются в одном процессе. После рестарта незавершённые задачи автоматически не возобновляются; завершённые результаты остаются на диске.
- Нет авторизации, разграничения доступа и изоляции пользователей. Сервер по умолчанию слушает только
127.0.0.1; версия предназначена для локальной демонстрации. - Основной HTML-интерфейс англоязычный. Полная локализация не реализована.
- Сертификаты безопасности и гарантии точности или производительности не заявляются.
Развёрнутая версия
Подтверждённой ссылки на публичный deployment в проекте нет. Демонстрация доступна локально: http://127.0.0.1:8000 после запуска сервера.
Авторы коммитов
История коммитов
- 2026-09-23 17:57Merge remote history retaining current SOZDE applicationarrmanelo
- 2026-09-23 17:57Integrate SOZDE meeting workspace and local processing pipelinearrmanelo
- 2026-09-23 14:43Build meeting protocol MVPEldos Nuktenov
- 2026-09-23 14:2912arrmanelo
Структура репозитория (28 файлов)
.env.example .gitignore README.md app.py assets/sozde.svg evals/evaluate_results.py fronttt.css fronttt.html fronttt.js pipeline/__init__.py pipeline/audio_processor.py pipeline/diarization.py pipeline/export.py pipeline/llm_analyzer.py pipeline/stt.py pipeline/text_diarization.py pipeline/transcriber.py requirements-optional.txt requirements.txt run.bat run.ps1 run.py server.py setup.ps1 test_pipeline.py tests/__init__.py tests/test_core.py transcribe.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.