118 lines
14 KiB
Markdown
118 lines
14 KiB
Markdown
# Клиент Mini 2
|
||
|
||
Клиент собирается в статический ARM64-бинарник для ядра Mini 2. Для захвата он запускает штатный `arecord` и небольшой armhf-процесс, который вызывает VQE из прошивки. Для вывода используются PulseAudio и штатный `aplay` в ручных тестах.
|
||
|
||
```sh
|
||
cd station
|
||
go test ./...
|
||
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -trimpath -ldflags='-s -w' -o alice-station .
|
||
```
|
||
|
||
Собери процесс VQE на машине с Zig из корня репозитория.
|
||
|
||
```sh
|
||
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-сеансе с терминалом.
|
||
|
||
```sh
|
||
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 «Алиса»](https://github.com/olegchumakov/microwakeword-models/tree/7a3490e3c5de3ec21442abcc7a44c74fd979917a/alisa) через флаг `-wake-model`.
|
||
|
||
Собери `alice-wake-helper` командой `cargo build --locked --release --target aarch64-unknown-linux-gnu` из каталога [wake-helper](../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`.
|
||
|
||
Режим записи индивидуальных шаблонов остаётся для ручных экспериментов.
|
||
|
||
```sh
|
||
./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`, если на конкретной ревизии этот сигнал расположен иначе.
|
||
|
||
## Проверка из файла
|
||
|
||
```sh
|
||
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 запусти [скрипт сборки](../scripts/build-spotify-runtime.sh) на x86-64 Linux с Docker. Архив содержит проверяемый список файлов и версий. Распаковывай его потоком в `/data/opt/alice-backend/spotify`, поскольку BusyBox tar на Mini 2 принимает несжатый поток. В `spotify/etc/alice.pa` установи конфигурацию [pulse.conf](pulse.conf), а `pulse-control.sh` скопируй в `spotify/pactl`. Бинарник `music-control` собирается для Linux ARM64 из [music](../music), ключ Soloist хранится в файле `soloist-key` с правами `0600`. Сессия Spotify Connect в `soloist-data/`, кэш ограничен 32 МиБ в tmpfs.
|
||
|
||
Чтобы вернуть штатную Алису, войди по SSH под root и выполни:
|
||
|
||
```sh
|
||
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` выполни:
|
||
|
||
```sh
|
||
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 и приглушение на время разговора.
|
||
|
||
```sh
|
||
./scream-receiver -listen 192.168.1.135:4010 -source 192.168.1.170
|
||
```
|
||
|
||
На Windows распакуй [Scream Sender](https://github.com/netham45/windows-scream-sender/releases/tag/7508fb7). Запусти из папки с EXE и включи звук на обычном системном выходе. Программа передаёт копию звука этого выхода.
|
||
|
||
```powershell
|
||
.\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` собери агент командой:
|
||
|
||
```sh
|
||
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`. Если отправитель ранее запускался вручную, закрой этот экземпляр перед первым запуском агента.
|