6.2 KiB
Клиент Mini 2
Клиент собирается в статический ARM64-бинарник для ядра Mini 2. Для захвата и вывода он запускает штатные arecord и aplay, которые на этой прошивке собраны для armhf.
cd station
go test ./...
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -trimpath -ldflags='-s -w' -o alice-station .
На тестовой колонке файлы лежат в /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 проверено на этой колонке вблизи микрофона.
Локальная активация по фразе
./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 и отбрасывает слишком короткие или длинные сегменты. Из-за этого после «Алиса» требуется короткая пауза. Оценки пропусков и ложных срабатываний на расстоянии, под музыку и у разных людей пока нет. Клиент использует один канал микрофона и простой даунсемплинг, AEC и прерывание речи в ответе отсутствуют.
До локального срабатывания соединение с сервером не открывается. После сигнала начало команды буферизуется в RAM, а слово активации остаётся на колонке. Проверенное состояние кнопки 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 кГц). Микрофон при этом не открывается.
Автозапуск и музыка
Загрузочный скрипт 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.