Смогут ли микроконтроллеры с NPU заменить облако для распознавания речи?

от автора

Если вы пользуетесь голосовыми ассистентами — Алисой, 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 5×5

6.7M

5.39

15.69

7.53

QuartzNet 10×5

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 будут отбирать у облака всё больше задач, где важны автономность, приватность и работа без интернета.

Ресурсы

ссылка на оригинал статьи https://habr.com/ru/articles/1022384/