Салют, Хабр!

Я Владимир, HW TPM lead в SberDevices. Сегодня мы выпустили новую интеллектуальную колонку — СберБум 2.0. Разрабатывая устройство, мы хотели обеспечить пользователю максимально комфортный и личный опыт взаимодействия с устройством. Создать колонку, которая будет ощущаться полностью своей. 

СберБум 2.0 можно называть так, как хочешь — мы встроили в неё кастомный споттер. В её памяти сохраняется более 200 музыкальных треков. Это устройство с отличным звуком (об акустике расскажем отдельно), Zigbee-модулем и протоколом Matter over Wi-Fi. Всего одна колонка… за которой стоят десятки концепций, сотни тестов, тысячи образцов. Сложности разработчикам, а пользователю — магия. В этой статье расскажу о «железе» новой колонки, а мой коллега Иван — о софтверных фичах.

Дизайн

Разработка дизайна новой колонки вылилась в более чем 50 уникальных концепций в пяти разных дизайнерских направлениях. Одни варианты прекрасно выглядели на рендерах, но в реальной квартире напоминали арт-объект. Другие устраивали по дизайну, но не подходили для акустической конфигурации продукта.

Первые наброски дизайн-решения от промышленного дизайнера команды

В новой модели решено было сохранить связь с классической SberBoom. Самая узнаваемая черта её визуального кода — наружные вертикальные рёбра. Они и легли в основу нового корпуса, поэтому в новой колонке можно узнать фамильные черты. Красиво? Да. Просто в производстве? Нет.

Корпус колонки обтянут акустической тканью. Приклеить её на цилиндрическую форму с ровной поверхностью было бы сравнительно просто, но на выступах и углублениях рёбер с этим появляются сложности. Ткань должна точно повторять геометрию, плотно прилегать к корпусу, не образовывая складок, и сохранять направление структуры с учетом сложной формы.  

Так на производственной линии появилась специальная машина для горячего прессования. Её рабочая часть повторяет ребристую геометрию колонки. Во время операции ткань одновременно нагревают и равномерно прижимают ко всей поверхности корпуса.

Ткань для колонки выбрали более чем из тысячи образцов разных структур и оттенков. К ней существуют определённые требования:

  • акустически прозрачная, то есть минимально влияет на звук;

  • достаточно плотная, чтобы не видна была внутренняя акустическая решётка корпуса;

  • пропускает достаточно света — экран должен оставаться ярким и хорошо читаемым;

  • цилиндрическая, то есть без шва на задней стороне. Только так у колонки нет очевидной «изнанки», которую нужно прятать у стены;

  • визуальные критерии выбора: текстура и цвет ткани, её блеск, меланжевость или однородность.

Слева — ткань слишком тонкая: видна акустическая решётка. Справа — проверка текстуры ткани
Слева — ткань слишком тонкая: видна акустическая решётка. Справа — проверка текстуры ткани

Понятно, что каждый из этих параметров влиял на остальные. Если ткань слишком толстая, акустическая решётка не видна, но снижается яркость экрана и не видны вертикальные рёбра корпуса. Если слишком тонкая — из-под ткани начинает просвечивать корпус, а экран становится избыточно ярким. Вдобавок была ещё одна важная для нас характеристика: тактильное удовольствие. Мы хотели, чтобы колонки было приятно касаться. Это распространялось на всё: сам корпус устройства, его верхнюю крышку. Только цвет лого потребовал более 30 образцов под каждый вариант расцветки корпуса.

Верхняя крышка — силикон с высокой степенью шероховатости, VDI 27. Логотип металлический: сплав цинка и алюминия
Верхняя крышка — силикон с высокой степенью шероховатости, VDI 27. Логотип металлический: сплав цинка и алюминия

Под силиконовой крышкой размещена плата с микрофонами, датчик освещённости плюс RGB-светодиоды для реализации круговой подсветки. Есть на крышке и тактовые кнопки, чтобы у пользователя была возможность управлять колонкой не только голосом. При выборе материала рассматривали жёсткий пластик и металл, в итоге остановились на силиконе.   

