Если вы пользуетесь голосовыми ассистентами — Алисой, Siri, Google Assistant — ваш голос каждый раз отправляется в облако. Там он распознаётся, и ответ приходит обратно. Работает неплохо, но нужен интернет, есть задержка, и по сути вы передаёте свой голос на чужие серверы. А что на самом устройстве? Здесь пока всё скромно: либо дешёвые чипы, которые знают десяток заученных команд типа «включи свет», либо мощные процессоры, которые быстро расходуют батарею и не подходят для компактных устройств.

Между этими крайностями — пустое место: распознавание произвольной речи прямо на устройстве, без облака, с низким потреблением. Недавно появились микроконтроллеры MCU со встроенным нейроускорителем NPU. Я стал разбираться — может ли такой чип закрыть этот разрыв? Изучил доступные публикации и проекты — готовых решений, которые бы это делали, я не нашёл.

Из чего состоит система

Я реализовал ключевую часть системы распознавания речи на микроконтроллере STM32N6 со встроенным NPU.

Рисунок 1. Разделение системы на акустическую модель, декодер и блок рескоринга.

Подход, который я использовал, разбивает распознавание на три части — это позволяет сэкономить оперативную память и улучшить конечную точность:

  • Акустическая модель — наиболее ресурсоёмкая часть. Принимает сырой звук с микрофона и превращает его в поток фонем (мельчайших неделимых звуков, образующих человеческую речь).

  • Декодер — собирает из фонем слова, опираясь на словарь и правила языка.

  • Рескоринг — перепроверяет результат и выбирает наиболее вероятную фразу с учётом контекста.

Пока я сделал и протестировал именно акустическую модель — это фундамент, без которого остальное не имеет смысла. Декодер и рескоринг компактнее, над ними работаю сейчас.

Демонстрация работы

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

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

Энергопотребление

Рисунок 2. График потребляемой мощности при активной работе NPU.

Здесь, пожалуй, самый приятный результат — энергопотребление. Всё устройство при активном распознавании речи потребляет всего ~0.215 Вт:

Компонент

Потребление

NPU + ядро (Cortex-M55)

160 мВт

Внешняя память (Flash + PSRAM)

45 мВт

Внешние пины микроконтроллера

~10 мВт

Итого

~215 мВт

И это без какой-либо оптимизации. Я пока не занимался снижением потребления — запустил как есть. Ядро Cortex-M55 сейчас считает только мел-спектрограмму и в работе нейросети не участвует, поэтому его можно переводить в спящий режим или снижать частоту. А NPU загружен на 10.4% — тоже есть куда оптимизировать.

В реальном сценарии (проснулся по ключевому слову → распознал → заснул) фоновое потребление будет минимальным. От батареи такое устройство сможет работать долго.

Сигнал на входе модели: датасет и микрофон

Рисунок 3. Мел-спектрограмма фрагмента речи из датасета LibriSpeech.

Рисунок 4. Мел-спектрограмма того же фрагмента, записанного микрофоном устройства.

На рисунке 3 — мел-спектрограмма из LibriSpeech (датасет, на котором обучалась модель), на рисунке 4 — тот же фрагмент, но записанный микрофоном отладочной платы. Запись воспроизводилась через динамик телефона. Тем не менее, основные структуры речи сохранены, и модель получает вполне рабочий сигнал. Шума на реальной записи больше — пока никакой фильтрации перед подачей в нейросеть не применяется. Шумоподавление — один из ближайших шагов.

На что способна модель - результаты точности

Метрика

Значение

Размер модели

8.5 млн параметров

PER (dev_clean)

5.3%

PER (dev_other)

14.4%

Потеря точности при квантовании

0.4% (dev_other) / 0.15% (dev_clean)

Время инференса NPU

52 мс на 500 мс аудио

Итоговая Латентность

985 мс

Где: dev_clean — более чистые валидационные записи LibriSpeech, dev_other — более сложные и шумные записи, в том числе с акцентами. Соотношение 2,5 ожидаемо и коррелирует с опубликованными результатами других моделей.

Качество акустической модели измеряется метрикой PER (Phone Error Rate) — это доля ошибок в распознанных фонемах. Чем ниже — тем лучше модель «слышит» звуки, из которых потом декодер собирает слова.

Обучение проводилось на полном LibriSpeech, затем модель была квантована до int8 — потеря точности минимальная. Цифры в таблице — не с компьютера, а с самого устройства: весь валидационный датасет был прогнан через NPU, результаты забирались по UART и метрика рассчитывалась на ПК. Это реальные числа, полученные на целевом железе.

Про задержку: 985 мс — это полная латентность, из которых 485 мс занимает «окно в будущее» (модель подглядывает вперёд, чтобы точнее предсказывать фонемы).

Сравнение с другими решениями

Сравнивать напрямую сложно: у меня метрика PER (ошибки на уровне фонем), а в большинстве статей приводят WER (ошибки на уровне слов). WER зависит не только от акустики, но и от декодера и языковой модели — так что это разные вещи. Но для общего понимания я собрал результаты моделей похожего и большего размера:

Модель

Размер

PER (test_clean)

