
Голосовая активация в умных колонках — задача в целом решённая: несколько микрофонов, стабильное питание от розетки, хороший процессор. А вот перенести то же самое в наушники оказалось совсем другой историей.
Крошечный аккумулятор, мало памяти, чип с жёсткими ограничениями по тактовой частоте, да ещё и с кое‑какими неожиданным сюрпризами на уровне SDK. Всё это потребовало переосмыслить с нуля архитектуру споттера (компонента, который распознаёт обращение «Алиса» прямо на устройстве).
Меня зовут Григорий Афанасенко, я работаю в команде голосовых технологий Яндекса. Сегодня мы запустили Яндекс Дропс — первое носимое ИИ‑устройство с Алисой AI. В этой статье я расскажу, как мы адаптировали споттер под железо наушников, какие решения пришлось принять, где мы наступили на грабли и что планируем делать дальше.
Выбираем чип
Споттер работает постоянно: пока наушники надеты, модель непрерывно ищет ключевую фразу в окружающем шуме. Ни один из доступных нам CPU с такой задачей в реальном времени просто не справился бы. Поэтому мы выбрали чип с NPU (Neural Processing Unit). NPU заточен под вычисления нейросетей и ест при этом значительно меньше энергии. Но и у него есть потолок, так что просто перенести модель со смартфона не вышло бы.
Характеристики CPU:
Размер кеша для инструкций — 4 КБ, размер кеша для данных — 8 КБ.
Поддерживает DSP и ускоритель FPU.
Память:
Встроенная память SRAM объёмом 208 КБ.
Внутренняя флеш‑память SPI NOR объёмом 256 КБ / 512 КБ / 1 МБ в корпусе SIP (позволяет выполнять код (XIP) непосредственно из флеш‑памяти).
NPU:
Поддерживает DNN/CNN/DS‑CNN/LSTM/GRU и другие популярные модели.
Поддерживает 8-битное квантование и сжатие весов.
Компилятор поддерживает прямое преобразование из TensorFlow (преобразование из PyTorch происходит сначала через конвертацию в TensorFlow).
Правда, NPU нам тоже подбросил неприятные сюрпризы из‑за особенностей своего SDK, которые в итоге даже повлияли на архитектуру модели. Но об этом чуть позже.
Оптимизируем энергопотребление
Даже с NPU гонять споттер непрерывно расточительно. Поэтому пайплайн работает в два этапа.
Сначала — VAD (Voice Activity Detector): лёгкая модель, которая отделяет голос от фонового шума. Крутится постоянно, почти ничего не стоит. Споттер включается, только когда VAD услышал голос, и уже разбирается, «Алиса» это или нет. Нагрузка на систему упала в 5 раз по сравнению с постоянной работой споттера.
Мы замерили показания VAD на комнатных данных длиной 7,5 часа и получили, что он работает около 15% от общего времени — это показывает его полезность. При этом VAD устроен достаточно просто: он работает на основе FFT. Также VAD умеет автоматически адаптировать чувствительность в зависимости от уровня шума:
Тихая обстановка (уровень 3): максимальная чувствительность.
Умеренный шум (уровень 2): средняя чувствительность.
Шумная обстановка (уровень 1): минимальная чувствительность.
Дополнительная экономия — режим master‑slave. В каждый момент времени голосовой активацией занимается только один наушник, второй уходит в режим пониженного энергопотребления. Если заряд одного снижается, роли меняются. Синхронизация по Bluetooth, нагрузка минимальная. В итоге потребление на голосовую активацию сократилось в 1,8–2 раза по сравнению с параллельной работой обоих наушников.
Сжимаем модель
Модели из пайплайна умных колонок точные, но тяжёлые — порядка 1,7 МБ. В наушники они в исходном виде никак не влезут. Так что нужно было ужать модель до размеров, которые NPU переварит, не убив качество распознавания. Помогло то, что расположение наушников относительно рта и расстояние до микрофона практически не меняются: входной сигнал стабильнее, чем у колонки в комнате, а значит, агрессивные оптимизации теряют меньше точности.
Нам пригодилось три инструмента:
Depthwise‑separable convolution. Обычная свёртка считает всё сразу — пространственные зависимости и связи между каналами. Depthwise‑separable разбивает это на два шага. Число параметров падает примерно в 20 раз, качество почти не страдает.
Дистилляция знаний. Взяли большую модель‑учителя из пайплайна колонок и обучили лёгкую модель‑ученика на её предсказаниях. Меньше параметров, качество держится.
Квантование в 8 бит. Веса модели хранятся не в 32-битном формате, а в 8-битном: размер в 4 раза меньше. Потерю точности компенсирует калибровка.
В итоге модель уместилась в ~200 КБ.


