Привет Хабр! Меня зовут Алексей и я занимаюсь беспроводными технологиями. В этой статье я расскажу, как собрал прототип своей собственной умной колонки, объединённой в одном устройстве вместе с Wi-Fi mesh-роутером. Начну издалека и поразмышляю о том, какие плюсы может принести такое устройство как для качественного Wi-Fi в квартире, так и для производителей умных колонок. Проанализирую уже существующие на рынке решения и попробую собрать собственное устройство из USB-аудиокарты, роутера и обычной Bluetooth-колонки.
Вообще идея объединить умную колонку с mesh-роутером в одно целое обжилась в моей голове достаточно давно. Пользователь расставляет в комнатах своего дома умные колонки, чтобы слушать музыку и взаимодействовать с ними голосом. Каждая колонка подключается к Wi-Fi сети и является потребителем интернета. Если дом или квартира большая, то для масштабирования Wi-Fi сети потребуются дополнительные Wi-Fi роутеры, и, вероятно, mesh-решение будет самым удачным. Но зачем держать на столе два устройства: mesh-роутер и умную колонку, когда можно объединить их в одном корпусе? Пусть умная колонка будет не только потребителем интернета, но и тем звеном, которое его раздаёт.
Польза для Wi-Fi и mesh-сетей
Прежде всего я вижу, что такое устройство принесёт пользу для создания качественной Wi-Fi сети. Из своего многолетнего опыта я знаю, что часто проблема с интернетом в квартире связана именно с неудачным расположением роутера. Много раз я видел, как пользователи прячут роутер в шкаф с зеркальными дверцами, а потом удивляются, что в квартире плохой интернет. Они покупают более дорогой тарифный план у провайдера с большей скоростью, которая по сути им не нужна, удивляются, что ничего хорошего из этого не вышло. Затем покупают дополнительный mesh-роутер и прячут его за холодильник, и после этого начинают говорить, что все эти mesh-системы — полная ерунда.
Представьте, как было бы здорово, если бы mesh-роутер мог голосом сказать пользователю, что он не видит сигнал от своего соседа, и попросил бы его придвинуть его поближе. Или сообщил об ошибке на порту, или помог в управлении роутером и диагностике. Такой встроенный в роутер помощник мог бы быть полезен и провайдеру, так как значительно бы снизил количество обращений в службу поддержки.
Итак, чем может быть полезен голосовой Wi-Fi mesh-роутер:
Помощь в расстановке роутеров на оптимальной дистанции друг от друга
Замер скорости по голосовой команде «Спок, измеряй скорость интернета»
Диагностика состояния роутера
Диагностика ошибок на порту
Рекомендация расширить mesh-сеть, добавив новое устройство
Информирование о возможных сетевых проблемах ещё до того, как они наступят
Самое главное преимущество, но достаточно сложно реализуемое — это создание из массива роутеров-колонок сети Wi-Fi сенсинга для безопасности, мониторинга здоровья и т.д.
Польза для производителей умных колонок
Я не понимаю, почему такую идею до сих пор не реализовали производители умных колонок, тех же Яндекс Станций, ВК Капсул и Сбер бумов, ведь экономическая выгода в этом решении находится в их руках. Умная колонка и mesh-роутер в одном корпусе — это уникальное торговое предложение и решающий фактор при выборе умной колонки, особенно при покупке нескольких колонок для каждой комнаты.
Согласитесь, что в большинстве случаев умная колонка — это просто баловство: можно купить одну, вдохновившись интересом и рекламой. Но покупать в каждую комнату такое устройство, тем более если ты не управляешь умным домом, кажется расточительным. Решение, которое позволяет за один раз купить два устройства и решить проблему с покрытием Wi-Fi в квартире, кажется более конкурентным.
Но для производителей умных колонок даже это не является главным. Очевидно, что их рост в сторону управления умными устройствами и массового рынка будет базироваться на Wi-Fi лампочках, розетках и т.д., то есть именно на беспроводных вещах, которым нужен качественный доступ в интернет. А если его нет, то кто виноват? Правильно — само устройство. То, что умная розетка находится за холодильником, где Wi-Fi не ловит, ни кого не интересует. Плохое именно устройство.
Здесь опят�� же хорошо было бы, когда умная колонка как элемент умного дома сама понимает состояние беспроводной сети и статусы всех подключённых устройств. Она может сообщить, что подключение к какому-то устройству нестабильно, и выдать рекомендации по устранению данной проблемы.
Наконец, самая главная киллер-фича: умная колонка и роутер в одном корпусе могут позволить умной колонке идентифицировать пользователей. На основании регистрации в сети смартфонов пользователей можно понять, кто сейчас находится в доме, в какой комнате, и осуществлять персонализированное общение. Это достаточно простой кейс, который будет обладать вау-эффектом. Представьте: вы заходите в комнату, и умная колонка здоровается с вами или включает подкаст в соответствии с вашими предпочтениями.
Сразу приходит в голову огромное количество потенциальных сценариев. Например, "Мистер, Спок напомните Алексею вынести мусор и сделать уроки когда они придет домой" (Да, да я в том числе и фанат Стар трека :-)
Обзор существующих решений
Если описываемый концепт настолько удачный — и это не моя галлюцинация — то логично, что такие решения уже должны быть на рынке. И действительно, они уже есть.
NETGEAR Orbi Voice RBK50V — это гибридное устройство, сочетающее в себе функции умной акустической системы с голосовым управлением Alexa и высокоскоростного беспроводного Mesh-маршрутизатора с поддержкой Wi-Fi стандарта AC2200. Оно предназначено для организации надёжной сети с расширением покрытия сигнала Wi-Fi в больших помещениях или сложных условиях приёма сигнала, обеспечивая стабильное подключение устройств даже в удалённых уголках дома или офиса.

