Ранее я писал о распознавании фонем на микроконтроллере 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
alexey_lukyanchyk
Круто что модель развивается!)
Я правильно понимаю, что теоретически, CynipsNet можно запустить на любом микроконтроллере?
ydss Автор
Спасибо! Исходную TFLite-модель можно запустить, если хватит памяти, но вычислительной мощности, к сожалению, не хватит.