Описание
yandex-station-speak — скилл для озвучки уведомлений на Яндекс Станции: передаёт текст колонке голосом Алисы через протокол Glagol, вежливая работа с текущим воспроизведением — ставит музыку на паузу, снижает громкость до комфортной, возвращает всё как было после фразы, подходит для сценариев «умного дома» — например, озвучить событие из автоматизации. Для владельцев Яндекс Станции, интегрирующих её в свой контур.
Что умеет:
— озвучивать текст голосом Алисы;
— ставить музыку на паузу и возвращать её;
— работать по протоколу Glagol;
— встраиваться в автоматизации.
Полная документация ниже — автоматически из репозитория realmagnum/yandex-station-speak (ветка main). Оригинальные материалы проекта распространяются на условиях его лицензии.
yandex-station-speak
Озвучка текста на колонку Яндекс Станция голосом Алисы через протокол Glagol (WSS :1961).
Полный звуковой цикл: пауза музыки → громкость 80% → фраза → возврат громкости → продолжение музыки.
Эволюция скилла rasperepodvipodvert/claude-skill-yandex-tts (MIT, автор Igor Filatov). Сохранено ~80% протокольной основы, добавлено ~20% — законченный аудио-цикл с прерыванием музыки и управлением громкостью.
Возможности
- Отправить фразу на колонку голосом Алисы.
- Прерывает музыку (пауза перед озвучкой) и возобновляет её после.
- Поднимает громкость до 80% на время озвучки, затем возвращает прежнюю.
- Если колонка молчала до озвучки — музыка не включается (умный детект
hasPause). - Текст ≤500 символов, русский, без кода/JSON/спецсимволов.
Установка
# скрипты
mkdir -p ~/.hermes/skills/smart-home/yandex-station-speak && cd $_
# положите сюда SKILL.md, speak.sh, scripts/tts_dialog.py, env.example
# зависимости: Python 3.10+
python3 --version # должно быть 3.10+
# конфиг
cp env.example .env
# заполните .env: MUSIC_TOKEN, DEVICE_ID, DEVICE_PLATFORM, STATION_IP
Получение MUSIC_TOKEN (важно!)
Рабочий токен даётся ТОЛЬКО через oauth.mobile.yandex.net/1/token
(см. раздел «Токены» ниже). Эндпоинт oauth.yandex.ru/token из оригинального
README даёт 403 USER_IS_NOT_AUTHORIZED_FOR_API.
Использование
Прямое подключение (колонка в той же LAN, что и рабочий хост)
~/.hermes/skills/smart-home/yandex-station-speak/speak.sh 'Текст'
Через ssh на сервер, где колонка доступна
ssh host "~/.hermes/skills/smart-home/yandex-station-speak/speak.sh 'Текст'"
Ручной вызов (полный контроль)
python3 scripts/tts_dialog.py --pause --volume 0.8 'Текст'
Флаги:
--pause— пауза музыки перед озвучкой + возобновление после (пауза 1с).--volume 0.8— громкость 80% на время озвучки, возврат после.- Без флагов — озвучить поверх (музыка приглушится, не прервётся).
⚠️ На macOS системный
python3может быть 3.9 (не подходит).speak.shсам
выбирает 3.10+ (python3.13/3.12/3.11/3.10 или Homebrew). Вручную — используйте
/opt/homebrew/bin/python3.13.
Проверка устройств
python3 scripts/tts_dialog.py --list-devices
Токены (Glagol / Quasar)
- Управление колонкой — Glagol WSS на
:1961, сообщения сconversationToken(короткоживущий, ~30с, кешируется 25с). - Список устройств / token — Quasar (
quasar.yandex.net/glagol/device_list,.../token). - MUSIC_TOKEN — получать через
oauth.mobile.yandex.net/1/token(mobile-эндпоинт даёт нужный scope).oauth.yandex.ru/token→ 403.
Структура
SKILL.md # (опционально) скилл-метаданные для Hermes/Claude
speak.sh # обёртка: полный цикл паузы/громкости, авто-выбор Python 3.10+
scripts/
tts_dialog.py # основной скрипт (Glagol WSS + все команды)
env.example # шаблон конфига (БЕЗ секретов)
install.sh # установщик на новый хост
Ключевые детали реализации (грабли)
- Пауза музыки =
sendText "пауза"(НЕ{"command":"stop"}— колонка отвечает close frame). aliceStateво время озвучки =NONE, неSPEAKING.- Перед возобновлением музыки ждать конца фразы (
wait_until_idle: 1.3с лаг + 2 стабильныхIDLE), иначе фраза обрывается и громкость падает. - Возобновлять музыку только если она играла (
playerState.hasPause), иначе «продолжить» стартует радио из простоя. - Возврат громкости —
get_volume()затемcmd_set_volume(prev). - Не придумывать про «0.8» — в
--volume <число>значение не должно попадать в текст (обрабатываетсяskip_next).
Лицензия
MIT. Основа: rasperepodvipodvert/claude-skill-yandex-tts (c) Igor Filatov.
Модификации и полный аудио-цикл — этот репозиторий.
Протокол Glagol недокументирован и может измениться прошивкой Яндекса в любой момент.