Колонка, которую можно настроить под себя

У каждой умной колонки есть имя, оно же споттерное слово; по нему устройство понимает, что сейчас будет голосовая команда, и начинает распознавать речь. Споттерное слово задаёт производитель устройства. Но в СберБум 2.0 мы отказались от жёсткого детерминирования имени колонки. Теперь пользователь может дать ей кастомное имя (например, чтобы по обращению к колонке не прибегала дочь…). Когда даёшь колонке имя, она ощущается какой-то более своей — к тому же его весело придумывать.

У функции сравнительно простой флоу. Юзер говорит подключённому устройству, что хочет переименовать его. Интеллектуальная колонка просит пять раз повторить своё новое кастомное имя и запоминает его. Теперь пользователь может обращаться к ней так, как нравится ему. Кстати, неожиданный, но очень понятный плюс функции: если дома несколько СберБум 2.0, можно назвать их по-разному… и никогда больше не сталкиваться с ситуацией, когда обращаешься к одной колонке, а отзывается другая.

За кастомный споттер в СберБум 2.0 отвечает отдельная локальная модель. В её основе архитектура conformer, совместимая с моделью локального ASR, которая уже применяется на устройстве для споттерного слова «Салют» и быстрых команд. Это дало сразу два преимущества: во-первых, мы уже знаем, как квантовать её и запускать на целевом ПО. Во-вторых, можно переиспользовать предварительно обученную часть модели как акустический энкодер.

На этапе обучения к энкодеру добавляется декодер. Мы обучили модель превращать слова в эмбединги, используя функцию кросс-энтропии как функцию потерь (cross-enthropia loss). Эмбеддинги создаются на последнем слое энкодера, а декодер учится их распознавать как токены из словаря. В процессе обучения использовался словарь из десятков тысяч токенов. Качество пространства эмбеддингов отслеживали по метрикам расстояний слов до центроидов других слов, а оценивали по метрике FRR (false reject rate — количество кейсов, когда колонка не откликнулась на имя) на тестовых наборах данных. При этом FAH фиксировался на минимальных значениях. Модель дотренировывали с помощью гибридного лосс alpha CE + beta sphereface2 с уменьшенным на порядок learning rate и alpha=1, beta=0.3.

После завершения обучения мы отбрасываем декодер, остаётся лишь энкодер: выход с его финального слоя используем для сравнения с якорем —- эмбеддингом-эталоном кастомного споттера пользователя. Якорь — это усреднение тех самых пяти записей споттерного слова, которые запросила колонка. Он локально сохранён на устройстве.

Для сравнения эмбеддингов произнесённого слова и кастомного споттера применяется метрика косинусного сходства. Чтобы оценить степень сходства, задан порог чувствительности, по которому определяем: насколько то, что произнёс пользователь, похоже на эталон? Порог подбирали экспериментально в несколько итераций: сначала на тестовом сете записей инженеров-участников обучения, затем в бета-тестировании. Если расстояние между эталоном и словами пользователя меньше порога, колонка понимает, что обращаются к ней, и начинает считывать голосовую команду. 

Модель кастомного споттера работает локально. Благодаря тому, что мы использовали уже знакомую архитектуру, её было проще оптимизировать для устройства: обучили в арифметике с плавающей точкой, а затем перевели в int5 практически без потери качества. Текущая итоговая модель имеет footprint 11.4 Мб... и это ещё не предел: как только мы достигнем максимального качества по всем направлениям (всегда есть что улучшать!), планируем дистиллировать нашу модель в модель поменьше.

Как указывалось выше, при тестировании, в том числе бета-тестировании, мы смотрим сначала на метрику FAH — ложных срабатываний в час. Порог подбирается так, чтобы FAH был меньше 0.1, а затем уже замеряется метрика FRR. Проще говоря, сначала делаем так, чтобы колонка как можно реже реагировала, когда не надо. Потом уже проверка, что она слышит собственное имя. 

