У нас есть ежегодная традиция: рассказывать читателям Хабра о разработке нового устройства с Алисой. 2020 год, конечно, разрушил многие планы, но эту традицию сохранить удалось.
Сегодня на YaC 2020 мы показали нашу новую колонку — Яндекс.Станцию Макс. Это не замена Станции или Станции Мини, а новая, старшая модель в семействе умных колонок Яндекса. В ней мы не просто поддержали более требовательные к железу возможности, но и сознательно отказались от некоторых компромиссов. В результате устройство, которое на этапе идеи должно было отличаться от Станции лишь в нескольких элементах, оказалось не похоже на неё примерно во всём, кроме внешнего вида.
Зачем и как мы этого добились — рассказываю в трёх историях. В качестве бонуса вы узнаете о непростой работе с производством в условиях пандемии.
История про звук
В посте про создание Яндекс.Станции мы рассказывали о том, как искали компромисс между воспроизведением звука и распознаванием голоса. У производителей обычной акустики такой задачи нет. Для нас же важно не только хорошо звучать, но и понимать речь человека. Поэтому в Яндекс.Станции мы пошли на достаточно необычное решение. Мы перенаправили воспроизведение средних частот на вуфер, который, в свою очередь, был направлен в противоположную от микрофонов сторону.
Благодаря этому мы уменьшили искажение человеческой речи, которая преимущественно состоит из тех же самых средних частот.
В более старшей Яндекс.Станции Макс у нас появилась возможность переосмыслить это решение. И на то было как минимум две причины.
Причина первая. Мы отказались от предыдущих, аналоговых микрофонов и заменили их цифровыми Knowles Everest. Важно сразу сказать, что противопоставление качества аналоговых и цифровых микрофонов само по себе лишено смысла, если, конечно, у вас нет цели погрузиться в многостраничный холивар между сторонниками противоположных точек зрения. Тем не менее наши новые микрофоны относятся к более дорогому сегменту, и, по нашему скромному мнению, это одни из лучших цифровых микрофонов для умных устройств. Они отличаются хорошей сбалансированностью: достаточно высокий уровень чувствительности одновременно с хорошим соотношением сигнал/шум и уровнем AOP (Acoustic Overload Point — это такой аналог максимального звукового давления для цифровых микрофонов). Можно найти микрофоны и с большей чувствительностью, но с низким AOP, из-за чего при высокой громкости услышать команды будет сложнее (понятно, что «слышать команду» — это комплексный процесс, на который влияет много факторов, но на уровне микрофонов мы постарались выбрать лучший вариант).
Кстати, переход на цифровые микрофоны позволил нам упростить конструкцию устройства за счёт отказа от отдельных аналогово-цифровых преобразователей. В Станции их было аж пять штук. Мелочь, а приятно.
Причина вторая. Технологии Яндекса в области распознавания речи и голосовой активации всё это время тоже не стояли на месте. Пожалуй, самое важное: мы отказались от моделей на базе DNN-HMM и перешли на архитектуру e2e-распознавания с использованием тяжёлых нейросетей-трансформеров. Это значит, что теперь мы не дробим речь на последовательность звуков, чтобы распознавать их по отдельности, а обучаем модель работать со всей фразой целиком. На это требуется значительно больше как вычислительных ресурсов, так и примеров для обучения, но и результат оказывается существенно лучше.
Итак, новые микрофоны, прогресс в голосовых технологиях и более смелый ценовой сегмент позволили нам пересмотреть архитектуру акустики в Станции Макс.
Мы добавили два новых динамика — для средних частот. Рядом с ними — фазоинверторы. Это такие акустические порты в корпусе, которые инвертируют звук с тыльной стороны динамика и выводят его на фронтальную часть, усиливая звуковое давление. Как правило, в умных колонках не используют фазоинверторы из-за экономии и стремления упростить конструкцию.
Новые динамики разнесли в разные стороны корпуса, тем самым добились более объёмного звука и честного стерео для средних частот. Кроме того, это нововведение позволило нам обновить и вуфер.
В Станции вуфер был сконструирован так, чтобы справляться и с басами, и с вокалом. Компромиссное решение. В Станции Макс мы добавили отдельные среднечастотные динамики, а значит, вуфер теперь можно было переориентировать исключительно на низкие частоты. Новый вуфер Станции Макс в связке с новым пассивным излучателем способен воспроизводить частоты от 45 Гц (по паспорту; по факту начинаем играть от 40 Гц).
При этом мощность всей акустики выросла до 65 Вт. На самом деле сумма мощностей всех элементов приближается к 90 Вт, но мы сознательно ограничили потолок на уровне источника питания. Потому что лучше использовать более мощные динамики в комфортных условиях, чем вгонять в предельные режимы работы более дешёвые варианты. К тому же 65 Вт — это уже очень громко.
Чтобы «раскачать» новые динамики, мы решили обновить и без того неплохие усилители, применяющиеся в Станции. В обоих случаях они от Texas Instruments, но в Станции Макс используется более свежая и мощная модель TAS5825M. В неё встроен более производительный DSP (Digital Signal Processor), который необходим для многоуровневой предобработки звука, например для функции с говорящим названием Smart Bass. Причём мы используем два таких усилителя. Первый работает по классической стереосхеме: к каждому каналу подключена пара из среднечастотного динамика и твитера. Второй — по параллельно-мостовой схеме (PBTL), то есть два канала соединены параллельно и отвечают за вуфер (запас мощности особенно важен для низких частот).
Все элементы нашей новой акустики спроектированы под Станцию Макс. Даже материал мембраны и глубина её посадки. Это важно, потому что чем больше амплитуда колебаний мембраны, тем больше максимальная длина волны звука и тем более низкие частоты она может играть. Если совершить ошибку на этом этапе, то на экстремальных режимах работы мембрана может начать касаться натянутой на корпус ткани. Этой проблемы мы избежали, но вот с некоторыми другими пришлось повозиться.
В Яндекс.Станции под тканью маскировались два компактных высокочастотных твитера и два пассивных излучателя. В Станции Макс и отверстий стало больше, и сами они тоже стали больше. Из-за этого мы столкнулись с проблемой, с которой раньше нам не приходилось работать. Акустическая ткань, которой обтянут корпус, имеет нехорошую тенденцию провисать над большими отверстиями. Как бы сильно вы её ни натянули, этого эффекта не избежать. Кроме того, под определёнными углами и при высокой яркости освещения отверстия становились различимы для глаз.
Эту проблему мы решили просто: выбрали более плотную ткань, которая существенно снизила качество воспроизводимого звука из-за более низкой проницаемости. Шутка! Для нас было важно сохранить то звучание, которого мы так долго добивались с помощью новой акустики. Пришлось немного попотеть, но подходящее решение нашлось. Мы добавили под ткань тонкую сеть с крупной ячейкой, которая практически не влияет на акустические характеристики, но удерживает ткань от провисаний и визуально маскирует начинку корпуса от любопытных глаз. Кроме того, возможность сохранить менее плотную акустическую ткань позволила нам реализовать нашу давнюю мечту — подарить Алисе визуальный язык. Но об этом чуть позже.
Ещё одна важная деталь про звук, которая относится ко всем трём моделям Станции. Мы достаточно часто встречаем пользователей, которые используют дома сразу несколько колонок. К примеру, Станция стоит у телевизора, а Станция Мини — на кухне. Теперь достаточно будет сказать: «Алиса, включи музыку везде», чтобы трек заиграл синхронно на всех ваших Станциях. Это изменение постепенно станет доступно на всех умных колонках Яндекса.
История про видео
Раньше на КиноПоиске 4K-контента было немного, но теперь его становится больше. Поэтому мы хотели дать возможность владельцам 4K-телевизоров смотреть фильмы и сериалы в соответствующем качестве через колонку с Алисой. Но одним лишь бэкендом эту задачу не решить.
Видео в 4К-разрешении существенно более тяжёлое, чем народное Full HD (спасибо, кэп). Чтобы оно не тормозило при загрузке, применяется более совершенный стандарт сжатия H.265, также известный как HEVC. Как вы уже догадались, в нём используются более сложные алгоритмы. Поэтому в Станции Макс мы перешли на платформу SoC Amlogic S905X2 вместо Allwinner R18. В её основе те же четыре ядра ARM Cortex-A53, но теперь они работают на большей частоте 1,8 GHz, к ним добавилась более мощная графическая подсистема Mali-G31 MP2. И, что самое важно: появилась встроенная поддержка новых кодеков, в частности HEVC 4K@60fps. Благодаря этому колонка уверенно справляется с воспроизведением 4К-контента. Оперативной памяти, кстати, тоже стало больше: 2 GB вместо 1 GB.
Уметь воспроизводить контент — хорошо, но его ведь надо ещё скачать из сети. Чтобы смотреть видео в разрешении 1080p, нужна скорость в 8−10 Мбит/c. Для 4K может потребоваться существенно большая пропускная способность — до 30 Мбит/с. Поэтому в Станции Макс мы поставили Wi-Fi-модуль 7265D2W от Intel. Он уже доказал свою надёжность при работе с 4К-контентом. Но так как домашняя беспроводная сеть далеко не у всех идеальна, добавили ещё и гигабитный Ethernet.
Электроника колонки полностью обновилась: если посмотреть на список ключевых компонентов, то пересечений со Станцией практически нет. Это отразилось и на внутренней конструкции устройства: мы не просто заменили один SoC на другой, но и разделили электронику на самостоятельные платы — их стало 6. Например, процессор и память теперь не соседствуют с электроникой усилителя и источника питания, а живут на отдельной плате. Разделение полезно, потому что ускоряет разработку, отладку и обслуживание, что особенно важно для такой сложной конструкции. Но при сборке устройства нас поджидал сюрприз.
Когда на DVT-этапе мы собрали на фабрике первые 20 колонок, которые следующим шагом уже должны были пойти в серию, оказалось, что даже у опытного инженера не получается произвести сборку быстро и точно. Это плохо не только из-за снижения скорости сборки новых устройств, но и из-за усложнения сервисного обслуживания. Надо было срочно искать решение.
В результате двух недель мозгового штурма оно было найдено: мы изменили метод соединения плат между собой, заменив гибкий шлейф на жёсткий разъём. Собирать колонку стало гораздо легче. Звучит просто, но для этого пришлось серьёзно изменить трассировку двух плат, затем заново их изготовить и тщательно проверить. И вот тут-то кроется главная мораль этой маленькой истории: любая, даже малозначительная на первый взгляд проблема, может существенно (на месяцы!) растянуть сроки разработки устройства, если выявить её слишком поздно. А выявить её на раннем этапе можно только тогда, когда разработчики устройства находятся в тесном контакте с фабрикой-производителем. На этапе отладки производства нужно буквально сидеть на соседнем стуле и смотреть, как твой прототип собирают в боевых условиях. Как вы понимаете, эпидемия коронавируса поломала все подобные процессы. Нам пришлось учиться налаживать производство «по зуму», расширять прототипирование в Москве, а затем терять время на пересылку прототипов. Это сложно, долго и дорого, но без этого нельзя выпустить хорошее устройство.
И ещё одна история про качество. Любой производственный конвейер включает этапы тестирования и приёмки. Причём тестировать надо не только устройство, но и каждую отдельную плату, чтобы собирать уже из проверенных компонентов. Эти этапы включают в себя серию тестов: как ручных, так и автоматических. К примеру, любая крупная фабрика проводит оптический контроль, чтобы убедиться, что электронные компоненты установлены именно туда, куда надо. Лучшие фабрики ещё и 3D-рентгенографию (жутко дорогая штука) используют, чтобы выявлять плохую пайку. У нас всё это было, но для нас этого было мало.
Приведу наглядный пример. Если в цепь питания памяти поставить конденсатор не на 22 мкФ, а на 10 мкФ, то даже достаточно дорогое, но стандартное тестирование не заметит никакого подвоха. Колонка даже будет прекрасно работать. До тех пор, пока при сильной нагрузке (на том же 4K-контенте) пульсация питания памяти не выйдет за границы допустимого коридора. Это, кстати, реальный пример с отладки производства, а не теория.
Поэтому мы сами разработали дополнительные тестовые стенды для конвейера. Для каждой нашей платы — своя разновидность стенда. Самое интересное в том, что мы не просто разработали их, но и производим в Москве, после чего отправляем на фабрику для использования на конвейере (про особенности пересылки и сборки в условиях коронавируса хотя бы здесь промолчу). Получается, что сама колонка производится в Китае по нашей конструкторской документации, но инструменты для точного контроля качества конвейера производятся в России. Согласитесь, необычная ситуация. Расскажем об этом подробнее в самостоятельной публикации, если сообществу будет интересна эта тема.
История про экран
Когда вы говорите с Алисой в телефоне, то видите карточки-ответы в чате. То есть воспринимаете информацию и слухом, и зрением. А вот когда обращаетесь к помощнику в умной колонке, то слышите только голосовой ответ. Это нормально: мы же и по телефону так же общаемся. Но «видеть» собеседника, а точнее, видеть с его стороны какой-то визуальный отклик многим из нас важно.
В новой колонке мы хотели дать Алисе визуальный отклик, подарить ей возможность доносить до пользователя информацию не только голосом. К примеру, не только проговаривать, но и показывать прогноз погоды. Или визуально подтверждать изменение громкости, установку лайка. Или использовать колонку как часы. Даже счётчик уведомлений пришёлся бы кстати. (Лично для меня важно видеть числа при установке будильника, но, возможно, я один такой параноик.) И всё это анимированно, а не в статике. И чтобы не менее 50 fps для плавности. Да, простых путей мы не искали.
В этот момент люди обычно представляют себе экран. Но если экран будет большой (например, как у планшета или ноутбука), то это будет уже другое устройство для других задач, ему не найдётся места у телевизора.
С другой стороны, если сделать маленький ЖК-экранчик, уместить его на корпусе Станции и выводить на него то же, что и в приложениях с Алисой, то никто на нём ничего не увидит. Это же колонка, а не смартфон, который держат в руках.
Итак, перед нами стояла следующая задача. Мы хотели дать Алисе возможность отвечать визуальными образами, которые считывались бы человеком из любого угла комнаты, но при этом внешний вид устройства не должен был пострадать.
Принципиальная идея родилась быстро: а давайте поместим экран под ткань! Проблемы с идеей начались буквально с первого же шага. ЖК-экран мы не используем: его никто под тканью не увидит. Поэтому решили делать светодиодный экран. Да, мы не первые, кто додумался до этого. Но кажется, мы первые, кто заморочился этим НАСТОЛЬКО глубоко. Сейчас всё расскажу.
Казалось бы, светодиоды — штука простая, экраны из них делают регулярно. Но нам пришлось обеспечивать высокие характеристики при необходимости минимизации цены, и поэтому ряд решений был отметён сразу. Например, адресные светодиоды WS2812 (первое, что пришло в голову) оказались слишком дорогими, и их решили не применять. Есть специализированные микросхемы для экранов — но ни одна нас не устроила: или частота кадров была недостаточная, или количество градаций невелико, или цена слишком высокая. Решили делать на микроконтроллере и буферах с регистрами.
Сначала экран хотели сделать цветным, с разрешением 13 × 13, с глубиной цвета 8 × 8 × 8 бит. Но всплыла проблема. Дело в том, что RGB-светодиод на самом деле состоит из трёх кристаллов – красного, зелёного и синего. Они расположены на расстоянии полумиллиметра друг от друга. И оказалось, что нам мешает ткань: она неоднородная, и нить может заслонять красный кристалл, оставляя видимыми зелёный и синий. Причём картина меняется от диода к диоду и ещё зависит от угла, под которым смотришь на экран.
Попытки применить рассеиватели тоже не привели к успеху: не удалось достичь хорошей картинки при ограниченной толщине конструкции. А ещё ткань бывает разных цветов… В общем, от цветных диодов мы отказались. Так и нагляднее (отлично просвечивает через ткань любого цвета), и конструкция проще (в три раза меньше кристаллов на пиксель).
Заодно решили увеличить разрешение: 13 × 13 – это маловато. Пробовали 15 × 15, 16 × 17, в итоге пришли к финальному решению — к разрешению 25 × 16. А это, на минуточку, 400 диодов!
Теперь про яркость. Обычно у диодных экранов не более 16 градаций цвета. Нередко — и того меньше: они или горят, или не горят. Но у нас должна быть плавная, красивая анимация, а для человеческого глаза 16 градаций — это очень скудно. Мы просто не увидим никакой плавности в изменении яркости. Так что была поставлена задача обеспечить глубину яркости 8 бит, то есть 256 градаций.
Первым делом построили классическую схему динамической индикации: картинка отрисовывается построчно, то есть в каждый момент времени горит только одна строка. При этом за счёт инерции зрения мы видим картинку целиком. Столбцы управлялись двумя микросхемами ICN2595: это 16-битный сдвиговый регистр со стабилизатором тока на каждом канале. А строки — двумя ICN2012: это 8-битный дешифратор с мощными транзисторами на каждом канале.
Но давайте поговорим о времени. 50 кадров в секунду — это 20 миллисекунд на кадр, а значит, 1,25 мс на строку. Поскольку количество градаций 256, за время отображения строки её нужно 256 раз по-разному перерисовать. Меньше 5 микросекунд на прорисовку каждого варианта! Это потребовало быстрого микроконтроллера с немалым объёмом памяти. Выбрали STM32F411.
Вот только всего строк 16, а значит, яркость картинки в итоге — лишь 1/16 от максимальной. Слишком тусклая получилась картинка! Попробовали поднять ток светодиодов со штатных 5 до 30 мА. Не помогло.
В конце концов мы решили отказаться от динамической индикации и перейти на управление каждым диодом. Убрали дешифраторы и установили 25 регистров. Включили их последовательно и получили 400-битный сдвиговый регистр со светодиодом на каждом бите. Это позволило обеспечить работу светодиода на штатном токе, а яркость по сравнению с динамическим вариантом возросла в 16 раз. Заодно снизились и требования к быстродействию микроконтроллера: теперь каждые 20 мс нужно перерисовать экран 256 раз, а не 16 × 256 раз.
С диодами разобрались — осталось разобраться с пикселями. На UX-исследованиях мы поняли, что символы на нашем экране воспринимаются людьми лучше, если пиксели расположены максимально плотно друг к другу, а не как у старого электронного будильника.
Но диоды нельзя расположить ещё ближе друг к другу: они и так крайне плотно соседствуют после решения увеличить разрешение. А значит, работать надо с оптическими эффектами. И вот тут-то начинается самое интересное.
Расстояние между пикселями возникает не потому, что этого кто-то хочет. Это следствие конструкции любого диодного экрана. Между диодами должна быть физическая перегородка, чтобы они не засвечивали друг друга. Поэтому поверх платы с диодами накладывается пластина с отверстиями-световодами.
Казалось бы, сократите толщину стенок между отверстиями на пластине — и дело в шляпе. Но в реальном мире приходится плясать от технологического процесса производства пластины. И отлить из пластика пластину так, чтобы толщина стенки была меньше, чем 0,4 мм, просто не получится. А любые альтернативные варианты будут неприлично много стоить.
Мы пошли другим путём. Наше решение заключается в том, чтобы форма световодов напоминала усечённую пирамиду. Их ширина на выходе больше, чем у основания. В результате световое пятно увеличивается, а расстояние между пикселями визуально уменьшается.
Более того, поверх всего экрана мы поместили рассеивающую плёнку, чтобы добиться ещё большей плавности в отрисовке букв и цифр. Тут, кстати, тоже пришлось повозиться, потому что разные материалы плёнки совершенно по-разному ведут себя с разными образцами акустической ткани с точки зрения пропускаемого света. Но результат того стоил.
Вот такой вот бутерброд. И всё ради того, чтобы изображения, текст и числа выглядели более естественно.
Но визуальный язык — это не только железо. Когда мы начинали, то думали примерно так: 25 × 16 — это размер, который ближе к фавиконке, он в три раза меньше, чем разрешение экрана у Nokia 3310. Нужен был новый визуальный язык для сверхмалых разрешений, чтобы ответы Алисы выглядели естественно. Этого мы добились с помощью нескольких хитростей. По максимуму отказались от статичных фреймов. По краям добавили полупрозрачные пиксели для смягчения резкости изображения. Комбинация простая и логичная: невысокое разрешение компенсируем высоким fps, глаз просто не успевает зацепиться за пиксели. При этом для системных уведомлений и цифр выбрали обычный пиксель-арт, чтобы сохранить их наглядность в статике.
Теперь, когда пользователь будет уточнять погоду, менять уровень громкости или решать множество других задач, Алиса сможет не только проговорить ответ голосом, но и показать.
И ещё кое-что. Алису отличает её эмоциональность. В режиме «болталки», когда она стремится поддерживать диалог, ответы могут нести явный эмоциональный оттенок. Теперь эти эмоции мы сможем передать и визуально. Можно сказать, что это наш самый смелый шаг во всём проекте: раньше Алиса передавала эмоции исключительно голосом.
Заключение
Одним постом весь проект даже близко раскрыть не получится (если интересно узнать о чём-то подробнее, то пишите вопросы, а мы попробуем посвятить им отдельные посты). Но надеюсь, удалось подчеркнуть основное. Станция Макс — это не апгрейд Станции, а новая, старшая модель, которая прошла самостоятельный (и крайне непростой в условиях пандемии) цикл разработки, получила новый, трёхполосный стереозвук, поддержку 4K, LED-экран и даже пульт.
Если у вас уже есть колонка с Алисой, то рекомендую заглянуть в уютный чат и новостной канал сообщества пользователей Яндекс.Станции. Для пользователей это хороший способ обмениваться опытом, а для нас — видеть и чувствовать то, что волнует сообщество. К примеру, мем с пожеланием дать возможность подключать свою акустику мы заметили и добавили порт AUX OUT в Станцию Макс.
Автор: Тимур Гаскаров