Repository navigation
Releases: Horohi/soloist-station-lite
Release list
v1.2.0: Светомузыка Nothing Phone, CLI soloist, поддержка YAM v2 и автоочистка кэша
Release v1.2.0: Светомузыка Nothing Phone, консольный CLI, поддержка YAM v2 и оптимизация диска
Большое обновление плеера Spotify Soloist для умных колонок Яндекс (Станция Лайт 1, Лайт 2, Мини 2, Миди).
🌟 Что нового:
-
💡 Светомузыка и эквалайзер кольца LED (в стиле Nothing Phone):
- Прямой анализ реального звука через разделяемую память ALSA PCM (
dmixshared memory) без нагрузки на процессор. - Разделение частот в реальном времени: низкие (бас), средние (вокал/мелодия) и высокие (хэты/тарелки).
- Нелинейная квадратичная кривая чувствительности (
$x^2$ ) и динамический шумовой порог: при тихом звуке светодиоды не мерцают, а на битах и дропах ярко вспыхивают. - Мгновенная атака (0 мс) и плавный спад для эстетики глифов Nothing Phone.
- Автоматическая поддержка всех ревизий колонок (3 зоны на Лайт 1/2, 6 зон на Мини 2, 24 зоны на Миди).
- По умолчанию стильный чистый белый цвет, также доступны Rainbow, Cyan и другие через конфиг или CLI.
-
100% бесконфликтные голосовые команды: из парсера полностью удалены слова «включи» и «выключи», поэтому команды умного дома («включи/выключи свет») работают штатно без перехвата.
- Включение: «Алиса, зажигай», «Алиса, зажги», «Алиса, покажи эквалайзер», «Алиса, режим дискотеки», «Алиса, светомузыка», «Алиса, дискотека».
- Выключение: «Алиса, стоп дискотека», «Алиса, останови дискотеку», «Алиса, стоп эквалайзер», «Алиса, погаси подсветку», «Алиса, хватит светить».
- Прямой анализ реального звука через разделяемую память ALSA PCM (
-
⚡ Удобный консольный CLI (
soloist):- Управление колонкой в одну команду через SSH/ADB:
-
soloist status— подробный статус плеера, моста, расхода памяти, сессии Spotify и текущего трека. -
soloist update— обновление плеера до свежего релиза с GitHub в одну команду без потери настроек. -
soloist clean— мгновенная очистка логов, кэша и временных файлов. -
soloist led [on|off|white|rainbow|cyan]— прямое переключение светомузыки и цветовых профилей. -
soloist restart,soloist logs,soloist version.
-
- Управление колонкой в одну команду через SSH/ADB:
-
📦 Полная поддержка спецификации YAM v2:
- Добавлен манифест
yam.yamlдля нативной установки пакета через менеджер YAM. - Поддержка относительных путей, переменных окружения YAM (
$YAM_PKG,$YAM_VAR,$YAM_RUN) и изоляции сервисов.
- Добавлен манифест
-
🧹 Мгновенная очистка кэша и защита памяти Flash:
- Устранена ошибка
OS error: 2(delayed wipe) — каталогStorageперенесён в оперативную память (tmpfs), полностью предотвращая износ чипа NAND-памяти колонки. - Кэш треков очищается сразу после переключения и остановки воспроизведения, освобождая память.
- Включён 64 МБ zram-свап и отключён избыточный отладочный лог демона (-10 МБ в RAM), что гарантирует бесперебойную работу звонков Алисы (
calld).
- Устранена ошибка
v1.1.1: Тюнинг аллокатора памяти glibc (-55 МБ RAM)
Release v1.1.1: Тюнинг аллокатора памяти glibc (освобождение 50–60 МБ RAM)
Этот релиз оптимизирует распределение оперативной памяти демоном Spotify Soloist в среде Linux AArch64 на встроенных устройствах с малым объёмом RAM.
🚀 Что нового:
- Оптимизация glibc malloc аллокатора:
MALLOC_ARENA_MAX=1: предотвращает создание десятков дублирующих арен памяти под многочисленные внутренние потоки Soloist.MALLOC_TRIM_THRESHOLD_=131072иMALLOC_MMAP_THRESHOLD_=131072: гарантируют своевременный и агрессивный возврат освобождённых буферов ядру Linux черезmadviseиmunmap.
- Результаты на Яндекс Станциях:
- Виртуальная память процесса
soloistснизилась с 2.0 ГБ до ~200 МБ (в 10 раз!). - Реальное потребление RAM (RSS) упало с ~95 МБ до ~40–44 МБ (-50–55 МБ).
- Свободной оперативной памяти (
MemAvailable) на колонке стало ~82 МБ вместо 23 МБ, что полностью исключает риск падений из-за нехватки памяти (Linux OOM Killer) при длительном воспроизведении.
- Виртуальная память процесса
v1.1.0: Жизненный цикл запросов, отмена устаревших команд и стабильное управление
Release v1.1.0: Жизненный цикл запросов, отмена устаревших команд и стабильное управление
Этот релиз объединяет глубокую архитектурную переработку управления запросами и улучшенную обработку распознавания речи, а также полное сохранение нативного подавления голоса Алисы через Quasar IPC (Field 210).
🌟 Особая благодарность контрибьюторам:
- @noteburgservice-eng — за огромную работу в PR #6: проектирование жизненного цикла команд (
request_state.sh,control.sh), отмену устаревших запросов поиска, строгий шлюз финального распознавания (voice-request.h), дедупликацию и великолепный набор автоматических тестов. - Calve (Telegram) — за подробные логи, активное тестирование на Яндекс Станции Мини 2 и обнаружение нюансов с окружением
PATH/библиотеками и повторными срабатываниями.
🚀 Ключевые изменения и улучшения:
-
Жизненный цикл запросов и отмена устаревших команд:
- Введены счетчики поколений (
generation) и сериализация черезflock. - Если во время медленного поиска песни в Spotify пользователь нажимает «Пауза» или переключает трек, фоновый поиск автоматически аннулируется и не перебивает новое действие пользователя.
- Введены счетчики поколений (
-
Строгий шлюз финального распознавания (Final-only Voice Gate):
- Команды и поисковые запросы теперь исполняются строго по финальному кадру распознавания (
is_final == 1), исключая ложные срабатывания на промежуточных фразах (например, слово «стоп» в названиях песен). - Добавлен кольцевой буфер дедупликации на 16 ID запросов, предотвращающий повторный запуск старых фраз из кэша ASR при смене состояний.
- Команды и поисковые запросы теперь исполняются строго по финальному кадру распознавания (
-
Оптимизация работы со Spotify Web API:
- Сериализация получения OAuth-токенов (
api.lock) исключает параллельные гонки запросов. - Добавлена корректная обработка заголовка
Retry-Afterпри получении HTTP 429 (Rate Limit).
- Сериализация получения OAuth-токенов (
-
100% подавление голоса Алисы и пауза нативного плеера:
- Сохранены нативный формат Quasar IPC Field 210 (
0x92 0x0d) и резервный Field 252. - Команда PAUSE (
PlaybackControlCapability) гарантированно ставит на паузу нативный плеер Станции. - Мгновенное подавление Алисы при первом касании кнопки (
EV_KEY value == 1).
- Сохранены нативный формат Quasar IPC Field 210 (
-
Полный комплект библиотек в релизном архиве:
- Архив
soloist-station-lite.tar.gzсодержит полный набор предсобранных бинарников (soloist,soloist-bridge,curl) и всех необходимых библиотекlib64/для мгновенной установки на чистую колонку.
- Архив
-
Покрытие тестами:
- 42 регрессионных теста для проверки сигналов (SIGHUP, SIGINT, SIGTERM), очередей запросов, дедупликации и восстановления после сбоев.
v1.0.9: Устранение голоса Алисы и поддержка нативного Quasar IPC
Что изменено в v1.0.9:
- Восстановлен нативный Quasar IPC Field 210 (
0x92 0x0d): Quasar на Станциях Лайт и Мини 2 использует поле 210 напрямую дляremoting(QuasarMessage), из-за чего оболочкаf252/f253игнорировалась демоном. Теперь отправляются оба формата (нативный и резервный), что гарантирует 100% отмену диалога. - Добавлена пауза нативного плеера (
PlaybackControlCapability): команда PAUSE отправляется в Quasar при голосовых запросах и нажатиях кнопок. - Мгновенное подавление при нажатии кнопки: подавление Алисы активируется в момент касания/нажатия (
EV_KEY value 1), а не только после отпускания. - Окно подавления расширено до 5000 мс: надёжно глушит отложенные ответы от облачного Мегамозга («нужна подписка»).
- Удержание сенсора (>700 мс): как и прежде, даёт возможность вызвать Алису намеренно.
v1.0.8: Исправление формата IPC Quasar (f252/f253) и устранение 4x повторов команд
Что нового в v1.0.8:
-
🎯 Исправлен формат IPC-сообщений Quasar (f252/f253):
В предыдущих версиях мост отправлял директивы с кодомfield 210напрямую во внешнем сообщении, из-за чего Quasar не распознавал пакет и молча отбрасывал его (Алиса продолжала говорить про подписку). В соответствии со спецификацией Quasar SharedMessage, вызов Remoting теперь упаковывается в поле 252 (0xe2 0x0f), а тип сообщения 210 передается в поле 253 (0xe8 0x0f 0xd2 0x01). Теперь Quasar гарантированно принимает директивыSTOP_CONVERSATION,STOP_TTSи мгновенно глушит Алису! -
⚡ Устранение 4-кратных повторов команд (Next, Stop, Search):
- Удален преждевременный сброс кеша дедупликации при переходе
alice_state == 0: отправка отмены Алисе сразу вызывала кратковременный переход в idle, сбрасывала кеш и приводила к повторному срабатыванию одного и того же запроса из очереди ASR. - Внедрен многоуровневый тайм-дебаунс: повтор точной фразы блокируется на 2.5 сек, повтор быстрых действий (Next/Pause) блокируется на 1.5 сек, а между запросами поиска установлен интервал 2.5 сек. Каждая голосовая команда теперь отрабатывает ровно 1 раз!
- Удален преждевременный сброс кеша дедупликации при переходе
v1.0.7: Подавление фразы о подписке на кнопке паузы + фикс Entware
Что нового в v1.0.7:
-
🤫 Подавление фразы о подписке при нажатии на паузу / play:
При аппаратном нажатии на кнопку/сенсор паузы Алиса больше не перебивает музыку фразой «Для прослушивания музыки нужна подписка Яндекс Плюс». Мостsoloist-bridgeтеперь активирует окно подавления на 4 секунды (trigger_alice_suppression) и отправляет расширенные директивыCANCEL_DIALOG,STOP_CONVERSATION,CANCEL_DIALOG_AND_CLEAR_QUEUEиSTOP_TTSпри любой попытке Алисы заговорить. -
👆 Мульти-мониторинг устройств ввода (Multi-device evdev):
Мост теперь слушает сразу все устройства ввода ядра (/dev/input/event0..event7), перехватывая аппаратные кнопки и сенсорные панели на всех моделях (Мини 1/2/3, Лайт 1/2, Станция 2, Миди). Добавлена поддержка всех медиа-кодов:KEY_PLAYPAUSE,KEY_PAUSE,KEY_STOP,KEY_STOPCD,KEY_PLAY,KEY_VOICECOMMAND,BTN_0. -
🛡️ Полная изоляция окружения от Entware (GLIBC compatibility):
Устранена ошибкаgrep: /opt/lib/ld-linux-aarch64.so.1: version GLIBC_2.35 not foundна колонках с установленным Entware.PATHиLD_LIBRARY_PATHтеперь строго изолированы: системные утилиты никогда не обращаются к бандлу glibc 2.35 Soloist, а Soloist получаетlib64адресно.
v1.0.6: Универсальная поддержка всех колонок Яндекс (Лайт 1/2, Мини 1/2/3, Станция 2, Миди)
Что нового в v1.0.6:
-
Универсальная поддержка всех Buildroot-колонок Яндекс (AArch64):
Пакет теперь официально поддерживает и протестирован для работы на всей линейке умных колонок Яндекса с 64-битным ядром Linux:- Станция Лайт (v1) (
yandexmicro) - Станция Лайт 2 (
plum) - Станция Мини 1 (
station-mini) - Станция Мини 2 (
station-mini2) - Станция Мини 3 & 3 Про (
bergamot,pickle) - Станция 2 (
station-midiв DT) - Станция Миди (
cucumber)
- Станция Лайт (v1) (
-
Динамическое автоопределение сенсоров ввода (
ioctl EVIOCGNAME):
Вместо фиксированного пути к сенсору (/dev/input/event1), мостsoloist-bridgeтеперь динамически сканирует все доступные устройства ввода ядра и автоматически подключается к аппаратному тач-сенсору конкретной модели (sar0_pad0,awinic_sar,midi_touch,adc_keypadи др.). Поддержаны все коды клавиш сенсорных панелей. -
Автоопределение модели и красивое имя в Spotify Connect:
install.shавтоматически считывает модель колонки из/proc/device-tree/compatibleи регистрирует устройство в Spotify Connect с его реальным названием (например, «Yandex Station Mini 2» или «Yandex Station 2»).
v1.0.5: Автоматическое переключение треков (Auto-Next Watchdog) и мгновенный Play/Pause
Что нового в v1.0.5:
- Автоматическое переключение треков (Auto-Next Watchdog) — исправление #4:
На прошивке Яндекс Станции Лайт библиотекаapulseне отправляет сигнал опустошения буфера (underflow callback) при достижении конца аудиопотока, из-за чего воспроизведение могло зависать на последних секундах (-0:02или-0:00) в состоянииbuffering.
Вsoloist-bridgeвнедрено прямое подключение к локальному WebSocket API плеера (ws://127.0.0.1:9090): мост непрерывно отслеживает позицию трека и при обнаружении зависания на конце воспроизведения автоматически и бесшовно инициирует переход к следующему треку очереди (skip_next). - Мгновенный отклик сенсорной кнопки Play/Pause:
Благодаря постоянному мониторингу статуса воспроизведения через WebSocket, нажатие на центральную сенсорную кнопку колонки теперь ставит плеер на паузу или возобновляет музыку моментально (0 мс задержки), без запуска внешних скриптов. - Повышена общая отзывчивость голосового управления:
Статус активности Spotify теперь обновляется в реальном времени напрямую из событий плеера.
v1.0.4: Исправление прерывания Алисы и ложной остановки треков
Что нового в v1.0.4:
- Устранено мгновенное прерывание распознавания речи Алисы:
В Quasar устаревшее полеrecognized_phraseсохраняло предыдущую фразу (например, «играй») между запросами. Из-за этого при активации Алисы мост мгновенно считывал старую команду и отменял диалог ещё до того, как пользователь успевал сказать слово. Теперь мост считывает живую речь строго из структурыRequestState(request_text). - Устранена ложная остановка трека при обращении к Алисе:
Убрана принудительная пауза при переходе Алисы в состояние прослушивания (alice_state == 1). Теперь трек не прерывается на полуслове, если вы просто обратились к Алисе или задали вопрос (например, о погоде или времени). Музыка останавливается только при явных командах «пауза», «стоп» или переключается при поиске трека. - Точное сопоставление команд поиска и управления:
Команда «играй» теперь проверяется по границам целого слова (str_has_word), исключая ложные срабатывания на фразы «сыграй ...». Все запросы с глаголами воспроизведения («включи», «сыграй», «поставь») дожидаются окончания речи пользователя (is_final == 1) и не перехватываются словами вроде «назад» или «дальше» в названии треков. - Удалён фоновый цикл подавления Алисы:
Убран 250 мс таймер спама отменой диалога, мешавший новым голосовым запросам после предыдущего действия.
v1.0.3 — Сенсорная кнопка Play/Pause, RAM Cache Guard и стабильность
Что нового в v1.0.3:
- Починена центральная сенсорная кнопка Play/Pause:
В ядре Linux чип тач-сенсора станции (aw9610x_sarна/dev/input/event1) регистрирует центральное касание с кодомKEY_VOICECOMMAND(0x246/ 582). Теперь мост слушает правильный код события, короткий тап чётко ставит трек на паузу и возобновляет воспроизведение. - Стабильное возобновление в
toggle.sh:
Добавлен 200 мс интервал после командыactivate, чтобы Spotify успевал подтвердить активность устройства перед запуском воспроизведения. - Устранено падение по Out of Memory (OOM):
На Станции Лайт всего 256 МБ RAM, а аудиопотоки кэшировались в/tmp(RAM-диск), что приводило к исчерпанию оперативной памяти и зависанию системы. Добавлен фоновый RAM Cache Guard, удерживающий кэш в пределах 20 МБ. - Устранён перегруз процессора ватчдогом:
Убран агрессивный цикл перезапуска Soloist при ожидании авторизации (logged in: no), Load Average снижен с 6.1 до нормальных ~1.3. - Включены улучшения из PR #3 (от GoGixdd):
Динамическая генерация Protobuf-фреймов отмены диалога Алисы, фильтрация умного дома по границам слов (больше не блокируются песни вроде «Брат» или «Молитва»), нормализация пробелов и поддержка апострофов в названиях треков без сбоевxargs.