Дополнительно мы хотели сделать так, чтобы диалог с ИИ-помощником звучал более живо и естественно. Поэтому теперь колонку можно перебивать — задавать уточняющие вопросы или просто менять тему. Перебивание тоже реализовано локально: модель VAD (детектор голосовой активности) работает прямо на колонке. В ней 500 тыс. параметров.

Перебивание опирается на модуль VQE (блок улучшения качества звука) и, в частности, на алгоритм AEC (подавления акустического эха). О нём мы уже рассказывали. Главное для перебивания — что алгоритм моделирует пути распространения звука от динамика до микрофона, а затем вычитает его из поступившего на вход микрофона сигнала. На выходе должна получиться максимально приближенная к реальной речь пользователя.

Тут уместно упомянуть, что у AEC есть два режима, и  в каждом свои особенности:

  • режим, в котором пользователь говорит с колонкой. Слушатель здесь — это модель распознавания речи. 

  • удалённое общение с другим человеком через колонку и приложение для голосовой или видеосвязи. Слушатель — человек.

Модель распознавания речи более требовательна к сохранности голоса после всех этапов шумоподавления, зато вполне устойчива к остаткам шумов. Собеседник при звонке, напротив, нетерпим к шумам (особенно к остаткам своего собственного голоса), но готов потерпеть возникающую иногда искусственность звучания нашего голоса. Соблюсти баланс между высоким качеством распознавания моделью и высоким субъективным качеством обработанного звука очень сложно. Поэтому мы используем два разных режима работы AEC: щадящий для общения с колонкой, агрессивный для звонков. А вот в режиме перебивания как раз нужен идеальный баланс сохранности голоса пользователя и отсутствия шумов — прежде всего звучания самой колонки. Дело в том, что в этом режиме модель распознавания тоже нетерпима к остаткам звучания голоса ИИ-помощника: он начинает срабатывать не только на голос пользователя, но и на собственные ответы, то есть сам себя перебивать.

Именно в силу того, что AEC для определения перебиваний настроен максимально жёстко, весь этот контур действует локально. Локальность позволяет перебиванию работать быстрее и точнее. Если бы мы использовали алгоритм в стандартной настройке, к которой адаптировано, например, распознавание речи на облачном сервере, VAD детектировал бы слишком много ложных перебиваний. А вот звук, который отправляется для распознавания в «облако», обработан уже алгоритмом в обычном режиме — иначе метрики модели бы ухудшились.

Когда колонка говорит, модель VAD ищет в очищенном AEC звуке голос пользователя. Если тот появляется, она сообщает, что ИИ-помощника перебили. Стриминг синтеза голоса останавливается — ИИ-помощник умолкает; открывается новый запрос на распознавание, начинается стриминг голоса в «облако» для распознавания — колонка слушает потенциальную команду.

LED-экран  

У СберБум 2.0 есть общее с одной из предыдущих колонок Сбер — SberBoom Home: LED-экран. На него можно выводить время, погоду, тайминг до напоминания, анимации самой колонки в ответ на реплики пользователя — например, загрустит, если сообщить ей, что боишься пауков. Или обрадуется комплименту. 

LED-экран расположен под ребристым корпусом и закрыт тканью. Выходит, светодиоды должны не только просвечивать сквозь ткань, но и создавать равномерное и цельное изображение на сложной поверхности. При этом нужно было решить, каким должен быть характер изображения: пиксельная графика или слитное свечение?

  1. Пиксельная графика: юзер видит отдельные светящиеся квадраты. Немного ретро-эстетика, которая напоминает о первых компьютерных играх и электронных табло.

  2. Слитное свечение: светодиоды визуально объединяются, графика выглядит неразрывной. 

Сравнив варианты, мы выбрали второй — он давал более законченное визуальное впечатление. Для оценки оптимального расположения светодиодов и в целом нужного эффекта распечатывали на 3D-принтере и тестировали разные формы концентрирующих свечение решёток. Дело в том, что корпус колонки в области экрана представляет собой своеобразный сэндвич: светодиодная плата с пенкой, затем концентрирующая свечение решётка. В свою очередь, решётка интегрирована в пластиковый корпус, который выступает рассеивателем, а он покрыт тканью. Сквозь все эти слои на наружную поверхность экрана должна приземляться нормальная проекция. 

Большой задачей оказалась геометрия решётки. Даже небольшое изменение формы отверстий на ней полностью меняло визуальное проекцию свечения: слитность графики, резкость.

Варианты решёток для LED-экрана
Варианты решёток для LED-экрана

Дисплей СберБум 2.0 — это матрица белых светодиодов разрешением 21 x 10. На каждом светодиоде отображается 256 градаций яркости благодаря микросхеме с независимым управлением яркостью. Она подключена к SoC устройства по интерфейсу spi, что позволяет обновлять весь дисплей менее чем за 1 мс. Доступ пользовательского ПО к экрану обеспечивает ядерный интерфейс фреймбуфера (Linux framebuffer). Преимущества этой подсистемы — простота для пользователя. За несколько системных вызовов ПО получает область памяти, в которой «рисует», далее драйвер сопоставляет пиксели и светодиоды, отправляет данные контроллеру. 

Работа с экраном

Подсистема фреймбуфера поддерживает двойную буферизацию и «дружит» с ещё одной полезной системой — backlight, экранной подсветкой. С её помощью можно настраивать яркость светодиодов независимо от основной отрисовки, например, по датчику освещённости. Он встроен в верхнюю панель и позволяет соотносить как яркость экрана, так и подсветку верхней крышки с освещением в комнате. Это диммирование можно включить или отключить в приложении. 

Для экрана дизайнеры разработали новую концепцию анимаций. В её основу лег образ феи Динь из мультфильма о Питере Пэне. Поэтому все анимации для колонки — в виде летающей точки, за которой рассыпается шлейф из волшебной пыльцы, словно за феей. Этот эффект есть даже в технических анимациях — иконках погоды и музыки. Графику, сделанную для предыдущей колонки, тоже дополнили волшебными искрами. В рабочих чатах концепцию изначально называли «эльфом».  

Наверху колонки располагается RGB-LED кольцо. Его первой версией была Direct Light — световод располагался прямо на верхней панели. Но это смотрелось скучновато. Поэтому мы ввели подсветку под верхнюю крышку. В подсветке три части: LED, внешний матовый пластиковый рассеиватель и прозрачный внутренний пластиковый.

Слева Direct Light, справа финальный вариант подсветки
Белая плата — для более яркого свечения при отражении. Справа можно увидеть прозрачный внутренний рассеиватель (пластик)
Белая плата — для более яркого свечения при отражении. Справа можно увидеть прозрачный внутренний рассеиватель (пластик)

О платах и модулях

В СберБум 2.0 три платы: материнская, микрофонная и LED-экрана. Разрабатывая их инженерную компоновку, мы уже знали, каким будет внешний дизайн устройства и акустическая схема — нужно было уместиться в заданные рамки и при этом учесть все механические и электрические требования. 

«Сердце устройства» (SoC + постоянная и оперативная память) на материнской плате диктует строгие правила для высокоскоростных цепей как для стабильной работы самого узла, так и для ограничения влияния на соседние части схемы. Плюс к SoC подключаются все периферийные устройства девайса. 

Wi-Fi/BT модуль нужно подключить короткой и помехозащищенной шиной данных, чтобы обеспечить высокую скорость и помехозащищённость этого интерфейса. Выходит, что он тоже должен располагаться на материнской плате… и что та получается довольно крупной.

В первом механическом дизайне колонки мы попробовали вынести Zigbee-модуль на микрофонную плату в верхнюю часть колонки, чтобы удалить от других компонентов (чем меньше преград на пути сигнала, тем лучше диаграмма направленности). Но когда добавили LED-кольцо по кругу микрофонной платы, эта идея отпала. Zigbee-модуль необходимо размещать на краю платы, а LED-кольцо оказалось слишком близко к нему. Поэтому Zigbee-модуль переехал на материнскую плату. На плате появился дополнительный выступ, где разместилось посадочное место под модуль.

