Skip to content

Stage to master - #29

Merged
yawaflua merged 14 commits into
masterfrom
stage
Nov 10, 2026
Merged

yawaflua merged 14 commits into
masterfrom
stage

Conversation

@yawaflua

@yawaflua yawaflua commented Nov 10, 2026 •

Copy link
Copy Markdown
Owner

Релиз stage → master: всё, что накопилось в stage с прошлого мержа (PR #24–#28).

Большая часть работы — от @ryysel, спасибо за PR #24–#27.

Агент на колонке

Команда при смене состояния (#24, @ryysel)

  • Новый флаг -state_command (MARUSYA_STATE_COMMAND). Агент запускает команду и последним аргументом передаёт состояние: idle, listening, thinking, speaking, error, disconnected или announcing.
  • Это нужно устройствам, где кольцом или экраном управляет другой процесс. Повторы одного состояния пропускаются, запуски идут строго по порядку, у каждого запуска есть таймаут. Код в пакете internal/indicator/statecmd.
  • Настройка добавлена в configs/agent.conf.d.example.

Команда сразу после ключевого слова (#27, @ryysel)

  • Спотер подтверждает слово примерно за секунду. Из-за этого фраза без паузы («Маруся, который час») успевала закончиться, ход распознавался пустым, и колонка молчала.
  • Теперь агент хранит последние 5 секунд звука в режиме ожидания и, когда начинает слушать, прогоняет их через определитель конца речи.
  • Новый фильтр высоких частот (срез 180 Гц, internal/audio/highpass.go) убирает гул комнаты, и тихой речи хватает запаса над шумом. В логе «no speech detected» теперь есть пик и уровень шума в dBFS.

Быстрый путь openaichat

Больше команд без облачной модели (#25, #27, @ryysel)

  • Относительная громкость: «сделай громче на 20», «тише на 10». Шаг по умолчанию 10, одной фразой нельзя перескочить весь диапазон.
  • Громкость словами: «на половину», «на максимум», «на всю». Раньше это уходило в модель, и при её лимитах подтверждение не приходило.
  • Дата и день недели: «какое сегодня число».
  • Сцены Умного дома Яндекса: «включи сцену Спокойной ночи».
  • Яркость: «яркость в зале 50», «поставь яркость торшера 50». Если не названы ни устройство, ни комната, запрос остаётся модели, чтобы она могла переспросить.
  • Ключевое слово, которое распознавание оставило в начале фразы, удаляется.

Спотер ключевого слова (deploy/wake)

Стабильный поток на загруженном хосте (#26, @ryysel)

  • Звук декодируется вне event loop, отдельным воркером на каждое соединение, а таймаут пинга увеличен до 60 с.
  • Таймаут записи на стороне сервера вырос с 1 до 5 секунд: раньше библиотека WebSocket рвала соединение при каждом скачке нагрузки.

Сон без колонок (#28)

  • Модели Vosk и Whisper загружаются при первом подключении и выгружаются через WAKE_SLEEP_AFTER секунд (по умолчанию 60) после ухода последней колонки. WAKE_SLEEP_AFTER=0 держит их загруженными.

Сервер и панель (#28)

  • Пока к серверу не подключена ни одна колонка, он спит. Он пишет об этом в лог и показывает в панели «спит: нет подключённых колонок».
  • POST /v1/ask в это время сразу отвечает 200 {"skipped": true} вместо 503. Хук marusya-ask молча завершается, Claude Code работает как без него.
  • Панель отличает устаревший агент от выключенных плагинов и подсказывает, что сделать в каждом случае.
  • Новое лицо _| . |_ у отключённой колонки.
  • Скрипт scripts/catalog-upload.py загружает архивы плагинов в каталог.

Переименование в OpenCapsula (#28)

  • Образы теперь называются ghcr.io/yawaflua/opencapsule-server и ghcr.io/yawaflua/opencapsule-wake, compose-файлы переведены на них.
  • Старые marusya-server и marusya-wake для совместимости получают те же теги с аннотацией OBSOLETE.
  • README, NOTICE и AUTHORS: новое название и отказ от аффилированности с VK (МКПАО «ВК»).
  • CI собирает образы и из stage (тег dev) и не запускается на изменения только в документации.

Проверки

  • gofmt, go vet ./..., go test -race ./... и node --check internal/server/panel/app.js проходят. Есть новые тесты для statecmd, фильтра высоких частот, фраз быстрого пути и сна сервера.
  • Сон спотера проверен на заглушках, без настоящих моделей.
  • Шаг CI с тегами старых имён образов впервые выполнится после этого мержа.

После мержа

  • Сделать пакеты opencapsule-server и opencapsule-wake публичными в GHCR: новые пакеты по умолчанию приватные.

ryysel and others added 14 commits November 1, 2026 05:37
«поставь громкость на половину», «на максимум», «на всю» fell through to
the text model: only digits matched volumeSetRE. With the cloud model rate
limited, the command was executed by a tool call but the confirmation never
came. Level words are now resolved in the fast path, next to the digit
form, so the answer is immediate and local.
The wake spotter verifies a candidate before reporting it, so on a loaded
host the server asks the speaker to listen about a second after the wake
word. A command said without a pause after it («Маруся, который час») is
over by then: the turn is transcribed as empty and the speaker stays
silent. A pause after the wake word hid the problem.

Keep the last five seconds of idle microphone audio and replay it through
the endpointer when listening starts. The buffered frames already passed
the noise floor and the high-pass filter, so the buffered speech goes out
with the turn as usual.

The high-pass filter is new as well: room rumble can sit only a few dB
below speech in a quiet room, and the endpointer compares speech with the
floor. Filtering below 180 Hz gives quiet speech more headroom, and the
«no speech detected» log now includes the peak and the floor in dBFS, so
a muted microphone is not mistaken for a quiet one.
agent: run a command on assistant state changes
openaichat: more fast-path speaker commands
wake: keep the spotter stream alive on a busy host
agent: keep the command that follows the wake word
The server skips ask requests at once with {"skipped": true} instead of
answering 503, so marusya-ask hooks return silently. The wake spotter loads
its models on the first connection and unloads them WAKE_SLEEP_AFTER
seconds after the last one closes.
Show that the server sleeps without speakers, give the slumped face to a
disconnected speaker and add a script that uploads plugin archives to the
catalog.
Publish the images as opencapsule-server and opencapsule-wake and keep
tagging the obsolete marusya-* names for compatibility. Rename the project
in the notice and authors and add a disclaimer of affiliation with VK.
Sleep without speakers and rename the project to OpenCapsula
@yawaflua
yawaflua merged commit a17b2e7 into master Nov 10, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants