Ранее я писал о распознавании фонем на микроконтроллере STM32N6. Тогда слова собирались из фонем по заранее заданной таблице. Теперь удалось реализовать модель, которая преобразует звук сразу в буквы. Таблица больше не нужна: плата может распознавать любые английские слова, а не только заранее заданные. Все вычисления по-прежнему выполняются на самом микроконтроллере - без сети и сервера, при потреблении около 0,2 Вт во время вычислений.

Текущий результат можно оценить на видео ниже.

Ошибки в субтитрах отмечены красным, чтобы было проще оценить точность распознавания. Источник звука находился в метре от микрофона, громкость у источника составляла 55-60 дБ. Для видео я выбрал сгенерированный голос, так как у меня сильный русский акцент, а такая речь была недостаточно представлена в обучающих данных.

Во второй записи звучат команды для умного дома - с ними модель справляется заметно лучше.

В пяти бытовых командах подряд (79 слов) модель допускает только одну ошибку.

То же самое можно запустить у себя: для этого нужны отладочная плата STM32N6570-DK и кабель USB-C. Исходный код, модель и готовый образ доступны на GitHub, а инструкция по прошивке лежит в том же репозитории, в docs/flash.md. Плата стоит около 200 долларов, но это цена отладочного комплекта с экраном и обвязкой; сам микроконтроллер стоит меньше 14 долларов.

Чем это отличается от других решений

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

  • Дешёвые чипы работают без сети, но знают десяток заранее заданных команд, и пользователю приходится помнить, как именно их произносить.

  • Облачные сервисы понимают свободную речь, но им нужна связь, и всё сказанное уходит на сервер.

  • Микропроцессоры обходятся без сети, но обычно потребляют ватты. Есть китайские процессоры на Cortex-A и RISC-V, сопоставимые по цене с STM32N6 и с большим объёмом встроенной оперативной памяти. Однако эта память в несколько раз медленнее, что критично для таких моделей. В STM32N6 SRAM напрямую подключена к NPU по широкой шине, что позволяет передавать данные с минимальной задержкой.

    Производительность классического Cortex-A7 на 1 ГГц при выполнении int8 MAC составляет около 5-16 GOPS против 600 GOPS у STM32N6. При этом потребление сопоставимо с потреблением микроконтроллера без оптимизации энергозатрат. Благодаря ядру Cortex-M и соответствующей периферии переводить микроконтроллер в энергосберегающий режим между вычислениями быстрее и проще.

    Также остаётся открытым вопрос, смогут ли такие микропроцессоры рассчитывать подобные модели в реальном времени. Встроенный в STM32N6 Cortex-M55 со сходным числом операций int8 MAC за такт на частоте 0,8 ГГц не справился: обработка занимала втрое больше времени, чем длилась сама запись. У некоторых процессоров, например K230 и Allwinner V851s, есть собственный NPU. Решения на них могут быть интересны, но оценить их энергопотребление и пригодность для этой задачи можно только на практике. Это всё ещё спорная тема, требующая реальных экспериментов.

  • FPGA. Здесь у меня недостаточно знаний и опыта, чтобы делать уверенные выводы. На мой взгляд, на FPGA можно реализовать нечто похожее на NPU с большим числом параллельных вычислений. Но такое решение, скорее всего, будет дороже и менее энергоэффективно, чем отлитый в кремнии NPU. ASR-модели с разрядностью ниже 8 бит, вплоть до однобитных, требуют отдельного исследования: даже переход к 8 битам уже заметно сказывается на точности небольших ASR-моделей. Буду рад, если поправите меня или приведёте результаты реализации подобных систем. У ASR своя специфика, поэтому напрямую переносить результаты других типов моделей на распознавание речи нельзя.

Микроконтроллер с NPU позволяет распознавать свободную речь без сети и Linux при потреблении менее 0,2 Вт. Это потребление можно ещё значительно снизить. Микроконтроллер быстро уходит в сон, а разработка и интеграция проще, чем у микропроцессорного решения. Широкий набор периферии позволяет параллельно выполнять другие задачи в реальном времени. При этом точность распознавания ещё далека от той, которой можно достичь.

Насколько точно модель распознаёт речь

Теперь, когда модель распознаёт слова, а не отдельные фонемы, её точность можно сравнить с другими открытыми моделями распознавания речи. Для сравнения я взял QuartzNet и Citrinet-256 - они близки к ней по числу параметров. Более крупные wav2vec, wav2vec 2.0 Base и HuBERT Base оставил из предыдущей статьи, чтобы показать разницу в размере и точности.

В таблице ниже приведён WER — доля ошибок при распознавании слов, выраженная в процентах. Чем меньше значение, тем лучше. Все результаты получены без языковых моделей. Свою модель, CynipsNet, я проверял с жадным декодированием - так же, как она работает на плате.

Модель

Параметры

dev-clean *

dev-other *

test-clean *

dev_other_50cm **

dev_other_250cm **

wav2vec

32,54 млн

—

—

15,86

—

—

wav2vec 2.0 Base

95,04 млн

—

—

6,43

—

—

HuBERT Base

94,68 млн

—

—

6,42

—

—

QuartzNet 5x5

6,7 млн

5,39

15,69

7,53

—

—

QuartzNet 10x5

12,8 млн

4,14

12,33

—

—

—

Citrinet-256 [3]

9,8 млн

—

—

3,78

—

—

CynipsNet, базовая

7,2 млн

5,22

14,73

5,32

19,92

44,21

CynipsNet, дообученная под микрофон платы

7,2 млн

5,65

15,01

5,77

16,70

25,54

CynipsNet, квантованная

7,2 млн

5,79

15,31

5,89

17,04

26,02

* dev-clean, dev-other и test-clean — стандартные валидационный наборы LibriSpeech [2]. На них можно сравнить результаты с другими моделями.

** dev_other_50cm и dev_other_250cm — тот же валидационный наборы dev-other, перезаписанный через микрофон платы с расстояния 50 и 250 см при громкости источника 55–60 дБ.

Базовую версию модели я обучил только на LibriSpeech, чтобы сравнить её с QuartzNet [1]. Затем я дообучил модель, добавив в обучающие данные шумы, 248 часов аудио, повторно записанного через микрофон платы, и датасеты с командами для умного дома. На записях с расстояния 2,5 м это снизило WER с 44,21 до 25,54%. На исходных записях LibriSpeech ошибок стало немного больше - это тоже видно в таблице.

После этого я квантовал модель в 8-битный формат. На test-clean WER вырос с 5,77 до 5,89%, а на записях с 2,5 м — с 25,54 до 26,02%. Именно эта квантованная версия работает на плате.

Расход памяти, задержка и загрузка NPU получились такими:

Параметры

7,2 млн, 8-битные

Веса

7,3 МБ во внешней NOR-флеш

Активации

4,2 МБ в SRAM и PSRAM

Задержка, первые символы

0,2-0,7 с (предварительный текст)

Задержка, окончательные символы

1,5-2,0 с (подтверждённый текст)

Загруженность NPU

44% времени *

* Такая высокая загрузка NPU обусловлена снижением задержек и увеличением контекста модели. При текущих настройках NPU занят 44% времени, тогда как теоретическая загрузка составляет 5%.

Больше подробностей можно найти в описании модели.

Что пока не получается

Цифры в таблице дают представление о точности, но при использовании платы стоит учитывать текущие ограничения:

  • Только английский; текст заглавными буквами, без пунктуации.

  • Сильный акцент сильно портит результат модель ожидает только правильное произношение слов.

  • Качество распознавания на расстоянии больше одного метра значительно падает, частично из-за ограничений установленного на плате микрофона.

  • Для диктовки длинных и сложных текстов точности ещё недостаточно.

Что дальше

Дальше предстоит работа над несколькими задачами:

  • Улучшить основную модель, чтобы повысить точность распознавания.

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

  • Улучшить распознавание речи с различными акцентами.

  • Подключить языковую модель для исправления ошибок с учётом контекста.

  • Уменьшить задержку, потребление энергии и объём используемой памяти.

Возможные применения

Уже сейчас модель распознаёт короткие фразы на английском без подключения к сети. С учётом текущих ограничений её можно использовать для команд своими словами и короткого голосового ввода в:

  • Управление умным домом без облачных сервисов.

  • Голосовой ввод показаний приборов.

  • Голосовое управление носимыми устройствами.

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

Ресурсы

[1] S. Kriman и др., «QuartzNet: Deep Automatic Speech Recognition with 1D Time-Channel Separable Convolutions», 2019, https://arxiv.org/abs/1910.10261

[2] V. Panayotov и др., «LibriSpeech: an ASR corpus based on public domain audio books», ICASSP 2015, https://www.openslr.org/12/

[3] S. Majumdar и др., «Citrinet: Closing the Gap between Non-Autoregressive and Autoregressive End-to-End Models for Automatic Speech Recognition», 2021, https://arxiv.org/abs/2104.01721

[4] S. Yang и др., «SUPERB: Speech processing Universal PERformance Benchmark», Interspeech 2021, таблица 2 (WER на LibriSpeech test-clean без языковой модели: wav2vec 2.0 Base — 6,43 %, HuBERT Base — 6,42 %), https://www.isca-archive.org/interspeech_2021/yang21c_interspeech.pdf

Комментарии (2)


  1. alexey_lukyanchyk
    14.10.2026 07:37

    Круто что модель развивается!)

    Я правильно понимаю, что теоретически, CynipsNet можно запустить на любом микроконтроллере?


    1. ydss Автор
      14.10.2026 07:37

      Спасибо! Исходную TFLite-модель можно запустить, если хватит памяти, но вычислительной мощности, к сожалению, не хватит.