Исходя из расположения динамиков в корпусе и общих размеров устройства подходящая зона для материнки, а также радиатора (SoC выделяет много тепла при высокой нагрузке системы), нашлась на «спинке» устройства. На той же плате разместили часть схемы аудиоусилителей и АЦП. Они снимают сигнал с динамиков, чтобы из сигнала с микрофонов можно было вычитать звук, проигрываемый самим устройством (loopback для правильной работы споттера). Размер платы позволил разместить массивные полигоны для питания усилителей, а также экранировать от наводок цепи АЦП.  

На передней части устройства расположен LED-экран, а значит, LED-плата. На ней расположен массив светодиодов — 10 строк, 21 столбец — и LED-драйвер для их управления. Плата должна повторять цилиндрическую форму корпуса, чтобы соответствовать механическому дизайну, поэтому её необходимо было сделать гибкой: в отличии от жестких плат, которые производятся на базе FR4 (стеклоткань + эпоксидная смола), она сделана на основе полиимидной пленки. 

На микрофонной плате есть:

  • четыре микрофона;

  • кнопки;

  • источник питания для LED-платы;

  • источник питания датчика движения;

  • RGB-светодиоды кольца-подсветки и драйвер для управления ими.

  В свою очередь, в материнскую плату входят:

  • SoC + оперативная и постоянная память;

  • два аудиоусилителя, к которому подключены динамики колонки;

  • два аналого-цифровых преобразователей; каждый АЦП имеет два канала, на один динамик нужен один канал.   

  • Zigbee-модуль, комбинированный Wi-Fi/Bluetooth модуль;

  • источники питания всех элементов платы.

Таким образом, на материнской плате располагаются Wi-Fi, Bluetooth и Zigbee. Все три технологии используют диапазон 2,4 ГГц, так что разработчик печатной платы должен минимизировать взаимные помехи и обеспечить стабильную работу всех радиоинтерфейсов. Поэтому Zigbee-модуль и комбинированную Wi-Fi/BT часть схемы разместили на противоположных концах материнской платы. 

Wi-Fi/BT часть включает в себя комбо-чип, который поддерживает два диапазона: 2,4 ГГц и 5 ГГц. После многочисленных тестов, конструктивных доработок и немного — оптимизации стоимости (куда без этого) для каждого интерфейса выбрали оптимальный тип антенны. Как по свойствам, так и внешне они сильно отличаются друг от друга:

  • Zigbee — PCB-антенна. Она выполнена в виде рисунка на печатной плате модуля.

  • Wi-Fi – двухдиапазонная FPC-антенна: гибкая печатная плата, которая приклеивается внутри на корпус колонки и подключается к материнской плате с помощью коаксиального кабеля и разъема.

  • Bluetooth — керамическая чип-антенна. Это чип-компонент (внешне его можно перепутать с резистором), область вокруг антенны в виде выреза меди во всех слоях печатной платы + рисунок меди на плате.

PCB-антенна, FPC-антенна, керамическая чип-антенна 
PCB-антенна, FPC-антенна, керамическая чип-антенна 

Для зоны между чипом и антеннами крайне было важно не размещать посторонних компонентов: только согласующие цепочки, диплексер (он объединяет два канала, 2,4 ГГц и 5 ГГц, чтобы подключить одну двухдиапазонную антенну) и 50-ОМные дорожки, которыми происходит подключение компонентов. Остальное пространство в этой зоне занято полигонами земляной цепи, чтобы избежать наводки на соседние цепи и уменьшить чувствительность к окружающим компонентам.

Работа без интернета

Даже если отключился Wi-Fi, устройство остаётся полезным. В памяти новой колонки можно сохранить примерно 200 треков для прослушивания без интернета. Достаточно выбрать в мобильном приложении Салют загрузку плейлиста «Любимое» из сервиса «Звук» на колонку. Она скачает треки, их можно будет прослушивать без интернета.

