Хочу поделиться опытом придания Yandex Алисе (внутри умных колонок поддерживающих TTS API) своевольности. Про локальный API колонок уже писали на хабре тут https://habr.com/ru/post/508106/
Идея заключается в том чтобы Алиса реагировала на присутствующих людей. Для этого их необходимо идентифицировать, например с помощью распознавания лиц. Так же Алиса в случайное время будет выдавать некоторую «отсебятину». Я спользовал самый простой (на мой взгляд) вариант – тренировка модели в Google Teachable Machine. Использован модуль для Node-Red который позволяет посылать команды, управлять воспроизведением и отправлять на яндекс станцию текст который она произнесет.
Инструменты:
- Docker
- Node-Red
- Python3
- OpenCV
- Tensorflow Keras
- Google Teachable Machine
- PostgreSQL
- MQTT
-
Скрипт распознает лица и отправляет процент совпадения для каждой сущности модели в MQTT брокер, а так же сохраняет снимок в директорию из файла конфигурации
-
Node-Red получает сообщения из MQTT брокера и отправляет Алисе команду что либо сказать в зависимости от времени суток и того как давно она “видела” этого человека. При этом фразы для Алисы, а так же время когда человек последний раз засветился на камеру хранятся в БД PostgreSQL.
От том как создать модель с помощью Google Teachable Machine можно почитать тут
Linux:
pip3 install opencv-python tensorflow paho
Возможно портебуется установка дополнительных пакетов
sudo apt-get install git python3-dev
Загружаем приложение
git clone https://github.com/guinmoon/yandex_alice_has_fun
cd yandex_alice_has_fun
keras_model.h5
и labels.txt
меняем на свои
В файле .env меняем путь на расположение yandex_alice_has_fun
docker-compose up
Если Postgers, Mosquitto и Node-Red запустились без ошибок то
docker-compose up -d
python3 alice_has_fun.py
При первом запуске в Node-Red необходимо установить дополнительные модули node-red-contrib-postgresql, node-red-contrib-yandex-station-management, node-red-dashboard
. Сделать это проще всего через Настройки -> Управление палитрой. Должно получиться так:
После этого необходимо настроить блок My Yandex Max
в нем необходимо авторизоваться. Если у вас настроена двухфакторная авторизация то пароль для получения токена необходимо вводить из приложения Яндекс.Ключ.
Настройки alice_has_fun.py хранятся в файле config.json:
{
"mqtt_pub": false,
"show_camera": false,
"input_source": 0,
"frame_recognition_rate": 4,
"publish_min_dalay": 1,
"camera_w": 1080,
"camera_h": 720,
"mqtt_broker": "127.0.0.1",
"mqtt_port": 11883,
"save_on_detect": true,
"draw_rect": true,
"min_predict_threshold": 65
}
Параметр | Назначение |
---|---|
mqtt_pub | Елси True то рзультаты не публикуются в MQTT брокер |
show_camera | Елси True то с помощью cv2.imshow отображается видео из источника |
input_source | Число (0 это первая веб камера), адрес потока ("rtsp://192.168.1.86:8554/unicast") или расположение видео файла ("raw/IMG_2404.MOV") |
frame_recognition_rate | Частота распознавания кадров в секунду |
publish_min_dalay | Задержка перед публикацией, публикуются средние значения из распознаных кадров |
camera_w | Ширина видео для устройств поддерживающих задание разрешения видео |
camera_h | Высота видео для устройств поддерживающих задание разрешения видео |
mqtt_broker | Адрес MQTT брокера |
mqtt_port | Порт MQTT брокера |
save_on_detect | Помимо публикации в брокер также будет сохранен кадр в директорию on_detect |
draw_rect | выделять лица |
min_predict_threshold | минимальный процент совпадения для публикации |
Для корректного запуска docker-copmpose при старте системы лучше создать сервис, чтобы убедиться что необходимые службы запущены
sudo nano /etc/systemd/system/alice-docker-compose.service
[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service
[Service]
WorkingDirectory=<Путь к рабочей директории alice has fun>
ExecStart=/usr/local/bin/docker-compose up
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0
Restart=on-failure
StartLimitIntervalSec=60
StartLimitBurst=3
[Install]
WantedBy=multi-user.target
sudo systemctl enable alice-docker-compose
Скрипт alice_has_fun.py можно запускать отдельно, например через crontab, скриптом вроде этого
#!/bin/bash
cd <Путь к рабочей директории alice has fun>
if screen -list | grep -q "alice_live"; then
/usr/bin/screen -S alice_live -X quit
fi
/usr/bin/screen -S alice_live -d -m python3 alice_has_fun.py
Отдельный запуск позволяет на время остановить распознавание, снизив нагрузку на железо, но оставляя возможность дорабатывать систему. Для отсановки необходимо завершить screen сессию
if screen -list | grep -q "alice_live"; then
/usr/bin/screen -S alice_live -X quit
fi