Функционал умной колонки:
Голосовое управление: поддержка виртуального ассистента Amazon Alexa позволяет управлять устройством голосом, запрашивать информацию, воспроизводить музыку, контролировать освещение и другие совместимые устройства умного дома.
Интеграция с музыкальными сервисами: поддерживает потоковую передачу музыки с популярных сервисов, таких как Spotify, Pandora, iHeartRadio и других.
Высокая звуковая производительность: встроенный динамик обеспечивает качественный звук для прослушивания музыки и воспроизведения уведомлений и сообщений.
Это, вероятно, самый близкий аналог к нашему концепту, но стандарт AC в 2026 году уже является устаревшим. Хотя для устройства родом с 2018 года это было более чем продвинутое решение. На мой взгляд, это устройство опередило время.
Google Nest Wifi Pro — это современная серия устройств от Google, сочетающая функции высокопроизводительного Mesh-роутера и умной домашней точки доступа. Это новое поколение решений для построения домашних сетей с поддержкой новейших стандартов связи и удобством интеграции с экосистемой Google Home. Это не совсем аналог нашего концепта. Устройство не имеет полноценной аудиосистемы и не может проигрывать музыку, но может взаимодействовать с пользователем через голосового ассистента.

Управление осуществляется через простое приложение Google Home, доступное на смартфонах Android и iOS.
Голосовые команды с использованием помощника Google Assistant позволяют легко настраивать и администрировать систему.
Устройство интегрируется с различными аксессуарами и системами умного дома, позволяя создавать автоматизацию процессов.
ASUS Lyra Voice — это комбинированное устройство, сочетающее в себе функциональность умной колонки с голосовым помощником Alexa и беспроводного Mesh-роутера. Основная цель устройства — предоставление быстрого и надёжного Wi-Fi покрытия наряду с возможностью голосового управления бытовыми приборами и функциями умного дома.

