Telemost Recorder — запись Яндекс.Телемост

entity project bot automation meeting transcript node docker telegram whisper modified: 2026-08-03 08:37 · canonical

Telemost Recorder — запись Яндекс.Телемост 🎙️

GitHub: https://github.com/3dstepansky/stepansky-telemost-recorder-doker Актуальная ветка: v04 — коммит 508deeb от 2026-07-03 (feat: direct telegram delivery and ai summary fix). Важно про версии: master и 003v старее (b563afd, 2026-05-31) и README частично продолжает описывать n8n-оркестрацию. Актуальный код и спецификация 002-standalone-bot-and-fixes фиксируют переход к автономному Node.js/Telegram-боту без n8n как основного оркестратора. источник

Суть проекта

Telemost Recorder — zero-cost бот для записи встреч в Яндекс.Телемосте. Он заходит на встречу гостем, перехватывает WebRTC-аудио через Puppeteer/Chromium, сохраняет .webm, транскрибирует встречу через AssemblyAI или Groq Whisper, генерирует саммари через Groq Llama 3.3 70B, а затем отдаёт результаты в Telegram и/или Яндекс.Диск через WebDAV. источник

Проект важен для базы как живой пример агентной автоматизации вокруг встреч: браузерный агент действует в видеоконференции, извлекает аудио, строит пайплайн STT → summary → delivery и закладывает будущий RAG/архив встреч.

Архитектура v04

Telegram bot.js / Telegraf
  ↓
run.js — жизненный цикл сессии
  ↓
recorder.js — Puppeteer + WebRTC monkey-patch + MediaRecorder
  ↓
recordings/<timestamp>/
  ├── meeting_audio.webm
  ├── tracks/<trackId>.webm
  └── meta/track_events.ndjson, tracks_summary.json
  ↓
transcribe.js
  ├── AssemblyAI speaker_labels=true
  └── Groq Whisper fallback через FFmpeg chunks
  ↓
summary.txt / transcript.txt / Telegram / Yandex Disk / S3

Ключевой архитектурный сдвиг: в старой версии n8n был внешним orchestrator-слоем, а в v04 основной пользовательский контур перенесён в bot.js + SQLite. n8n-файлы (n8n_workflow_v0.4.json, n8n_workflow_head.json) остаются в репозитории как исторические/совместимые артефакты. источник

Основные компоненты

КомпонентНазначение
bot.jsTelegram-бот на Telegraf: меню, FSM, настройки имени бота и Яндекс.Диска, старт/стоп записи
run.jsЗапускает recorder.js, после закрытия записи делает раннюю выгрузку аудио и запускает транскрибацию
recorder.jsHeadless Chromium/Puppeteer, вход в Телемост, WebRTC monkey-patch, запись mix + per-track файлов
transcribe.jsAssemblyAI → Groq fallback, speaker mapping по track_events.ndjson, выгрузка transcript/summary, отправка в Telegram
db.jsSQLite: users, meetings, state FSM, имя бота, WebDAV-учётки
services/webdav.jsЯндекс.Диск через WebDAV: MKCOL, PUT, MOVE, проверка авторизации
services/summarize.jsСаммари и метаданные папки через Groq llama-3.3-70b-versatile
services/transcribe.jsAssemblyAI speaker_labels=true, Groq Whisper verbose_json fallback
services/ffmpeg.jsКонвертация/сегментация аудио для STT
.specify/ и .github/prompts/speckit.*Spec Kit / Specify контур для spec-driven разработки

UX Telegram-бота

Бот имеет три главных пользовательских раздела:

База данных

Актуальная SQLite-схема в db.js:

users(chat_id primary key, bot_name, yandex_user, yandex_pass, state)
meetings(id, chat_id, meeting_id, title, file_path, transcribed_at, speaker_count, utterance_count)

Историческая database.sql описывает PostgreSQL/Supabase-таблицы telemost_meeting_transcripts и telemost_user_settings, но для v04 рабочий runtime — SQLite внутри контейнера. источник

Статус требований spec 002

Реализовано:

Частично/требует проверки:

Не начато / roadmap:

US-16: нативная диаризация через WebRTC-треки

Самая важная исследовательская линия проекта — гипотеза, что Яндекс.Телемост отдаёт отдельные WebRTC-аудиотреки по участникам. В v04 recorder.js уже реализует dual-output:

1. meeting_audio.webm — общий микс для STT. 2. tracks/<trackId>.webm — отдельная запись каждого входящего аудиотрека. 3. meta/track_events.ndjson — события track-added и speech-segment с trackId, временем и амплитудой. 4. tracks_summary.json — сводка по трекам.

Проверка track-probe на реальной встрече 2026-07-02 подтвердила техническую возможность раздельной записи: получены два отдельных .webm трека и события активности. Ограничение: speakerName пока пишется как unknown, нужно улучшить DOM-маппинг имени участника. источник

Проверка и качество

Я проверила тесты в актуальной ветке v04:

npm install
npm test

# tests 3
# suites 1
# pass 3
# fail 0

Первый запуск npm test падал из-за отсутствующих зависимостей (sqlite3 не установлен). После npm install тесты test/db.test.js прошли: создание дефолтного пользователя, сохранение и обновление пользователя. npm install также показал npm audit: 16 vulnerabilities, включая 1 critical — это отдельный quality-gate перед production. источник

Риски и технический долг

Roadmap

1. Починить speakerName: сопоставление WebRTC trackId с DOM-именем участника. 2. Зафиксировать мастер-формат диаризации: mix + per-track или полноценный diarization_map.json. 3. Проверить WebDAV/S3 upload и MOVE-переименование на реальном Яндекс.Диске. 4. Довести ручные кнопки «Транскрибировать»/«Сделать саммари» в Telegram UI. 5. Закрыть npm audit / обновить уязвимые зависимости. 6. Реализовать архивный RAG-Q&A по встречам с изоляцией по chat_id. 7. Исследовать real-time STT/TTS агента в комнате с latency <1.5 сек.

Связанные заметки