О проекте
Команда: QonimAI
Кейс HackAlem.ai: Инновации — Самрук-Казына
Стадия: Рабочий MVP
Задача кейса: «Хаттама»: протокол и поручения по аудиозаписи совещания (каз./рус./смешанная речь)
Суть
Полностью локальная система протоколирования совещаний: аудио превращается в транскрипт с разметкой говорящих, из него получаются саммари и поручения, пользователь их проверяет и правит, затем экспортирует в DOCX. Сквозной прогон подтверждён только на синтетической русской записи.
Как устроено
faster-whisper small (CPU int8) распознаёт речь. sherpa-onnx с эмбеддингами WeSpeaker кластеризует голоса в заданное пользователем число спикеров. После ручной проверки транскрипта Qwen3-4B-Q4_K_M в llama.cpp извлекает саммари и поручения в строгий JSON (схема qonimai.analysis.v1), который проходит валидатор контрактов. Интерфейс на Streamlit ведёт историю правок, python-docx экспортирует только проверенный снимок.
Ключевые решения
- faster-whisper
- WeSpeaker embeddings
- кластеризация спикеров
- строгий JSON-парсер вывода LLM
- нормализация относительных сроков с IANA-зоной
- SHA-256 фиксация весов
Метрики
305 тестов (303 passed, 2 skipped); на синтетической 29-с записи: ASR+диаризация 101,1 с, совпадение голосов 6/6; анализ 68,86 с, 3/3 поручения
Особенности
Редкая честность: README прямо говорит, что казахская и смешанная речь не проверены. Модели скачиваются с проверкой SHA-256 и зафиксированными ревизиями. Проверено, что приложение не ходит в сеть, и что оно ставится с нуля из заранее скачанных wheels. Qwen 1.5B пробовали и отклонили, это задокументировано. Команда работала с AI-агентами по контрактам и handoff-документам.
Стек
Python · Streamlit · faster-whisper · sherpa-onnx · llama.cpp · python-docx · unittest · PowerShell
Модели
Whisper small (faster-whisper) · Qwen3-4B-Q4_K_M (llama.cpp) · WeSpeaker
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-bdc1bfee-qonimai.
README
README.mdQonimAI — локальное протоколирование совещаний
QonimAI превращает короткую запись в транскрипт с голосами, саммари и поручения, которые пользователь проверяет и экспортирует в DOCX. Код, история и документация находятся только в репозитории хакатона.
Состояние перед сдачей: реализованы аудиомодуль, локальный анализатор, Streamlit, редактор и DOCX. Выполнен один сквозной прогон на вымышленной русской записи с ручной проверкой транскрипта. Это не подтверждает готовность всех требований: казахское и смешанное аудио не проверены; отдельные текстовые случаи отклоняются валидатором. Актуальные доказательства и ограничения — в LIVE_VERIFICATION.md.
Быстрый запуск: Windows / PowerShell
Проверенная платформа: Windows 11 x64, CPython 3.12.14, Intel Core i7-13620H, около 16 ГБ RAM, CPU без NVIDIA. Другие ОС и GPU в этой сдаче не проверены. Команды выполняются из корня клонированного репозитория; python должен указывать на установленный Python 3.12, а не заглушку Windows Store.
python --version
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements-lock.txt
.\.venv\Scripts\python.exe scripts/setup_models.py
.\scripts\start-local.ps1
Первоначальная установка требует интернета. requirements-lock.txt фиксирует все проверенные зависимости; requirements-app.txt содержит основные зависимости. Скрипт подготовки скачивает около 3,1 ГБ весов и CPU-сборку llama.cpp; Python-пакеты и распаковка требуют дополнительного места. Ключи облачных API не нужны. Загрузка может занять существенно больше времени, чем обработка тестового примера.
После запуска откройте локальное приложение. Сервер анализа слушает только 127.0.0.1:8081, UI — 127.0.0.1:8501. Скрипт запуска включает offline-переменные библиотек и отключает телеметрию. Ctrl+C останавливает UI; сервер модели остаётся работающим, его PID записан в runtime/llama.pid. Перед остановкой сервера проверьте, что PID относится к запущенному вами llama-server.exe.
Первый проверяемый сценарий
- Оставьте режим «Аудиозапись» и прочитайте уведомление об обработке ИИ.
- Подтвердите разрешение на обработку. В блоке проверки вымышленной аудиозаписи отметьте, что используются синтезированные голоса, и нажмите «Испытать на синтетической аудиозаписи».
- Выполняется настоящий вызов локального ASR и разделения голосов. Эталонные реплики и поручения не подставляются. Запись длится 29,018 секунды, содержит два синтезированных русских голоса; реальные люди не записывались.
- Прослушайте запись и подтвердите имена голосов. Исправьте ошибки распознавания вручную: в проверенном запуске встречалось «Даньяр» вместо «Данияр». Сохраните подтверждения и текст.
- Запустите выделение поручений и саммари. Сверьте результат с репликами: автор поручения не обязательно его исполнитель; неизвестные сроки должны остаться неизвестными.
- При необходимости исправьте результат с объяснением. При изменении транскрипта или метаданных прежний анализ и ручные правки сохраняются в истории сеанса; историю можно явно скачать в JSON или удалить. Затем отдельно подтвердите проверку актуального снимка и просмотр перед экспортом; подготовьте и скачайте DOCX.
Режим «Синтетические примеры» отдельно показывает заранее подготовленные текстовые fixtures без запуска моделей; UI и DOCX это явно указывают. Его успех не является проверкой аудио или LLM. Подробности — инструкция интерфейса.
Своя запись: WAV/MP3/M4A/OGG, до 50 МиБ и 5 минут. Укажите участников и ожидаемое число говорящих; число кластеров задаётся пользователем. Для относительных сроков нужна известная дата встречи и IANA-зона. Если дата неизвестна, её нельзя заменять временем компьютера. Ошибки веса, формата, размера, длительности и результата показываются явно.
Архитектура и версии
| Участок | Реализация |
|---|---|
| UI | Streamlit 1.64.0, app.py, ui_helpers.py |
| Русское / казахское / смешанное распознавание как целевая возможность | faster-whisper 1.2.1, многоязычный Whisper small, CPU int8; фактически проверена только русская синтетическая запись |
| Говорящие | sherpa-onnx 1.13.8, WeSpeaker ONNX embeddings и кластеризация в заданное число голосов |
| Саммари и поручения | Qwen3-4B-Q4_K_M, локальный llama.cpp b11125, CPU, JSON проходит строгий парсер |
| Контракты | contracts.py, analysis/model_output.py, схема qonimai.analysis.v1 |
| DOCX | python-docx 1.2.0, локальный export_docx.py |
audio.pipeline.transcribe(audio_path, meeting, participants, *, asr_model_path, speaker_model_path, num_speakers) возвращает транскрипт с {id, start, end, speaker_id, text}. Голоса первоначально не связаны с именами. analysis.local_model.analyze(transcript, *, base_url, model, timeout) вызывает только локальный анализатор и проверяет его JSON. export_docx(...) принимает актуальный, просмотренный пользователем снимок. Полная схема и правила сроков/исправлений — контракт v1.
app.py / ui_helpers.py интерфейс, состояние, проверка пользователем
audio/pipeline.py локальное аудио → текст и голоса
analysis/local_model.py локальный текст → саммари и поручения
analysis/model_output.py проверка сырого JSON модели
contracts.py структура, ссылки, сроки, версии, ручные правки
export_docx.py проверенный снимок → DOCX
fixtures/ только вымышленные контрольные примеры
scripts/ подготовка весов, локальный запуск, smoke
tests/ автоматические и Streamlit AppTest-проверки
docs/submission/ приёмка, ограничения и доказательства сдачи
Получение моделей и лицензии
scripts/setup_models.py фиксирует ревизии Whisper/Qwen, версию llama.cpp и проверяет SHA-256 основных весов/архива. Источники: faster-whisper-small, Qwen3-4B-GGUF, sherpa-onnx, llama.cpp. Лицензия Qwen загружается рядом с весами; карточки и условия остальных компонентов нужно учитывать перед применением вне хакатона. Состав и контрольные суммы записываются в models/download-manifest.json.
Каталоги models/, runtime/, .venv/ не входят в Git. Приложение не вызывает загрузчик весов: сначала отдельная подготовка, затем обработка. Qwen 1.5B проверяли как более лёгкий вариант и отклонили из-за ошибок содержания; он не является подтверждённым рабочим запасным вариантом.
Проверки и воспроизводимость
.\.venv\Scripts\python.exe -m unittest discover -s tests -p 'test_*.py'
.\.venv\Scripts\python.exe scripts/smoke_local.py --help
Последний зафиксированный общий прогон: 305 тестов, 303 прошли, 2 пропущены. Пропуски относятся к проверке настоящего отсутствия базы IANA, которая в рабочей среде установлена. Это результат данного прогона, а не обещание неизменного числа тестов при дальнейших изменениях. Лог.
Чистая .venv-clean установлена из 56 заранее подготовленных wheels с --no-index; установка заняла 24,761 с, pip check, импорты и тесты прошли. Отчёт. Для повторения на совместимой Windows/Python машине заранее подготовьте wheels:
.\.venv\Scripts\python.exe -m pip download --only-binary=:all: -r requirements-lock.txt -d runtime/wheels
python -m venv .venv-clean
.\.venv-clean\Scripts\python.exe -m pip install --no-index --find-links runtime/wheels -r requirements-lock.txt
.\.venv-clean\Scripts\python.exe -m pip check
.\.venv-clean\Scripts\python.exe -m unittest discover -s tests -p 'test_*.py'
В измеренном русском TTS-прогоне: ASR и голоса — 101,111 с, 6 реплик и совпадение голосов 6/6 на этом единственном примере; после явной ручной проверки транскрипта анализ — 68,86 с, 3/3 ожидаемых поручения. Общее время с ручной проверкой не измерено. Исходный ASR, исправления и выход модели сохранены отдельно в evidence. Это не оценка качества на реальных совещаниях. Визуально проверены все 8 страниц двух контрольных DOCX и 3 страницы итогового документа: обрезаний не выявлено, казахские символы отображаются.
Данные, ограничения и сдача
Реальные записи, транскрипты и протоколы запрещено передавать во внешние API, ИИ-чаты, GitHub или Live Share. Работайте с ними отдельно от общей папки проекта. Уведомляйте участников о записи и обработке ИИ. Модель может пропустить поручение или придумать факт; успешная структурная проверка не заменяет человеческую. Политика — DATA_AND_LIMITATIONS.md.
Казахская и смешанная речь на аудио ещё не проверены. На текущем промпте отдельные KK_EXPLICIT и TOMORROW_YEAR отклонялись валидатором; стабильность анализа не подтверждена. Короткие/перекрывающиеся реплики и имена требуют проверки. Подключение к Teams/Zoom/Meet, live-поток и напоминания отсутствуют; их обязательность нужно уточнить у организаторов. Полное исходное Google Docs ТЗ ранее открыть не удалось.
Сеть ОС физически не отключалась: подготовленные зависимости, offline-переменные и проверки сетевых обращений не заменяют отдельный запуск всего приложения при отключённом внешнем интернете. Не заявляем полную offline-приёмку или качество трёх языковых режимов.
Перед сдачей используйте LIVE_VERIFICATION, чек-лист и демосценарий. Старые отчёты REVIEW_AGENT_B_01..03 и ранний DOCX_REPORT описывают состояние до интеграции; актуальность определяют текущий код и итоговая приёмка. Для продолжения работы — PROJECT_STATE.md, роли команды — TEAM_GUIDE.md.
Авторы коммитов
История коммитов
- 2026-09-23 17:34Build local audio-to-protocol MVP and verified submission packagemrmystery7
- 2026-09-23 16:50Document verified partial prototype and submission packagemrmystery7
- 2026-09-23 16:33Add validated DOCX export and synthetic examplesArman
- 2026-09-23 16:16Accept model output parser and prepare DOCX export taskmrmystery7
- 2026-09-23 16:07Validate strict JSON output from future local modelsArman
- 2026-09-23 15:59Accept contract validator and document reproducible checksmrmystery7
- 2026-09-23 15:51Implement v1 contract validators and unittest coverageArman
- 2026-09-23 15:37Approve v1 contracts and review agent B handoffmrmystery7
Все коммиты (11)
- 2026-09-23 15:26Draft analysis contracts, synthetic cases and acceptance planArman
- 2026-09-23 14:59Document second agent handoff and bounded first taskmrmystery7
- 2026-09-23 14:42Set up team collaboration in hackathon repositorymrmystery7
Структура репозитория (80 файлов)
.gitattributes .gitignore .streamlit/config.toml .vsls.json PROJECT_STATE.md README.md TEAM_CHECK.md TEAM_GUIDE.md analysis/__init__.py analysis/local_model.py analysis/model_output.py app.py audio/__init__.py audio/pipeline.py contracts.py docs/AGENT_HANDOFF.md docs/CONTRACT_V1.md docs/MODELS.md docs/REVIEW_AGENT_B_01.md docs/REVIEW_AGENT_B_02.md docs/REVIEW_AGENT_B_03.md docs/REVIEW_AGENT_B_04.md docs/agent-b/ACCEPTANCE_PLAN.md docs/agent-b/CONTRACT_PROPOSAL.md docs/agent-b/DOCX_REPORT.md docs/agent-b/IMPLEMENTATION_REPORT.md docs/agent-b/MODEL_OUTPUT_REPORT.md docs/agent-b/REPORT.md docs/agent-b/SYNTHETIC_CASES.json docs/analysis.md docs/audio.md docs/export.md docs/local_analysis.md docs/submission/DATA_AND_LIMITATIONS.md docs/submission/DEMO_SCRIPT.md docs/submission/LIVE_VERIFICATION.md docs/submission/README.md docs/submission/REQUIREMENTS_CHECKLIST.md docs/submission/SUBMISSION_FORM.md docs/submission/VERIFICATION_REPORT.md docs/submission/evidence/DEMO_PREVIOUS_RUN.md docs/submission/evidence/clean-install.txt docs/submission/evidence/final-tests.txt docs/submission/evidence/run_socket_guard.py docs/submission/evidence/socket-guard-result.json docs/submission/evidence/synthetic_asr_original.json docs/submission/evidence/synthetic_model_analysis.json docs/submission/evidence/synthetic_previous_run.docx docs/submission/evidence/synthetic_review_provenance.json docs/submission/evidence/synthetic_transcript_reviewed.json docs/submission/evidence/tests-normal.txt docs/submission/evidence/tests-socket-guard.txt docs/submission/evidence/wheels-manifest.json docs/submission/model-download-manifest.json docs/ui.md examples/__init__.py examples/export_fixture.py export_docx.py fixtures/audio/synthetic_ru_two_speakers.json fixtures/audio/synthetic_ru_two_speakers.wav fixtures/synthetic_cases.json prompts/AGENT_B_DOCX.md prompts/AGENT_B_MODEL_OUTPUT.md prompts/AGENT_B_NEXT.md prompts/AGENT_B_START.md requirements-app.txt requirements-export.txt requirements-lock.txt requirements-validation.txt scripts/setup_models.py scripts/smoke_local.py scripts/start-local.ps1 tests/test_audio_pipeline.py tests/test_contracts.py tests/test_export_docx.py tests/test_local_model.py tests/test_model_output.py tests/test_smoke_cli.py tests/test_ui_helpers.py ui_helpers.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.