Поддержка голосового помощника Alexa, интегрированного непосредственно в устройство, позволяет владельцу получать необходимую информацию и управлять подключёнными гаджетами с помощью голоса.
Широкий спектр возможностей голосового взаимодействия включает контроль над воспроизведением музыки, получение новостей, установку будильников, регулировку освещения и многое другое.
Обеспечивает полное покрытие сигналом Wi-Fi даже в крупных квартирах и домах, улучшая связь и уменьшая количество мёртвых зон.
Может использоваться автономно или в качестве части Mesh-системы совместно с другими моделями серии Lyra для дальнейшего увеличения зоны покрытия.
Полностью соответствует стандартам современного Wi-Fi (AC1300), обеспечивая хорошую пропускную способность и устойчивость сети.
На мой взгляд, это самое близкое решение к тому, что я хочу попробовать собрать.
Что хочу получить в итоге
Итак, на основании первоначальных идей и существующих решений можно попробовать описать, что же я хочу получить в итоге:
Умная колонка и mesh-роутер в одном устройстве
Управление голосом Wi-Fi роутером и параметрами сети
Качественный звук, воспроизведение музыки, подкастов и т.д.
Работа с механиками по расписанию — например, музыкальный будильник или подкаст
Работа с механиками по наступлению события — оповещение пользователя о сетевых событиях
Идентификация пользователя и персонализированное взаимодействие
Проигрывание звука и использование микрофонов обычных Bluetooth-колонок — это позволит сделать интеграцию и расширение очень простым и дешёвым
Аппаратная база
Теперь для реализации поставленных задач нужно прежде всего определиться с аппаратной базой и понять, как мы будем реализовывать на роутере поддержку звука. С одной стороны, на рынке существуют роутеры с поддержкой звука на борту либо с потенциальной возможностью расширения. Но всё же это достаточно редкие устройства. Для своего решения я решил воспользоваться внешней USB-аудиокартой. Также для подключения Bluetooth-устройства нам потребуется внешний Bluetooth-адаптер, какая-нибудь колонка и USB-хаб.

Проведя ревизию оборудования, которое у меня было дома, я собрал следующий аппаратный комплект:
Wi-Fi роутер — TP-Link Archer C7 — довольно старенький роутер, но имеет на борту USB-порт и позволит проверить, как вся моя поделка будет работать на слабом железе. Вообще, для прототипа концепта это самое оно.
USB-хаб — самый обычный, ничего примечательного
Bluetooth-адаптер — также самый обычный
Звуковая карта — получилось не совсем обычная. Я понимаю, что вполне можно было бы разыскать какой-то компактный вариант, но поскольку у меня уже была звуковая карта в виде небольшого любительского микшера, я решил использовать её. К ней я подключил проводные наушники, чтобы раньше времени не пугать окружающих своими экспериментами.
USB-накопитель на 32 гигабайта — понадобился мне, чтобы расширить файловую систему роутера
Bluetooth-колонка — для воспроизведения звука с роутера через Bluetooth
Подготовка роутера
Естественно, для экспериментов мне потребуется роутер с кастомизированной прошивкой. Для своих экспериментов я выбрал прошивку Ternex. Эта прошивка собрана на основе OpenWRT, но имеет несколько важных преимуществ для реализации моей задачи:
Прошивка ориентирована на создание mesh-сетей — то, что для нас как раз и требуется
В прошивке реализован достаточно продвинутый API для управления роутером и получения различных данных о его состоянии. Таким образом, нам потребуется просто распознавать голос и на основании результата отправлять API-запрос для управления роутером.
Как выяснилось, прошивка имеет ещё несколько плюсов, которые пригодились в работе.
С прошивкой роутера не возникло никаких проблем. На роутере уже было установлено OpenWRT, поэтому мне осталось только скопировать на роутер sysupgrade-образ с Ternex и выполнить команду sysupgrade. Сразу после этого я в пылу азарта начал устанавливать на роутер необходимые пакеты и сразу же был возвращен на землю сообщением о недостаточном месте.
Собственно, я изначально предполагал, что места мне не хватит, и потребуется перенести файловую систему с роутера на USB-накопитель. Делается это не слишком сложно, но благодаря выбранной прошивке это можно сделать ещё проще. Нужно просто отформатировать флешку в ext4, вставить её в роутер и нажать в интерфейсе кнопку переноса файловой системы на роутер. Через пару минут ожидания и перезагрузки роутера я стал счастливым обладателем почти 32 гигабайт свободного места на роутере.
Поднимаем на роутере звук
Для начала установим на роутер необходимые пакеты:
opkg update
opkg install kmod-sound-core kmod-usb-audio madplay alsa-utilsЧто устанавливается:
kmod-sound-core— модули ядра для звуковой поддержкиkmod-usb-audio— драйверы для USB-аудиокартmadplay— декодер и плеер MP3-файловalsa-utils— утилиты для управления звуком (опционально, но полезно)
Теперь давайте попробуем обнаружить звуковую карту и выполним её инициализацию:
cat /proc/asound/cards
Мне повезло с первого раза. И теперь можно инициализировать звуковую карту выполнив alsactl init