Преодолеваем особенности SDK
SDK производителя чипа конвертирует модели из TensorFlow и PyTorch в формат NPU, но накладывает жёсткие ограничения на архитектуру. Размер ядра свёртки определяет, насколько широкий контекст модель видит за один шаг: чем меньше ядро, тем ýже «окно». SDK ограничивает его до 15 фреймов для обычных свёрток и до 11 фреймов для depthwise (1 фрейм = 10 мс звука).
Padding позволяет сохранять размерность на выходе слоя, но SDK его не поддерживает, поэтому размерность уменьшается на каждом шаге. Hardswish — функция активации, которая улучшает качество споттера по сравнению со стандартными альтернативами, и при этом достаточно быстрая, — её SDK тоже не поддерживает.
Ограничение на размер ядра вынудило делать сеть глубже: только так удавалось набрать нужный контекст для споттера. Вместо Hardswish выбрали ReLU — простую функцию, которая хорошо ведёт себя после квантования. Другие варианты тоже пробовали: после квантования качество заметно падало.
Глубокая сеть плюс ReLU дали предсказуемую проблему — затухание градиента: сигнал об ошибке слабеет с каждым слоем, нижние слои почти не обучаются. Перешли на residual‑архитектуру — качество выросло. Отсутствие padding уменьшает временнýю размерность на каждом слое, так что пришлось нестандартно прокладывать residual‑связи, чтобы размерности сходились.
Другая особенность NPU — возможность запускать модели в стриминговом режиме. Это позволяет выиграть память, выделяемую под изначальный буфер звука и промежуточные активации, а также ускорить время инференса модели за счёт сокращения размера окна входных признаков. Поначалу мы не использовали эту возможность, поскольку считали, что она работает только с рекуррентными моделями. Однако позже мы потратили много времени на чтение кода SDK чипа и эксперименты с ним, чтобы разобраться, как мы можем утилизировать стриминговую возможность для наших моделей. Это позволило увеличить модель в 2 раза!
Отказываемся от отдельной модели для быстрых команд
В колонках, помимо «Алисы», есть быстрые команды — «Громче», «Тише», «Дальше» и другие. За них отвечает отдельная модель: её удобно улучшать и деплоить независимо. Для наушников две модели — двойная нагрузка на память и вычисления, которых и так мало.
Объединили всё в одну сеть. Споттер должен реагировать быстро и экономно — точно распознавать похожие по звучанию фразы. При объединении модель растёт, а ложные срабатывания на похожие слова становятся реальной проблемой.
Чтобы модель равномерно обучалась всем командам, мы перебалансировали датасет так, чтобы упоминание каждой команды было примерно одинаковое. Мы воспользовались большим ансамблем серверных моделей и моделей споттера, который позволил разметить на записях сложные активации в шумах.
В итоге перебалансировка датасета и дистилляция из общего ансамбля помогли решить проблему сращивания двух моделей.
Собираем данные для обучения
Аудио с наушников логируется в формате Opus. Это сжатый кодек, поэтому запись в логах отличается от сигнала, который модель получает в реальном времени. При кодировании часть информации теряется, а в сигнале появляются артефакты, которых не было в исходном аудио.
Логировать несжатый PCM в нашем случае нельзя: для этого не хватает пропускной способности и памяти. Поэтому обучающие данные неизбежно содержат следы сжатия, и модель должна быть к ним устойчива.
На старте разработки мы столкнулись с проблемой холодного старта: у нас не было данных с самих наушников, а собрать их в условиях, приближенных к реальности, — история долгая. Тем временем лабораторные данные страдали из‑за акустики, которая отличалась от реальной: например, из‑за отсутствия шумов окружающей среды.
В итоге для получения «живых» данных мы создали группу асессоров — людей, которым мы выдали наушники, чтобы собирать для нас данные. Таким образом через три месяца активного использования наушников этой тестовой группой у нас оказалось ~300k записей. К тому же было много интересных кейсов: сильные задувания ветра в микрофон во время езды на электросамокатах и велосипедах, внешняя речь из громкоговорителей в метро, на вокзалах и так далее
Однако и этих данных было мало, поэтому мы использовали различные аугментации звука: применяли pitch‑аугментации, шатали громкость и накладывали лёгкие синтетические шумы. Помимо этого, во время обучения мы использовали SpecAugment, чтобы сделать модель ещё более устойчивой к шумам, аудиоискажениям и громкости.
При этом у нас есть много данных для обучения с колонок и других девайсов, которые было логично переиспользовать. Именно поэтому мы учим наши модели в две стадии: сначала на огромном числе колоночных данных, а затем на данных с наушников. Но у колоночных данных была одна проблема: в них нет нужных нам внешних шумов. Поэтому мы накладывали на записи такие шумы из специальных датасетов.
И отдельная история, которая стоила нам месяца работы.
В какой‑то момент мы обнаружили, что новые модели, которые показывали улучшение в офлайн‑тестах, в самих наушниках работали плохо. Перебирали гипотезы одну за другой и в итоге нашли: в процессе логирования было 10-кратное расхождение громкости между тем, что слышит модель, и тем, на чём она обучалась. Модель слышала сигнал значительно громче, чем ожидала. Это приводило к переполнению целочисленного типа, и модель буквально «глохла». Нашли, исправили — и качество резко пошло вверх.
Измеряем качество
Качество споттера мы оценивали по двум метрикам: FAH (False Alarms Per Hour) — число ложных срабатываний в час; FRR (False Rejection Rate) — доля пропущенных корректных активаций. Чем ниже оба, тем лучше, но между ними всегда компромисс: снижая FAH, рискуешь поднять FRR.
Сценарий |
FAH (ложных активаций/час) |
FRR (доля пропущенных активаций) |
Тихая комната |
0,13 |
5% |
Улица (шум города) |
0,32 |
7% |
Транспорт (метро, автобус) |
0,02 |
15,4% |
Разговор на фоне |
0,9 |
7,3% |
Что дальше
Мы планируем работать в двух направлениях:
Фильтрация внешних активаций. Иногда споттер срабатывает на посторонние фразы: «Следующая станция» в метро — классика (чтобы можно было спокойно ездить в транспорте, мы отключили эту команду). Планируем подключить технологию Speak‑to‑Chat, которая отличает голос пользователя от звуков вокруг. Первые эксперименты уже есть, но технология требует доработки.
Верификация на телефоне. После срабатывания споттера на наушниках более крупная модель на телефоне перепроверяет сложные случаи. Маленькая модель не всё вытягивает — большая поможет исправлять то, что осталось.
Наушники не колонка без провода. Каждый слой стека добавил свои ограничения: железо, SDK, данные. Где‑то нашли готовое решение, где‑то пришлось изобретать: например, нестандартно прокладывать residual‑связи или месяц искать баг с громкостью. В итоге получился споттер в ~200 КБ, который работает на NPU с допустимым влиянием на батарею и справляется с реальными сценариями — от тихой комнаты до шумной улицы.
Комментарии (12)

