Перейти к содержанию

Своя LLM вместо Алисы

Частично реализовано

Полная замена облака Алисы своим сервером уже работает: см. quasard ниже. Гибридного варианта пока нет. Это когда общие вопросы уходят в свою модель, а умный дом, таймеры и голос Алисы остаются облачными. Если вы делали такой прокси, дополните страницу.

Цель: отвечать на общие вопросы своей моделью (ChatGPT, Claude, Ollama), сохранив умный дом, музыку, таймеры и голос Алисы.

Что известно

  • Голосовые запросы колонка отправляет не обычным HTTP-запросом к backendUrl, а по отдельному соединению с «uniproxy». Его адрес задаётся ключами uniProxyUrl и uniProxyQuicUrl в /system/vendor/quasar/quasar.cfg (ключи есть в прошивке Лайт 3.21).
  • quasar.cfg лежит на rootfs, его можно править после mount -o remount,rw /.

Как устроен голосовой тракт

Разбор потока (локальные спотеры → uniproxy, protobuf Alice API, события AsrResult/ AliceResponse/TtsSpeak, TTS) есть на странице Голосовой тракт Алисы. Там же, в конце, написано, что это значит для своего ASR/LLM.

quasard

От автора — @amirilivice

Репозиторий: amirilivice/quasard. Неофициальный проект, с Яндексом не связан. Только для своих устройств и в исследовательских целях.

Готовый бэкенд, который полностью заменяет облако Алисы. Колонка думает, что говорит с Яндексом, но активация, голосовой цикл и музыка идут через ваш сервер, наружу станция больше не ходит. Название — от внутреннего имени бэкенда умных устройств Яндекса (quasar).

Как устроено

Яндекс Станция ──DNS доменов Яндекса → ваш сервер──> quasard
                                                      │
       HTTP (oauth / quasar / метрики)  ◄────────────┤  мок активации и конфигурации колонки
                                                      │
       WebSocket uniproxy (/uni.ws)     ◄────────────┘  голосовой цикл:
         микрофон Ogg/Opus → Silero VAD (конец фразы) → GigaAM (речь в текст)
         → LLM (стриминг ответа по фразам) → F5-TTS (голос) → Ogg/Opus на колонку
  • Активация без облака. Сервер сам отвечает на oauth, register, get_sync_info, device_list и метрики. Обновления прошивки заблокированы, чтобы колонка не обновилась на версию, которая всё сломает.
  • Оба протокола uniproxy. На прошивках ~1.56 это JSON, на 3.x бинарный protobuf AAPI. Формат сервер определяет по первому кадру. Схемы для 3.x восстановлены из прошивки и лежат в alice_server/aliceapi.desc.
  • Распознавание: GigaAM v3 (v3_e2e_rnnt, сразу с пунктуацией) плюс Silero VAD для конца фразы. Занимает около 1 ГБ видеопамяти.
  • Ответы: любой OpenAI-совместимый API (Groq, Ollama, vLLM, LM Studio…), с историей диалога. Характер задаётся в файле system_prompt.txt (создаётся рядом с конфигом), он перечитывается на лету.
  • Стриминг по фразам. Ответ LLM режется по знакам препинания. Первая готовая фраза сразу озвучивается и уходит на колонку, пока модель дописывает остальное, поэтому станция начинает говорить почти без паузы.
  • Голос: клон по 10–15-секундному образцу на F5-TTS (русские веса ESpeech, ~3.4 ГБ видеопамяти). Запасной вариант без GPU — Edge TTS.
  • Музыка из Яндекс Музыки: «Моя волна», поиск по исполнителю/треку/альбому, «дальше», «назад», лайк/дизлайк, пауза, «что сейчас играет».
  • Быстрые команды без LLM: громкость, «стоп», bluetooth, сброс диалога.

Чем отличается от цели этой страницы

quasard не проксирует запросы в облако Яндекса, а заменяет его целиком. Поэтому:

  • голос свой (клон или Edge TTS), а не Алисы;
  • облачного умного дома и сценариев Яндекса нет: из «навыков» есть музыка и быстрые команды;
  • зато всё работает локально, без аккаунта в облаке Алисы и без интернета (кроме LLM-API и музыки, если они облачные).

Гибрид «своя LLM для болтовни + облако для остального» на базе quasard сделать можно: сервер уже разбирает оба протокола uniproxy и видит распознанный текст. Не хватает только проксирования остальных запросов в настоящий uniproxy.

Что понадобится

  • Windows или Linux, видеокарта NVIDIA (проверялось на RTX 5080, 16 ГБ); Python 3.12, uv, ffmpeg.
  • Роутер, на котором можно увести домены Яндекса на свой ПК (у автора — OpenWrt), принудительный DNS и сертификат, которому доверяет колонка. Подробно, с примерами для OpenWRT, в docs/TRAFFIC_CAPTURE.md.
  • Ключ к LLM-API (по умолчанию бесплатный Groq) или локальная модель.

Быстрый старт из клона репозитория (подробнее — в README, там же start.ps1 для Windows):

uv venv -p 3.12 .venv
uv pip install -p .venv torch torchaudio --index-url https://download.pytorch.org/whl/cu128
uv pip install -p .venv -r requirements.txt
copy config.example.toml config.toml
.venv\Scripts\python -m alice_server
uv venv -p 3.12 .venv
uv pip install -p .venv torch torchaudio --index-url https://download.pytorch.org/whl/cu128
uv pip install -p .venv -r requirements.txt
cp config.example.toml config.toml
.venv/bin/python -m alice_server

Сервер слушает порты 80 (HTTP) и 443 (HTTPS) — на них DNS роутера и уводит домены Яндекса.

Проверить без колонки можно имитаторами: tools/activation_sim.py (активация), tools/station_sim.py --text "Привет" (диалог), tools/fake_llm.py (LLM без ключа).

Ограничения

  • Прямые ссылки Яндекс Музыки отдаются через редирект. Сервер проходит его за колонку, потому что плеер старой прошивки редиректы не любит.
  • Скорость и качество голоса зависят от GPU: на слабой карте первая фраза приходит с задержкой ~1–2 с.
  • Бесплатные тарифы LLM-API ограничены по числу запросов в день.

Что нужно выяснить

  • Протокол uniproxy: какие сообщения идут в обе стороны и как отличить «болталку» от команд умного дома. (Основное описано в Голосовом тракте. Рабочий разбор JSON и protobuf-кадров AAPI есть в quasard: alice_server/uniproxy.py, alice_server/aliceapi.desc.)
  • Как подставить свой текст в ответ, чтобы его озвучила Алиса. (Локально — через API glagol, как интеграция YandexStation для Home Assistant, см. Сеть → glagol. При полной замене бэкенда, как в quasard, озвучивает уже свой TTS, не голос Алисы.)
  • Как прошивка проверяет сервер (TLS, сертификаты) при подмене адреса. (Пиннинга нет, см. Подводные камни; работает и ws:// без TLS.)
  • Как сделать гибрид: свою LLM для общих вопросов, а умный дом, таймеры и голос Алисы оставить облачными, проксируя остальное в настоящий uniproxy.