На всякий случай убедимся, что звук не отключен, и проверим уровень громкости:
amixer sset Master unmute
amixer get MasterОтлично! Теперь у нас всё готово, чтобы проигрывать на роутере звук. Я скопировал на роутер одну легендарную песню и запустил её с помощью madplay. Отличное звучание. Я послушал в наушниках, а затем не поленился принести внешние колонки и послушал ещё раз.

Осознание результата
Важно отметить, что уже на этом этапе мы можем реализовать кучу интересных фич в самом примитивном варианте:
Записать несколько звуковых файлов, рассказывающих о событиях в сети, и просто проигрывать их при наступлении события. Например, при подключении к Wi-Fi нового пользователя, приветствие при подключении старого, замер скорости и информирование о скорости и состоянии канала и т.д.
Проигрывать звуковые файлы, запланированные через cron. Например, установив будильник, который проиграет любимую песню или запустит любимый подкаст. Достаточно легко реализовать такой функционал через веб-интерфейс.
Кстати, уже сейчас мы можем проигрывать потоковое аудио с внешних источников.
Получение и запись звука с микрофона
Но хотя всё это и очень круто, наша цель — голосовое управление. Поэтому давайте попробуем получить звук с микрофона и записать его в отдельный файл. Следующая команда позволяет сначала записать короткий пяти секундный трек, а потом проигрывает его:
arecord -d 5 -f cd test.wav && aplay test.wav
Важно отметить, что воспроизведение и запись звука в среднем утилизируют всего 4% ресурсов процессора. Честно говоря, ожидал, что будет больше.
Собственно, этот пяти-секундный ролик можно передать в какой-нибудь сервис распознавания речи и уже в каком-то виде реализовать управление. Но мы всё же попробуем передавать напрямую поток и отсекать тишину. Но прежде давайте попробуем совершить всё то же самое, но для Bluetooth-колонки.
Подсоединяем Bluetooth
Почему Bluetooth важен? Это потенциально открывает возможность создания недорогих решений, когда к роутеру просто подключается пара колонок, реализуя правый и левый каналы передачи звука. Либо роутер со встроенной колонкой можно расширить ещё одной Bluetooth-колонкой для размещения в другой комнате или для дополнения, чтобы получить стерео-канал.
Итак, давайте поставим необходимые пакеты:
bashopkg update
opkg install kmod-bluetooth bluez-libs bluez-utils bluez-daemon kmod-usb-core kmod-usb-uhci kmod-usb2 usbutils dbus pulseaudio pulseaudio-module-bluetoothГлавное здесь — PulseAudio и BlueZ.
Что такое PulseAudio?
PulseAudio — это звуковой сервер, прослойка между приложениями и реальным аудиодрайвером (обычно ALSA). Он принимает аудиопотоки от программ и распределяет их по доступным устройствам вывода/ввода.
Основные функции PulseAudio:
Позволяет нескольким приложениям одновременно использовать одну звуковую карту (софт-микшер, «многоклиентский» доступ).
Управляет маршрутизацией звука: можно перенаправлять поток на разные устройства (USB-звук, HDMI, Bluetooth-колонка, сеть и т.п.).
Позволяет отдельно регулировать громкость для каждого приложения.
Умеет передавать звук по сети (например, проигрывать на другом хосте).
Имеет модульную архитектуру: модули для Bluetooth, сети, записи в файл, «нулевой» sink и т.д.
Что такое BlueZ?
BlueZ — это стек Bluetooth для Linux, то есть набор драйверов ядра и пользовательских демонов/утилит, реализующий протоколы Bluetooth.
Основные задачи BlueZ:
Управление Bluetooth-адаптером (включение/выключение, режимы, сканирование).
Паринг и управление устройствами (наушники, колонки, телефоны, клавиатуры и т.п.).
Поддержка профилей Bluetooth, в том числе аудио (A2DP, HSP/HFP и др.), через которые и ходит звук.
BlueZ сам по себе не воспроизводит звук. Он:
Даёт доступ к Bluetooth-аудиоустройству (например, A2DP-гарнитуре).
Предоставляет интерфейс, через который PulseAudio (или другой звуковой сервер) создаёт аудиосоединение с Bluetooth-устройством и дальше уже передаёт PCM-поток.
Теперь заэнейблим и запустим следующие сервисы:
/etc/init.d/dbus enable
/etc/init.d/dbus start
/etc/init.d/bluetoothd enable
/etc/init.d/bluetoothd start Проверим, появился ли Bluetooth выполнив hciconfig и bluetoothctl list