WER (dev_clean)

WER (dev_other)

WER (test_clean)

STM32N6 NPU acoustics model

8.5M

5.51

wav2vec 2.0 Base

95.04M

5.74

6.43

wav2vec

32.54M

31.58

15.86

HuBERT Base

94.68M

5.41

6.42

QuartzNet 5x5

6.7M

5.39

15.69

7.53

QuartzNet 10x5

12.8M

4.14

12.33

Что стоит отметить: при 8.5M параметров модель показывает PER 5.51% на test_clean. Это сопоставимо с wav2vec 2.0 Base (5.74%) и HuBERT Base (5.41%) — при том что они в 11 раз больше. И ни одна из них не работает на микроконтроллере. Данная модель — единственная в этой таблице, которая целиком выполняется на NPU в реальном времени.

Точность указана для расширенного набора фонем из 72 символов, что является более сложной задачей по сравнению со стандартными наборами из 39-44 фонем.

Планируемые результаты с декодером: при добавлении фонемного декодера ожидаемая точность WER ~16-25% на сложном датасете LibriSpeech dev_other при итоговом размере системы около 8-16M параметров.

Потенциал и запас роста

Рисунок 5. Текущая загрузка ресурсов MCU RAM и доступный запас для масштабирования модели.

По сути, я пока использую малую часть возможностей этого чипа.

RAM занята на 18%. В ней размещены только параметры активации — значит, модель можно увеличить примерно в четыре раза, не меняя железо.

NPU загружен на 10.4%. Вычислительный запас огромный — можно ставить модель посложнее или гонять параллельные задачи.

Энергопотребление пока не оптимизировалось. Текущие ~0.2 Вт — это с ядром на полной частоте и без спящих режимов. Есть значительный запас для снижения.

Сейчас я работаю над фонемным декодером и языковой моделью. Декодер будет видеть вероятности всех фонем на каждом шаге и выбирать наиболее вероятные слова — это должно заметно поднять точность.

Также в планах — фильтрация шума перед нейросетью. Пока она отсутствует, и в шумных условиях модели приходится работать с «грязным» сигналом.

Где MCU с NPU может заменить облако

Стоит сразу обозначить границы: это не замена Siri или Алисе. Диктовать длинные тексты в микроконтроллер не получится — для этого нужны модели от 100 МБ, которые на такой платформе просто не поместятся.

Но вот что система уже умеет и чего не умеет классический KWS (keyword spotting): она распознаёт произвольные слова и фразы. Не нужно заучивать команды. Можно сказать «сделай потеплее», «прибавь градусов пять» или «температуру вверх» — и всё это будет интерпретировано как одно действие. Обычный KWS так не может: он ждёт точного совпадения с шаблоном.

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

Умный дом без облака. Управление светом, климатом, техникой — но не заученными командами, а нормальной речью. «Сделай в зале поуютнее», «на кухне слишком ярко», «в детской чуть потеплее» — система разбирает фразу и понимает, что вы хотите, в какой комнате и какой параметр менять. И ни одно слово не уходит за пределы дома.

Голосовой ввод данных — показания счётчиков, результаты измерений, коды. Можно говорить как удобно: «давление сто тридцать два», «на манометре сто тридцать два» — система извлечёт число. Когда оператор работает в перчатках или руки заняты — это существенно упрощает процесс.

Промышленное оборудование. Здесь не просто «старт/стоп» — а команды с параметрами: «подать заготовку на позицию три», «скорость двадцать процентов». Оператор не отходит к панели, а управляет голосом прямо у станка.

Медицинские устройства. Тонометры, глюкометры, браслеты. Пациент может проговорить контекст: «после еды», «утром натощак». Это проще, чем тыкать кнопки, и смартфон рядом не нужен.

Склад и логистика. Сотрудник с занятыми руками диктует в гарнитуру: «на полке Б двенадцать — три коробки», «это брак, убери». Устройство разбирает фразу и извлекает ячейку, количество, действие.

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

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

Устройства для людей с ограниченными возможностями. Управление коляской, протезом голосом. «Поедем вперёд», «немного левее», «останови» — работает так же, как формальные «движение вперёд», «стоп». Здесь особенно важно, что устройство автономно и обеспечивает длительную работу от аккумулятора.

Заключение: так смогут ли заменить?

На текущий момент работает акустическая модель, которая распознаёт фонемы произвольной речи на микроконтроллере — в реальном времени, без интернета, потребляя ~0.2 Вт. Для диктовки текстов она не подойдёт, но для голосовых команд, ввода данных и управления устройствами — вполне достаточна. Там, где облако избыточно, а KWS слишком примитивен, микроконтроллер выигрывает ещё и по цене: чип дешевле микропроцессора, потребление ниже в разы, а разработка проще — не нужна тяжёлая аппаратная платформа и сложный программный стек.

Дальше я планирую реализовать фонемный декодер и языковую модель — чтобы из фонем получались нормальные слова и фразы. Плюс, оптимизировать потребление и добавить шумоподавление. С каждым из этих шагов MCU с NPU будут отбирать у облака всё больше задач, где важны автономность, приватность и работа без интернета.

Ресурсы