Клиент Mini 2
Клиент собирается в статический ARM64-бинарник для ядра Mini 2. Для захвата он запускает штатный arecord и небольшой armhf-процесс, который вызывает VQE из прошивки. Для вывода используются PulseAudio и штатный aplay в ручных тестах.
cd station
go test ./...
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -trimpath -ldflags='-s -w' -o alice-station .
Собери процесс VQE на машине с Zig из корня репозитория.
zig cc -target arm-linux-gnueabihf.2.28 -mcpu=cortex_a53 -O2 -s \
-Wall -Wextra -Werror station/vqe/capture.c -ldl -o alice-vqe
Помести alice-vqe и station/vqe-capture.sh с правами на запуск в /data/opt/alice-backend/. Обёртка проверяет SHA-256 штатной libyandex_evil.so перед загрузкой её закрытого ABI. Сверяй ABI заново после смены прошивки. Системные файлы не меняются. Канал plug:default даёт четыре микрофона и два синхронных канала обратной связи динамика при 48 кГц. Пресет yandexmini_2 возвращает vqe_0 в mono PCM16 при 16 кГц после эхоподавления и шумоподавления. Ручной запуск без -vqe-helper берёт один сырой микрофон для диагностики.
На тестовой колонке файлы лежат в /data/opt/alice-backend/. Помести туда бинарник, with-mic.sh и отдельный DEVICE_TOKEN в файле device-token с правами 0600. Для WSS нужны доступ в сеть, корректное время и доверенный набор сертификатов.
Ручной тест с микрофоном
На этой Mini 2 hw:0,1 обычно занят штатным platformd. Скрипт with-mic.sh освобождает микрофон на время теста, даёт не больше 90 секунд и возвращает штатный процесс после выхода. Для остановки нажми Ctrl+C в SSH-сеансе с терминалом.
cd /data/opt/alice-backend
./with-mic.sh ptt -voice-threshold 55
Нажми Enter, дождись сине-фиолетового кольца, затем скажи команду. Настройки -voice-threshold, -silence и -max регулируют порог голоса, паузу в конце и предел длительности. Значение 55 проверено на этой колонке вблизи микрофона.
Локальная активация по фразе
Автозапуск использует встроенный в прошивку Mini 2 детектор «Алиса» из /system/vendor/quasar/spotter_models/activation/alisa. Он получает обработанный vqe_0 и сырой канал выбранного микрофона. Сине-фиолетовое кольцо загорается после локальной активации. Клиент сохраняет начало команды и при произнесении без паузы.
Для ручного сравнения доступна русская модель microWakeWord «Алиса» через флаг -wake-model.
Собери alice-wake-helper командой cargo build --locked --release --target aarch64-unknown-linux-gnu из каталога wake-helper с настроенным ARM64 GNU toolchain. Положи helper и wake-helper.sh в /data/opt/alice-backend. Там же нужен файл alisa.tflite, скачанный из указанной версии модели. Его SHA-256 — 481cf6c180d3b5cbebfa6af47b4f9544c631d05b73cecf51fb8363ab7d143f38. Helper использует приватный ARM64 runtime из каталога spotify/, включая libstdc++.so.6.
Режим записи индивидуальных шаблонов остаётся для ручных экспериментов.
./with-mic.sh enroll -samples 4 -voice-threshold 55
./with-mic.sh wake -voice-threshold 55 -once
При обучении нажимай Enter перед каждым образцом и после включения кольца произноси «Алиса», затем сделай паузу. Клиент сохраняет спектральные признаки в wake-templates.json с правами 0600. На тестовой колонке эти образцы уже записаны. В режиме wake произнеси «Алиса», дождись сине-фиолетового кольца и скажи команду. Флаг -once завершает сеанс после первого успешного ответа. Без флага можно провести несколько ходов за один пробный запуск.
При ручном запуске с шаблонами клиент сопоставляет целый сегмент речи методом DTW и отбрасывает слишком короткие или длинные сегменты. Из-за этого после «Алиса» требуется короткая пауза. Оценки пропусков и ложных срабатываний на расстоянии, под музыку и у разных людей пока нет. Штатный VQE доступен в этом режиме через тот же флаг -vqe-helper.
До локального срабатывания соединение с сервером не открывается. Кольцевой буфер в RAM держит последние 800 мс. Для слитной команды начало потока может включать «Алиса», и сервер убирает это слово с начала распознанного текста. После паузы передаётся только сама команда. Аудио в файл не записывается. Проверенное состояние кнопки mute на этой Mini 2 читается из /sys/class/gpio/gpio414/value, где 1 означает разрешённый микрофон. В mute клиент отбрасывает вход, сбрасывает состояние детектора и прерывает текущую передачу. При недоступном GPIO применяется то же поведение. Состояние можно читать из другого узла через -mute-gpio, если на конкретной ревизии этот сигнал расположен иначе.
Проверка из файла
export DEVICE_TOKEN="$(cat device-token)"
./alice-station -mode file -input /path/to/input.pcm
Этот режим отправляет тестовый файл (mono PCM16LE, 16 кГц, до 30 секунд) и выводит ответ через ALSA (mono PCM16LE, 24 кГц). Микрофон при этом не открывается.
Автозапуск и музыка
Сенсорные кнопки + и − меняют общую громкость музыки и ответов на 10 процентных пунктов. Кольцо показывает уровень от зелёного к красному, а короткий тон звучит с выбранной громкостью. Голосовая команда установки уровня подсвечивает кольцо без звука. Значение сохраняется между запусками. На время запроса и ответа приглушается только музыкальный sink на 7,5 дБ, затем его уровень восстанавливается.
Загрузочный скрипт S99alice запускает наш клиент, а S98alice-music поднимает Soloist и PulseAudio. Штатный S99quasar пропускает запуск, пока существует /data/opt/alice-backend/stock-disabled. Оригинал сохранён как S99quasar.original рядом с клиентом.
Для подготовки зависимостей Spotify запусти скрипт сборки на x86-64 Linux с Docker. Архив содержит проверяемый список файлов и версий. Распаковывай его потоком в /data/opt/alice-backend/spotify, поскольку BusyBox tar на Mini 2 принимает несжатый поток. В spotify/etc/alice.pa установи конфигурацию pulse.conf, а pulse-control.sh скопируй в spotify/pactl. Бинарник music-control собирается для Linux ARM64 из music, ключ Soloist хранится в файле soloist-key с правами 0600. Сессия Spotify Connect в soloist-data/, кэш ограничен 32 МиБ в tmpfs.
Чтобы вернуть штатную Алису, войди по SSH под root и выполни:
cd /data/opt/alice-backend
mount -o remount,rw /
./install-init.sh restore
mount -o remount,ro /
/system/vendor/quasar/q start
Логи текущего запуска находятся в /tmp/alice-station.log, /tmp/alice-pulse.log и /tmp/alice-soloist.log.
Звук с Windows по локальной сети
Для пробного запуска собери приёмник на Mini 2 тем же Go toolchain, что и основной клиент. Из каталога station выполни:
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -trimpath -ldflags='-s -w' -o scream-receiver ./cmd/scream-receiver
Скопируй бинарник на станцию в /data/opt/alice-backend и запусти из этого каталога. Укажи адрес станции и адрес Windows. Приёмник работает с запущенным PulseAudio, принимает до восьми каналов PCM в пакетах Scream и сводит их в PulseAudio и воспроизводит их через вход music. На этот вход действуют Room EQ и приглушение на время разговора.
./scream-receiver -listen 192.168.1.135:4010 -source 192.168.1.170
На Windows распакуй Scream Sender. Запусти из папки с EXE и включи звук на обычном системном выходе. Программа передаёт копию звука этого выхода.
.\ScreamSender.exe 192.168.1.135 4010
Приёмник пишет в журнал формат при первом пакете и освобождает вход PulseAudio через две секунды без звука. Базовый запрос к буферу PulseAudio составляет 30 мс. Полная задержка также зависит от Windows, сети и буфера аппаратного выхода. Остановить приёмник в терминале можно через Ctrl+C.
Голосовое управление с Windows
Команды «Алиса, включи звук с компьютера» и «Алиса, выключи звук с компьютера» управляют отправителем. Агент работает в сеансе пользователя Windows и запускает Scream Sender по команде. При выходе из агента или потере связи со станцией отправитель завершается.
На Mini 2 положи в /data/opt/alice-backend файл pc-audio-receiver.conf с адресом приёмника 192.168.1.135:4010 на первой строке и IP компьютера 192.168.1.170 на второй. Соседний файл pc-audio.json содержит поля listen (адрес станции с TCP-портом, например 192.168.1.135:4011), peer (IP компьютера) и token (случайные 32 байта в hex). Поставь файлам права 0600 и перезапусти S99alice.
Из каталога station собери агент командой:
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -trimpath -ldflags='-s -w -H windowsgui' -o AlicePCAudio.exe ./cmd/pc-audio-agent
Положи рядом с EXE файл ScreamSender.exe и agent.json с полями station (TCP-адрес из listen), port (UDP-порт приёмника) и token (тот же ключ). Запусти AlicePCAudio.exe из сеанса Windows. Для автозапуска добавь ярлык в shell:startup. Журнал агента находится рядом с EXE в файле agent.log. Если отправитель ранее запускался вручную, закрой этот экземпляр перед первым запуском агента.