Bluetooth появился. Теперь нужно его поднять :) hciconfig hci0 up
Дальне��шую настройку можно делать в интерактивном режиме через bluetoothctl.
Включим всё, что необходимо:

Теперь ненадолго оставим Bluetooth и перейдём к PulseAudio.
Запустим его:
/etc/init.d/pulseaudio enable
/etc/init.d/pulseaudio start И добавим необходимые модули, отредактировав файл /etc/pulse/system.pa
load-module module-bluetooth-discover
load-module module-bluetooth-policy
load-module module-bluez5-discoverТеперь перезагрузим pulseaudio и затем инициализируем ALSA:
/etc/init.d/pulseaudio restart
alsactl init
Я в этом месте затупил. Так как звуковая карта сама имела поддержку Bluetooth, я, чтобы не запутаться, вытащил её из USB, и pulseaudio у меня не запустился. Когда я вернул звуковую карту на место, всё заработало.
Теперь можно подключать наше Bluetooth-устройство. Опять же через интерактивное меню bluetoothctl это делается достаточно легко. Включаем, сканируем и подключаемся к нужному устройству. Я эту часть делал уже поздно ночью, поэтому подключился к беспроводным наушникам, чтобы никого не разбудить. Но на следующий день повторил опыт с колонкой.

Собственно, после подключения звук сразу начинает идти через Bluetooth-устройство, хотя в некоторых гайдах говорилось, что возможно потребуется указать адрес.
Переходим к распознаванию речи
К этому моменту я поймал кураж и, окрылённый тем, что на роутере у меня много места, взгромоздил туда Python вместе с python-audio. Первым делом я написал несложный скриптик, который слушает микрофон и начинает запись только после детекции звука, заканчивая, когда наступает двух-секундная пауза.
Дальше нужно было определиться с распознаванием речи. Конечно, можно было бы передавать всё это на какой-то сторонний сервис, но я справедливо рассудил, что это будет не совсем удобно и достаточно затратно. Поэтому решено было собрать что-то своё. Ранее я имел дело с Vosk и решил пойти по проторенному пути. Чисто теоретически Vosk можно собрать и под OpenWRT, но я решил не тратить на это время и просто поднял его на локальной машине в домашней сети. Да и честно говоря, были сомнения, что ресурсов Archera хватит.
Передавать кусочки файлов было неудобно, поэтому следующим шагом я немного модифицировал свой скриптик и научил его передавать аудио-поток на Vosk-сервер.
Дальнейшее — дело техники. Роутер детектирует звук, направляет поток на Vosk-сервер. Он распознаёт текст и ищет наиболее похожую подстроку (эту часть можно улучшить с помощью ИИ). Далее, в зависимости от распознавания, с той же машины направляет API-запрос на роутер и реализует управление и запуск звука. Генерацию звука пока не делаю; если нужно ответить голосом, просто заготовил несколько шаблонных фраз. Для прототипа этого достаточно. В принципе все это понятная рутинная, работа поэтому фрагменты кода не привожу. Но если вам интересно, как я работал со звуковым потоком и распознавал его, напишите в комментариях, и я напишу об этом в следующей части.
На текущий момент у меня реализованы следующие механики:
Мистер Спок, сколько человек в доме — определяем на основе MAC-адресов
Мистер Спок, запиши голосовую заметку — просто пишем звук и сохраняем в файл, сделал заготовку на будущее
Мистер Спок, выключи Wi-Fi — когда соберу второе устройство, нужно будет отключать только пользовательские сети и оставить служебный mesh
Мистер Спок, включи подкаст [название подкаста] — просто запускается подкаст по ссылке
Если вам интересно, я с удовольствием продолжу писать на эту тему и делиться дальше своими успехами. В планах подключить какой-нибудь ИИ сервис для обработки вопросов и сервис для генерации аудио ответов. Я буду очень благодарен, если вы подскажете ещё какие-то механики или кейсы использования решения в такой компоновке и пройдете опрос.