denis_odinets
09.06.2026 08:47Да, наушники получились классные, но огорчает цена. Я месяц назад купил Яндекс.Стрит. Он обошелся мне на 1 тысячу дешевле чем данные наушники. Конечно на старте продаж и Стрит стояла 2 раза дороже. Но что делать, придётся подождать. Может еще попробуете сжать не только ИИ модель, но и цену?

ksaa79
09.06.2026 08:47А вот вопрос. Яндекс дропс. Открывал статью, думая совсем о другом. Но понял, что это наушники. Тут вот в комментах еще Яндекс стрит упомянули. Я вообще не в теме, но как из названий моделей понять, какая выше-ниже в линейке?

konst90
09.06.2026 08:47Споттер работает постоянно: пока наушники надеты, модель непрерывно ищет ключевую фразу в окружающем шуме.
А отключить это можно? Или надо смириться с тем, что раз в несколько часов наушники будут случайно в окружающем шуме ловить ключевое слово и что-то делать?

QDeathNick
09.06.2026 08:47Да, было бы правильно отключать это в приложении или даже тактильно.
Прям бесит. что гугл не даёт возможности отключить своего андроид помощника.

Lord_of_Rings
09.06.2026 08:47гугл не даёт возможности отключить своего андроид помощника.
Зависит от оболочки. На OneUI (Samsung), например, можно отключить

mydigitalhabb
09.06.2026 08:47Путин бомба взрыв чеченцы - включает логгирование напрямую товарищу майору ?
Imperius14
Оч интересная статья, спасибо