О проекте
Команда: Genesis
Кейс HackAlem.ai: Инновации — Самрук-Казына
Стадия: Рабочий MVP
Задача кейса: «Хаттама»: протокол и поручения по аудиозаписи совещания (каз./рус./смешанная речь)
Суть
Flask-MVP: принимает аудиозапись совещания, делает транскрипт по говорящим, извлекает поручения с ответственными и сроками, пишет управленческое саммари и выдаёт протокол в DOCX.
Как устроено
Конвейер: аудио → транскрипция (whisper-1) и диаризация (gpt-4o-transcribe-diarize, при сбое всё относится к SPEAKER_00) → имена говорящих по контекстным фразам без биометрии → поручения через Structured Outputs со строгой схемой и исходной цитатой (неизвестные поля = null) → саммари → объект MeetingProtocol → DOCX (python-docx) → веб-интерфейс. Demo-режим работает без сети на размеченном RU/KZ fixture.
Ключевые решения
- STT
- speaker diarization
- контекстное сопоставление имён
- Structured Outputs
- фильтрация поручений без цитаты
- экспорт DOCX
Особенности
Честно указаны ограничения: качество на реальном RU/KZ аудио не подтверждено, demo на fixture. Поручения без исходной цитаты отбрасываются, неизвестные ответственный и срок не выдумываются. Попытку локального казахского STT откатили.
Стек
Python · Flask · OpenAI SDK · python-docx · unittest
Модели
OpenAI whisper-1 · gpt-4o-transcribe-diarize · OpenAI gpt-6-astra
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-1d041715-genesis.
README
README.mdАвтопротокол совещаний HackAlem AI
Рабочий MVP для кейса Самрук-Казына: система принимает запись совещания, формирует транскрипт по говорящим, находит поручения с ответственными и сроками, создаёт управленческое саммари и выдаёт готовый протокол в DOCX.
Проблема
Ручное протоколирование занимает время, а поручения, сроки и ответственные могут теряться. Проект собирает эти данные в одном проверяемом результате и сохраняет исходный контекст разговора.
Что реализовано
- загрузка аудио в форматах
flac,m4a,mp3,mp4,mpeg,mpga,ogg,wav,webm; - транскрипция через OpenAI Transcriptions API;
- speaker diarization с безопасным fallback на
SPEAKER_00; - контекстное сопоставление speaker с именем без биометрии;
- извлечение поручений со строгой JSON-схемой и исходной цитатой;
- сохранение неизвестных ответственного и срока как
null/«Не указано»; - краткое управленческое саммари;
- единый объект протокола;
- презентабельный DOCX;
- минимальный web UI;
- полностью автономный demo-mode без ключа и сети.
End-to-end сценарий
audio / demo fixture
→ transcription and diarization
→ contextual speaker names
→ action items and summary
→ meeting protocol
→ DOCX
→ web UI
Каждый этап расположен в отдельном модуле. Если optional diarization недоступна, API-режим пытается сохранить результат через обычную транскрипцию с одним говорящим.
Архитектура и технологии
- Python 3.10+;
- Flask — локальный web UI;
- OpenAI Python SDK — облачный API-режим;
gpt-4o-transcribe-diarize— speaker diarization;whisper-1— совместимый резервный STT существующего модуля;- Responses API Structured Outputs — структурированные поручения;
python-docx— DOCX-экспорт;unittest— тесты без платных API-вызовов.
Модели задаются environment variables, поэтому provider можно заменить без изменения структуры протокола.
Структура проекта
app entrypoint src/meeting_minutes/web.py
transcription src/meeting_minutes/transcription.py
diarization and fallback src/meeting_minutes/diarization.py
speaker name inference src/meeting_minutes/speaker_names.py
task extraction src/meeting_minutes/task_extraction.py
summary src/meeting_minutes/summary.py
protocol and pipeline src/meeting_minutes/protocol.py, pipeline.py
DOCX export src/meeting_minutes/export_docx.py
offline fixture src/meeting_minutes/fixtures/demo_meeting.json
tests tests/
Установка
git clone https://github.com/BAITC-Hacks/hack-1d041715-genesis.git
cd hack-1d041715-genesis
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
Copy-Item .env.example .env
pip install -r requirements.txt устанавливает сам пакет, поэтому ручной
PYTHONPATH не нужен.
Настройка environment variables
Безопасный шаблон находится в .env.example:
APP_MODE=demo
OPENAI_API_KEY=your_openai_api_key_here
OPENAI_TRANSCRIPTION_MODEL=whisper-1
OPENAI_DIARIZATION_MODEL=gpt-4o-transcribe-diarize
OPENAI_TEXT_MODEL=gpt-6-astra
.env исключён из Git. Настоящий ключ нельзя добавлять в репозиторий.
Единый запуск
После установки команда одинакова для обоих режимов:
meeting-minutes
Альтернативный вариант:
python -m meeting_minutes
Откройте http://127.0.0.1:5000.
Demo-mode без аккаунта
Оставьте APP_MODE=demo и не задавайте настоящий API-ключ. В UI будет явно
показана маркировка DEMO. Нажмите «Запустить демонстрацию» — система покажет
полный flow и позволит скачать DOCX.
Demo-mode не распознаёт аудио. Транскрипт, поручения и саммари загружаются из открыто обозначенного тестового RU/KZ fixture. Сборка объекта протокола, web UI и DOCX выполняются реальным кодом.
Реальный API-режим
В .env задайте:
APP_MODE=api
OPENAI_API_KEY=ваш_ключ
Перезапустите приложение, загрузите MP3/WAV и нажмите «Обработать аудио». Приложение ограничивает загрузку 25 МБ и показывает понятную ошибку вместо Python traceback.
Как жюри проверить проект
- Выполнить команды раздела «Установка».
- Убедиться, что в
.envустановленоAPP_MODE=demo. - Запустить
meeting-minutes. - Открыть http://127.0.0.1:5000.
- Нажать «Запустить демонстрацию».
- Проверить саммари, таблицу пяти поручений и RU/KZ транскрипт по говорящим.
- Скачать DOCX и открыть его локально.
- Запустить тесты командой ниже.
Пример результата
{
"task": "Подготовить претензию поставщику",
"assignee": "Ерлан",
"deadline": "до конца недели",
"speaker": "SPEAKER_00"
}
В demo также есть поручение без срока и поручение без указанного ответственного, чтобы проверить отсутствие выдуманных данных.
Тестирование
python -m unittest discover -s tests -v
Тесты не обращаются к платным API. Они проверяют ошибки аудиофайла, demo STT,
формат diarization, fallback, имена speaker, поручения с null, фильтрацию задач
без исходной цитаты, summary, объект протокола, DOCX и web flow.
Данные и интеграции
- Demo fixture содержит синтетический русский, казахский и смешанный RU/KZ текст.
- В API-режиме аудио и транскрипт передаются в OpenAI.
- База данных, авторизация и постоянное серверное хранение не используются.
- Загруженный файл находится только во временном каталоге на время обработки.
Известные ограничения
- Нет закрытого контура. Облачный API-режим передаёт аудио и текст внешнему сервису и не подходит для чувствительных данных промышленного заказчика.
- Реальная точность русского, казахского и смешанного аудио не подтверждена на предоставленном корпусе — в репозитории нет реальных аудиозаписей.
- Demo использует fixture/mock-данные и не является доказательством качества STT или LLM.
- Сопоставление имён основано на контекстных фразах и не выполняет биометрическую идентификацию.
- При недоступной diarization весь fallback-транскрипт относится к
SPEAKER_00. whisper-1и текущая diarization-модель объявлены к отключению 26 февраля 2027 года; значения вынесены в конфигурацию для миграции.- Результаты скачивания хранятся только в памяти процесса и исчезают после перезапуска приложения.
Путь к промышленному закрытому контуру
Pipeline отделён от конкретных provider-вызовов. Для on-premise развёртывания
нужно заменить облачные реализации транскрипции, diarization и анализа на
локальные/self-hosted модели, сохранить текущие структуры TranscriptSegment,
ActionItem и MeetingProtocol, после чего повторно проверить качество на
корпоративном RU/KZ корпусе. Текущий MVP не заявляется как on-premise решение.
Дальнейшее развитие
- подключить локальные STT, diarization и LLM providers;
- провести оценку качества на реальных RU/KZ и mixed записях;
- добавить ручное исправление speaker-name перед экспортом;
- нормализовать относительные сроки, сохраняя исходную формулировку;
- добавить контролируемое корпоративное хранение только после согласования требований безопасности.
Официальные справочные страницы: Speech-to-Text, Structured Outputs, Deprecations.
Авторы коммитов
История коммитов
- 2026-09-23 17:40Revert "feat: add local Kazakh speech recognition"sypatai
- 2026-09-23 16:51feat: add local Kazakh speech recognitionsypatai
- 2026-09-23 16:33docs: record final QA checkpointssypatai
- 2026-09-23 15:43fix: stabilize contextual speaker labelssypatai
- 2026-09-23 15:18fix: add safe audio API diagnosticssypatai
- 2026-09-23 14:54feat: add hackathon demo interfacesypatai
- 2026-09-23 14:53feat: add speaker diarization pipelinesypatai
- 2026-09-23 14:53feat: extract action items and meeting summariessypatai
Все коммиты (12)
- 2026-09-23 14:53feat: generate meeting protocol DOCXsypatai
- 2026-09-23 14:43docs: add non-invasive jury verification checklistsypatai
- 2026-09-23 14:42chore: record active hackathon progress checkpointsypatai
- 2026-09-23 13:42feat: add resilient audio transcription modulesypatai
Структура репозитория (33 файлов)
.env.example .gitignore CONTEXT.md README.md docs/HACKATHON_PROGRESS.md docs/JURY_CHECKLIST.md docs/QA_NOTES.md pyproject.toml requirements.txt src/meeting_minutes/__init__.py src/meeting_minutes/__main__.py src/meeting_minutes/config.py src/meeting_minutes/demo.py src/meeting_minutes/diagnostics.py src/meeting_minutes/diarization.py src/meeting_minutes/export_docx.py src/meeting_minutes/fixtures/demo_meeting.json src/meeting_minutes/models.py src/meeting_minutes/pipeline.py src/meeting_minutes/protocol.py src/meeting_minutes/speaker_names.py src/meeting_minutes/static/app.css src/meeting_minutes/summary.py src/meeting_minutes/task_extraction.py src/meeting_minutes/templates/index.html src/meeting_minutes/templates/result.html src/meeting_minutes/transcription.py src/meeting_minutes/web.py tests/test_analysis.py tests/test_diarization.py tests/test_protocol.py tests/test_transcription.py tests/test_web.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.