Кроме того, без Wi-Fi можно:

  • запускать голосом сохранённые треки и управлять их воспроизведением: включать следующую песню или предыдущую, менять громкость звука, перемешивать плейлист и зацикливать трек;

  • останавливать таймер или будильники;

  • включать или выключать bluetooth;

  • управлять устройствами умного дома, которые подключены к колонке по протоколам Zigbee и Matter. На старте будут поддержаны такие категории, как свет, реле, розетки, выключатели.

При этом СберБум 2.0 умеет обрабатывать синонимичные команды — например, выключить будильник без Wi-Fi можно как фразой «Достаточно», так и «Заткнись».  

Для реализации офлайн-команд на устройстве потребовалась отдельная локальная ASR-модель. В ней 233 млн параметров — так она удовлетворяет критериям и установки на устройство, и скорости инференса/потребления памяти. В общих чертах решение задачи локальной обработки похоже на реализацию быстрых команд. Стриминговая крохотная модель ASR в быстрых командах отрабатывает локально, решения по вызову навыка также принимаются на уровне устройства. 

Когда срабатывает споттер, в том числе кастомный, аудиопоток разбивается на короткие временные фрагменты и переводится в log-Mel-спектрограмму. Оно показывает, как энергия сигнала распределяется по частотным диапазонам во времени, в форме, удобной для акустической модели. Спектрограмма подаётся на вход акустической модели, куда входят энкодер и RNN-T декодер: первый обрабатывает спектрограмму, второй последовательно генерирует текст из BPE-токенов — фрагментов слов, которые алгоритм автоматически выделяет из текстов. 

Локальная модель обучена на том же датасете, что и серверная ASR-модель: размеченные пары «аудио + правильно распознанный текст». В том числе для каждой из команд, которые отрабатываются без Wi-Fi, были собраны корзинки синонимичных запросов, чтобы колонка узнала эту команду в любой формулировке. Модель проходит fine-tuning, чтобы выдавать более высокое качество как на целевых данных, так и в общем.

Сказать «Выключи будильник» можно примерно 40 разными способами
Сказать «Выключи будильник» можно примерно 40 разными способами

Транскрибированный текст передаётся в ещё одну локальную модель. Она на выходе определяет интент пользователя и выполняет команду на устройстве. Сейчас приоритет у обработки команды остаётся на «облаке»: если интернет есть, команда отработает там. Отмечу тут, что у офлайн-работы интеллектуальных устройств большие перспективы: локальная обработка позволяет одновременно уменьшить зависимость от качества соединения, сократить задержку ответа и объём запросов к «облаку».

Заключение  

В разработке технологичных устройств есть парадокс созидания: чем больше усилий вложено в детали, тем более цельным и простым выглядит итоговый продукт.

Пользователь должен увидеть СберБум 2.0, оценить как красивый объект, услышать объёмный насыщенный звук... и использовать функции устройства с удовольствием. Разрабатывая СберБум 2.0, мы ставили своей целью создать устройство с максимально гибкими настройками. Это не только кастомный споттер и офлайн-работа: у колонки можно выбрать один из трёх голосов, настроить стиль разговора, обращение на «ты» и «вы». Благодаря новому синтезу голоса ИИ-помощник звучит более человечно. Гибче и естественнее стал диалог: колонку можно перебить, задать ей уточняющий вопрос или несколько, не нужно каждый раз перед репликой называть споттерное слово. Словом, голосовое общение с искусственным интеллектом становится более комфортным и более личным — таким, какое нужно пользователю. А тысячи решений, споров, прототипов и экспериментов остаются внутри RnD процесса. Именно там инженерия перестает быть просто набором расчётов и превращается в искусство делать сложные вещи незаметными.

В подготовке статьи участвовали

Иван Возвахов, Евгений Берлин, Георгий Старк, Кирилл Беляков, Артём Соколов, Анастасия Верховая, Дмитрий Болотов, Максим Жданов