Как собрать умную колонку на Orange Pi Zero с Google Assistant SDK

Превью-релиз Google Assistant SDK , работающего с Raspberry Pi 3 и другими платами ARMv7, был выпущен в мае. Вскоре после этого AIY Projects Voice Kit предлагался бесплатно с журналом Raspberry Pi Magazine как готовый комплект умной колонки для RPi 3. Решено было протестировать решение на платах FriendlyELEC или Shenzhen Xunlong с процессорами Allwinner, поскольку требовались лишь аудиовход, аудиовыход и интернет-соединение. В начале месяца был обнаружен Orange Pi Zero Set 6 Kit , содержащий всё необходимое: плату Orange Pi Zero на ARM Linux, плату расширения со встроенным микрофоном и аудиовыходом, а также компактный корпус для сборки.

Распаковка и сборка комплекта Orange Pi Zero Set 6 Kit

Комплект был предоставлен Shenzhen Xunlong для тестирования.

В поставку входят две упаковки Orange Pi, пластиковый корпус, пакет с винтами и резиновыми прокладками.

Одна упаковка содержит плату Orange Pi Zero на четырёхъядерном процессоре Allwinner H2+ с 512 МБ ОЗУ, разъёмом micro USB для питания, 10/100M Ethernet, USB-портом, антенной Wi-Fi и разъёмами расширения на верхней стороне…

Увеличить

… и слотом для карты micro SD на нижней стороне, который будет использоваться для загрузки ОС.

Вторая упаковка включает плату расширения Orange Pi Zero Interface v1.1 с двумя дополнительными USB-портами, ИК-приёмником, разъёмом 3.5 мм для аудио и встроенным микрофоном (справа вверху).

Увеличить

Следующий шаг — подключение платы расширения к Orange Pi Zero, сгибая антенну Wi-Fi между платами…

Увеличить

… после чего плата устанавливается снизу корпуса, крышка фиксируется 4 винтами, а снизу добавляются 4 резиновые ножки.

Увеличить

Установка Ubuntu на Orange Pi Zero и настройка сети, аудиовхода и аудиовыхода

Google Assistant SDK требует ОС Ubuntu или Debian, поэтому была загружена legacy-версия серверной Ubuntu с сайта Armbian , поскольку основная версия не поддерживает модуль Wi-Fi XR819. Затем Armbian_5.30_Orangepizero_Ubuntu_xenial_default_3.4.113.7z был распакован, а образ Armbian_5.30_Orangepizero_Ubuntu_xenial_default_3.4.113.img записан на карту micro SD с помощью Etcher на основном компьютере.

После завершения загрузки карта microSD была установлена в плату Orange Pi Zero, колонки подключены к аудиоразъему 3.5 мм, а для питания использовано USB-зарядное устройство 5В/2A.

Нажмите для увеличения

На фото выше виден дополнительный USB-адаптер, но о нём поговорим позже.Для тестирования Google Assistant будет использоваться Wi-Fi, но для упрощения первичной настройки подключен Ethernet-кабель. При отсутствии Ethernet можно подключить плату через USB-TTL адаптер для доступа к последовательной консоли.

После определения IP-адреса платы через роутер выполнено подключение по SSH с использованием root (пароль: 1234):

ssh root@192.168.0.113
root@192.168.0.113's password: 
You are required to change your password immediately (root enforced)
 ___ ____ _ _____ 
 / _ \ _ __ __ _ _ __ __ _ ___ | _ \(_) |__ /___ _ __ ___ 
