Skip to content

Releases: Horohi/soloist-station-lite

v1.2.0: Светомузыка Nothing Phone, CLI soloist, поддержка YAM v2 и автоочистка кэша

Choose a tag to compare

@Horohi Horohi released this 27 Oct 17:10

Release v1.2.0: Светомузыка Nothing Phone, консольный CLI, поддержка YAM v2 и оптимизация диска

Большое обновление плеера Spotify Soloist для умных колонок Яндекс (Станция Лайт 1, Лайт 2, Мини 2, Миди).

🌟 Что нового:

  1. 💡 Светомузыка и эквалайзер кольца LED (в стиле Nothing Phone):

    • Прямой анализ реального звука через разделяемую память ALSA PCM (dmix shared memory) без нагрузки на процессор.
    • Разделение частот в реальном времени: низкие (бас), средние (вокал/мелодия) и высокие (хэты/тарелки).
    • Нелинейная квадратичная кривая чувствительности ($x^2$) и динамический шумовой порог: при тихом звуке светодиоды не мерцают, а на битах и дропах ярко вспыхивают.
    • Мгновенная атака (0 мс) и плавный спад для эстетики глифов Nothing Phone.
    • Автоматическая поддержка всех ревизий колонок (3 зоны на Лайт 1/2, 6 зон на Мини 2, 24 зоны на Миди).
    • По умолчанию стильный чистый белый цвет, также доступны Rainbow, Cyan и другие через конфиг или CLI.
    • 100% бесконфликтные голосовые команды: из парсера полностью удалены слова «включи» и «выключи», поэтому команды умного дома («включи/выключи свет») работают штатно без перехвата.
      • Включение: «Алиса, зажигай», «Алиса, зажги», «Алиса, покажи эквалайзер», «Алиса, режим дискотеки», «Алиса, светомузыка», «Алиса, дискотека».
      • Выключение: «Алиса, стоп дискотека», «Алиса, останови дискотеку», «Алиса, стоп эквалайзер», «Алиса, погаси подсветку», «Алиса, хватит светить».
  2. ⚡ Удобный консольный 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.
  3. 📦 Полная поддержка спецификации YAM v2:

    • Добавлен манифест yam.yaml для нативной установки пакета через менеджер YAM.
    • Поддержка относительных путей, переменных окружения YAM ($YAM_PKG, $YAM_VAR, $YAM_RUN) и изоляции сервисов.
  4. 🧹 Мгновенная очистка кэша и защита памяти Flash:

    • Устранена ошибка OS error: 2 (delayed wipe) — каталог Storage перенесён в оперативную память (tmpfs), полностью предотвращая износ чипа NAND-памяти колонки.
    • Кэш треков очищается сразу после переключения и остановки воспроизведения, освобождая память.
    • Включён 64 МБ zram-свап и отключён избыточный отладочный лог демона (-10 МБ в RAM), что гарантирует бесперебойную работу звонков Алисы (calld).

v1.1.1: Тюнинг аллокатора памяти glibc (-55 МБ RAM)

Choose a tag to compare

@Horohi Horohi released this 27 Oct 14:34

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: Жизненный цикл запросов, отмена устаревших команд и стабильное управление

Choose a tag to compare

@Horohi Horohi released this 27 Oct 09:23

Release v1.1.0: Жизненный цикл запросов, отмена устаревших команд и стабильное управление

Этот релиз объединяет глубокую архитектурную переработку управления запросами и улучшенную обработку распознавания речи, а также полное сохранение нативного подавления голоса Алисы через Quasar IPC (Field 210).


🌟 Особая благодарность контрибьюторам:

  • @noteburgservice-eng — за огромную работу в PR #6: проектирование жизненного цикла команд (request_state.sh, control.sh), отмену устаревших запросов поиска, строгий шлюз финального распознавания (voice-request.h), дедупликацию и великолепный набор автоматических тестов.
  • Calve (Telegram) — за подробные логи, активное тестирование на Яндекс Станции Мини 2 и обнаружение нюансов с окружением PATH/библиотеками и повторными срабатываниями.

🚀 Ключевые изменения и улучшения:

  1. Жизненный цикл запросов и отмена устаревших команд:

    • Введены счетчики поколений (generation) и сериализация через flock.
    • Если во время медленного поиска песни в Spotify пользователь нажимает «Пауза» или переключает трек, фоновый поиск автоматически аннулируется и не перебивает новое действие пользователя.
  2. Строгий шлюз финального распознавания (Final-only Voice Gate):

    • Команды и поисковые запросы теперь исполняются строго по финальному кадру распознавания (is_final == 1), исключая ложные срабатывания на промежуточных фразах (например, слово «стоп» в названиях песен).
    • Добавлен кольцевой буфер дедупликации на 16 ID запросов, предотвращающий повторный запуск старых фраз из кэша ASR при смене состояний.
  3. Оптимизация работы со Spotify Web API:

    • Сериализация получения OAuth-токенов (api.lock) исключает параллельные гонки запросов.
    • Добавлена корректная обработка заголовка Retry-After при получении HTTP 429 (Rate Limit).
  4. 100% подавление голоса Алисы и пауза нативного плеера:

    • Сохранены нативный формат Quasar IPC Field 210 (0x92 0x0d) и резервный Field 252.
    • Команда PAUSE (PlaybackControlCapability) гарантированно ставит на паузу нативный плеер Станции.
    • Мгновенное подавление Алисы при первом касании кнопки (EV_KEY value == 1).
  5. Полный комплект библиотек в релизном архиве:

    • Архив soloist-station-lite.tar.gz содержит полный набор предсобранных бинарников (soloist, soloist-bridge, curl) и всех необходимых библиотек lib64/ для мгновенной установки на чистую колонку.
  6. Покрытие тестами:

    • 42 регрессионных теста для проверки сигналов (SIGHUP, SIGINT, SIGTERM), очередей запросов, дедупликации и восстановления после сбоев.

v1.0.9: Устранение голоса Алисы и поддержка нативного Quasar IPC

Choose a tag to compare

@Horohi Horohi released this 27 Oct 08:26

Что изменено в 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 повторов команд

Choose a tag to compare

@Horohi Horohi released this 26 Oct 23:00

Что нового в 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

Choose a tag to compare

@Horohi Horohi released this 26 Oct 22:50

Что нового в 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, Миди)

Choose a tag to compare

@Horohi Horohi released this 26 Oct 21:37

Что нового в 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)
  • Динамическое автоопределение сенсоров ввода (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

Choose a tag to compare

@Horohi Horohi released this 26 Oct 21:14

Что нового в 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: Исправление прерывания Алисы и ложной остановки треков

Choose a tag to compare

@Horohi Horohi released this 26 Oct 14:15

Что нового в 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 и стабильность

Choose a tag to compare

@Horohi Horohi released this 26 Oct 13:35

Что нового в 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.