Запись встречи → транскрибация → структурированный протокол с участниками, решениями и поручениями. Модель не додумывает — только факты из стенограммы.
# ─── ВХОД ─── Источники: • Аудиозапись встречи (MP3, WAV) • Видеозапись (MP4, WEBM) — ссылка на ДИОН • (опционально) готовая стенограмма • (опционально) шаблон протокола организации # ─── ПАЙПЛАЙН ─── Шаг 1. Извлечение аудио IF видео: FFmpeg — извлечение аудиодорожки IF ссылка ДИОН: browser_automation → авторизация → download Шаг 2. Очистка аудио → FFmpeg: удаление шумов, пауз, нормализация Шаг 3. STT + структурирование (1 вызов OpenRouter) → Gemini 3 Flash: input_audio + строгий system prompt → Результат — JSON: { "участники": [...], "повестка": "...", "решения": [...], "поручения": [ { "кто": "...", "что": "...", "срок": "..." } ], "неопределено": [...] # то, в чём модель не уверена } Шаг 4. Генерация DOCX → Шаблон организации → Заполнение: участники, повестка, решения, поручения → Сохранение в /tmp/protocol-{date}.docx Шаг 5. Отправка → Telegram: файл + краткая сводка → (опционально) Email рассылка участникам Шаг 6. Clean Up → Удаление исходного видео/аудио → Удаление промежуточных файлов # ─── СТРОГИЙ SYSTEM PROMPT (ключевой элемент) ─── Правила работы LLM: 1. НЕ выдумывай информацию, которой нет в стенограмме 2. Если в стенограмме нет ответственного — "НЕ УКАЗАН" 3. Если нет срока — "НЕ УКАЗАН" 4. Если сомневаешься в формулировке — процитируй дословно 5. НЕ добавляй поручения, которые не были явно озвучены 6. Если участник не представился — "НЕ ОПРЕДЕЛЁН" 7. Решения отделяй от обсуждений — только то, по чём пришли к консенсусу
— Значит так, по lендингу. — Сергей, жду макет в пятницу. — Дим, тексты нужны к четвергу. — Владимир, как там доступ к API? — Надо бы согласовать бюджет. — По CRM — вопрос сняли. — В пятницу встретимся ещё раз.
Участники • НЕ ОПРЕДЕЛЕНЫ Решения • Вопрос по CRM закрыт Поручения ▸ Макет лендинга → Ответственный: Сергей → Срок: пятница → Статус: ⚠️ требуется уточнение ▸ Подготовка текстов → Ответственный: Дмитрий → Срок: четверг → Статус: ожидает ▸ Доступ к API → Ответственный: Владимир → Срок: НЕ УКАЗАН → Статус: ожидает Не определено • Бюджет: неясно, кто согласует • Участники встречи не представились
Вместо: «Составь протокол встречи» Используем: «На основе стенограммы заполни структуру. Правила: - НЕ ДОДУМЫВАЙ - НЕ ДОБАВЛЯЙ отсутствующее - "НЕ УКАЗАНО" если нет данных - Цитируй дословно при сомнении»
На тестовых записях (3 встречи по 15-45 минут) — нулевое количество выдуманных поручений. Модель честно пишет «НЕ ОПРЕДЕЛЕНО» в 100% случаев, когда данные отсутствуют в исходной записи.
| Компонент | Технология | Назначение |
|---|---|---|
| STT + LLM | OpenRouter: Gemini 3 Flash / Nemotron 3 Nano Omni (free) | Транскрибация + структурирование одним вызовом |
| Оркестрация | Hermes Agent | Управление пайплайном, cron, интеграции |
| Извлечение аудио | FFmpeg | Видео → аудиодорожка |
| Автоматизация браузера | Browser Use | Скачивание с ДИОН |
| Почта | IMAP (himalaya / python imaplib) | Мониторинг входящих писем |
| Генерация DOCX | python-docx | Шаблон протокола |
| Доставка | Telegram API / SMTP | Отправка протокола |