AAYMA
RU
Войти

QonimAI

Полностью локальная система протоколирования совещаний: аудио превращается в транскрипт с разметкой говорящих, из него получаются саммари и…

Рабочий MVP
Команда «QonimAI» 6💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: 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.md

QonimAI — локальное протоколирование совещаний

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.

Первый проверяемый сценарий

  1. Оставьте режим «Аудиозапись» и прочитайте уведомление об обработке ИИ.
  2. Подтвердите разрешение на обработку. В блоке проверки вымышленной аудиозаписи отметьте, что используются синтезированные голоса, и нажмите «Испытать на синтетической аудиозаписи».
  3. Выполняется настоящий вызов локального ASR и разделения голосов. Эталонные реплики и поручения не подставляются. Запись длится 29,018 секунды, содержит два синтезированных русских голоса; реальные люди не записывались.
  4. Прослушайте запись и подтвердите имена голосов. Исправьте ошибки распознавания вручную: в проверенном запуске встречалось «Даньяр» вместо «Данияр». Сохраните подтверждения и текст.
  5. Запустите выделение поручений и саммари. Сверьте результат с репликами: автор поручения не обязательно его исполнитель; неизвестные сроки должны остаться неизвестными.
  6. При необходимости исправьте результат с объяснением. При изменении транскрипта или метаданных прежний анализ и ручные правки сохраняются в истории сеанса; историю можно явно скачать в JSON или удалить. Затем отдельно подтвердите проверку актуального снимка и просмотр перед экспортом; подготовьте и скачайте DOCX.

Режим «Синтетические примеры» отдельно показывает заранее подготовленные текстовые fixtures без запуска моделей; UI и DOCX это явно указывают. Его успех не является проверкой аудио или LLM. Подробности — инструкция интерфейса.

Своя запись: WAV/MP3/M4A/OGG, до 50 МиБ и 5 минут. Укажите участников и ожидаемое число говорящих; число кластеров задаётся пользователем. Для относительных сроков нужна известная дата встречи и IANA-зона. Если дата неизвестна, её нельзя заменять временем компьютера. Ошибки веса, формата, размера, длительности и результата показываются явно.

Архитектура и версии

УчастокРеализация
UIStreamlit 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
DOCXpython-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.

Звёзды
⭐ 2
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
11
Авторы
2
Файлы
80
Ветки
5

Авторы коммитов

mrmystery7 7Arman 4

История коммитов

  • 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
Ветки (5)

Обсуждение 0 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.