| | | | '__/ _` | '_ \ / _` |/ _ \ | |_) | | / // _ \ '__/ _ \ 
| |_| | | | (_| | | | | (_| | __/ | __/| | / /| __/ | | (_) |
 \___/|_| \__,_|_| |_|\__, |\___| |_| |_| /____\___|_| \___/ 
 |___/

Welcome to ARMBIAN 5.30 stable Ubuntu 16.04.2 LTS 3.4.113-sun8i 
System load: 0.21 0.06 0.06 Up time: 1:08 hour 
Memory usage: 5 % of 494MB IP: 192.168.0.113
CPU temp: 79°C 
Usage of /: 81% of 1.4G

[ General system configuration: armbian-config ]
Last login: Sat Jul 29 04:56:32 2017 from 192.168.0.104
Changing password for root.
(current) UNIX password: 
Enter new UNIX password: 
Retype new UNIX password:

Thank you for choosing Armbian! Support: www.armbian.com

Creating a new user account. Press <Ctrl-C> to abort

Please provide a username (eg. your forename): 
...

При первой загрузке потребуется изменить пароль root и создать нового пользователя. На этом этапе рекомендуется создать пользователя «pi». После этого станет доступна командная строка, где следует выполнить команду для настройки платы Orange Pi Zero:

armbian-config

Сначала изменена временная зона.

Затем выбрано Wi-Fi – Подключение к беспроводной точке доступа для соединения с Wi-Fi роутером.

Можно выйти из armbian-config, при необходимости отключить Ethernet-кабель и переподключиться по SSH через Wi-Fi, что и было сделано.

В командной строке проверена запись и воспроизведение звука через встроенный микрофон и колонки с использованием команд из руководства ReSpeaker :

arecord -M -f S16_LE -r 16000 -c 1 --buffer-size=204800 -v /tmp/sample.wav
aplay -M /tmp/sample.wav --buffer-size=204800 -v

Первая команда записала голос, после чего нажато Ctrl+C для остановки, а вторая команда воспроизвела запись. Функциональность подтверждена. При необходимости громкость воспроизведения и записи регулируется командами:

alsamixer

Для работы Google Assistant с ALSA потребуется создать файл .asoundrc. Необходимо зафиксировать номер карты и устройства микрофона (0,0):

root@orangepizero:~# arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: audiocodec [audiocodec], device 0: SUNXI-CODEC sndcodec-0 []
 Subdevices: 1/1
 Subdevice #0: subdevice #0
card 1: sndhdmi [sndhdmi], device 0: SUNXI-HDMIAUDIO sndhdmi-0 []
 Subdevices: 1/1
 Subdevice #0: subdevice #0

а также номер карты и устройства колонок (0,0):

aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: audiocodec [audiocodec], device 0: SUNXI-CODEC sndcodec-0 []
 Subdevices: 1/1
 Subdevice #0: subdevice #0
card 1: sndhdmi [sndhdmi], device 0: SUNXI-HDMIAUDIO sndhdmi-0 []
 Subdevices: 1/1
 Subdevice #0: subdevice #0

При использовании телевизора в качестве колонок следует выбрать Карту 1, устройство: 0.

Если пользователь pi или другой ещё не создан, необходимо добавить его в группы sudoers и audio, затем перейти в домашний каталог:

adduser pi
adduser pi sudo
adduser pi audio
su pi
cd ~

Создайте ~/.asoundrc со следующим содержимым, соответствующим карте и устройству микрофона/колонок:

pcm.!default {
 type asym
 capture.pcm "mic"
 playback.pcm "speaker"
}
pcm.mic {
 type plug
 slave {
 pcm "hw:0,0"
 }
}
pcm.speaker {
 type plug
 slave {
 pcm "hw:0,0"
 }
}

[Обновление: Как будет показано ниже, это не работает со встроенным микрофоном, но в комментариях указано решение через замену раздела pcm.mic на:

pcm.mic { 
 type plug 
 slave { 
  pcm "hw:0,0" 
  format S16_LE
 }
}

Остальная часть статьи не изменена, но встроенный микрофон Orange Pi Zero теперь функционирует]

Настройка Google Assistant на Orange Pi Zero

Error, Ad (12) is not available at this time due to schedule/budgeting/geolocation/mobile restrictions!

Теперь, когда аудио и сетевое подключение настроены, можно перейти к инструкциям по установке Google Assistant SDK и демо. Они идентичны для всех плат и подробно описаны ниже.

Требуется настроить проект Google Developer Project.

Перейдите на Страница проекта в Google Platform Console, нажмите Create Project.

Назовите проект Orange Pi Zero Smart Speaker и нажмите Create.

Далее необходимо включить Google Assistant API для проекта. Просто нажмите Enable на этой странице. В данном случае проект «Orange Pi Zero Smart Speaker» уже был выбран.

Затем потребуется создать OAuth Client ID . Достаточно указать email-адрес и название продукта перед нажатием Save.

Выберите Other на следующей странице, укажите название (например, «Linux Thingy») и нажмите Create.

Появится всплывающее окно OAuth-клиента с ID и секретом. Можно просто нажать OK, сохранять данные не требуется.

Вместо этого на следующей странице скачайте файл client_secret_[your_client_id].json , нажав на стрелку, обведенную красным.

Скопируйте файл на плату Orange Pi Zero с помощью scp (замените [your_client_id] на фактический ID клиента):

scp client_secret_[your_client_id].json pi@192.168.0.114:~

После настройки основных параметров в Google Cloud установите Python 3 и зависимости:

sudo apt-get update
sudo apt-get install python3-dev python3-venv
python3 -m venv env
env/bin/python -m pip install --upgrade pip setuptools
source env/bin/activate

На этом этапе убедитесь, что в Activity Controls page активированы: «Web & App Activity» с отмеченным пунктом «Include Chrome browsing history…», «Device Information» и «Voice & Audio Activity». Все опции уже были включены по умолчанию.

Теперь можно установить пакет Google Assistant SDK, включая библиотеки и примеры кода:

python -m pip install --upgrade google-assistant-library

и инструмент авторизации:

python -m pip install --upgrade google-auth-oauthlib[tool]

Запустите инструмент авторизации:

google-oauthlib-tool --client-secrets ~/client_secret_xxxx.apps.googleusercontent.com.json --scope https://www.googleapis.com/auth/assistant-sdk-prototype --save --headless

Отобразится текст «Please visit this URL…». Скопируйте URL, откройте его в браузере, затем вставьте полученный код авторизации в терминал.

Теперь можно запустить демо

google-assistant-demo

Это начальный вывод

ON_MUTED_CHANGED:
 {'is_muted': False}
ON_START_FINISHED

После фраз «OK Google» и «Hey Google» реакции не последовало – ни ответа, ни информации в терминале. После нескольких попыток были проверены настройки:

export ASSISTANT_MIC_SENSITIVITY=-6

как указано в разделе диагностики документации Google Assistant. Значение постепенно увеличивалось до -60, но результат остался негативным. Проверка через Google Translate на телефоне также не дала эффекта. В Google Cloud Console отображались ошибки 100%.

Увеличить

При поиске решения обнаружились рекомендации по изменению файла .asoundrc (не сработало из-за ошибок воспроизведения) и замене микрофона. Был подключен дешевый USB-микрофон с eBay за $1.45 (дополнительный адаптер на фото выше). Проверьте номер карты и устройства:

arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: audiocodec [audiocodec], device 0: SUNXI-CODEC sndcodec-0 []
 Subdevices: 1/1
 Subdevice #0: subdevice #0
card 1: sndhdmi [sndhdmi], device 0: SUNXI-HDMIAUDIO sndhdmi-0 []
 Subdevices: 1/1
 Subdevice #0: subdevice #0
card 2: Device [USB PnP Sound Device], device 0: USB Audio [USB Audio]
 Subdevices: 1/1
 Subdevice #0: subdevice #0

Для USB-карты 2, устройства 0 обновите соответствующую строку в разделе pcm.mic файла .asoundrc:

pcm "hw:2,0"

После повторного запуска демо – успех! Устройство отвечало на запросы: называло время, имя, прогноз погоды, выполняло расчеты и т.д.

Пример рабочего вывода:

google-assistant-demo 
ON_MUTED_CHANGED:
 {'is_muted': False}
ON_START_FINISHED

ON_CONVERSATION_TURN_STARTED
ON_END_OF_UTTERANCE
ON_RECOGNIZING_SPEECH_FINISHED:
 {'text': 'what do you want'}
ON_RESPONDING_STARTED:
 {'is_error_response': False}
ON_RESPONDING_FINISHED
ON_CONVERSATION_TURN_FINISHED:
 {'with_follow_on_turn': False}

ON_CONVERSATION_TURN_STARTED
ON_END_OF_UTTERANCE
ON_RECOGNIZING_SPEECH_FINISHED:
 {'text': 'I will be back'}
ON_RESPONDING_STARTED:
 {'is_error_response': False}
ON_RESPONDING_FINISHED
ON_CONVERSATION_TURN_FINISHED:
 {'with_follow_on_turn': False}

Учтите, что Google Assistant SDK находится в стадии предварительного доступа и ориентирован на разработчиков. Пока недоступны автоматизация задач или воспроизведение музыки как в Google Home, но возможны кастомные реализации, например интеграция AIY Project Voice Kit с Google Music для любых плат. Штатный Google Home использует микрофонную решетку для надежного распознавания в шуме, но связка Orange Pi Zero + USB-микрофон показала хороший результат на дистанции 5+ метров.

Ошибка, реклама (12) недоступна из-за ограничений расписания/бюджета/геолокации/мобильных устройств!

При последующих загрузках платы войдите под пользователем pi и выполните команды для запуска демо:

source env/bin/activate
google-assistant-demo

Для автозапуска используйте systemd, адаптировав инструкции из Nordic Semi’s Google Assistant Wiki .

Создайте файл /etc/systemd/system/google-assistant-demo.service со следующим содержимым:

[Unit]
Description=google assistant service
After=network.target ntpdate.service

[Service]
Type = idle
Environment=VIRTUAL_ENV=/home/pi/env/
Environment=PATH=/home/pi/env/bin:/usr/local/sbin:/usr/local
ExecStart=/home/pi/env/bin/google-assistant-demo
WorkingDirectory=/home/pi
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi

[Install]
WantedBy=multi-user.target
Alias=google-assistant.service

Добавлен параметр «Type = idle» для корректной работы после инициализации аудиосистемы. Других сервисов аудио в systemd не обнаружено.

Активируйте и запустите службу:

sudo systemctl enable google-assistant-demo.service
sudo systemctl start google-assistant-demo.service

Демо будет запускаться автоматически при каждой загрузке. В ходе многочасового тестирования система показала стабильность. При возникновении проблем с Wi-Fi на Orange Pi Zero рекомендуется перейти на Ethernet, использовать USB-WiFi адаптер или выбрать плату с проверенным модулем Wi-Fi.

Благодарим Shenzhen Xunlong Software за предоставленный комплект. Приобрести его можно за $12.95 + доставка .

Выражаем свою благодарность источнику, с которого взята и переведена статья, сайту cnx-software.com.

Оригинал статьи вы можете прочитать здесь.

0 0 votes
Article Rating
Подписаться
Уведомление о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

0 Комментарий
Oldest
Newest Most Voted
Inline Feedbacks
View all comments