
При построении разнообразных автоматизированных систем часто возникает потребность, чтобы эта система предоставляла какую-то обратную связь.
В этой связи большинство идут самым простым путём: мигающие лампочки, светодиоды, мониторы разных мастей с выведением на них текстовой/графической информации…
Однако есть одна очень интересная тема, которую почему-то незаслуженно самодельщики обходят стороной — речь о микроконтроллерах!
Потому что, согласитесь, «мигание лампочек» — это, конечно, прекрасно и даже в некотором роде волшебно (особенно когда это происходит в первый раз в жизни и твоя программа наконец начинает работать :-) ). Но куда веселее, когда машина отвечает тебе голосом! :-)
Поэтому посмотрим, какие здесь возможности имеются...
Сразу хотел сказать, что этот вопрос сейчас передо мной стоит во весь рост, и я довольно плотно изучаю всё, что есть доступного на эту тему, с целью встраивания в своё решение*. Поэтому, если у вас будет что добавить к тому, что будет сказано ниже, думаю, это будет полезно для всех!
Итак...
*Будет одна мелкая серийная девайсина, общающаяся с владельцем :-) Может быть, если хорошо сложатся звёзды, об этом как-то даже и напишу позже... :-)
В истории техники и электроники есть, пожалуй, несколько тем, которые долгое время являлись мечтой, неким идеалом, к которому стремились. Многие из них уже в том или ином виде реализованы: компьютер в кармане (он уже есть — это смартфоны), компьютерная генерация фотореалистичных изображений — тоже в изобилии.
Причём, что интересно, последняя прошла через этап CG (Computer Generated), под которым раньше зачастую подразумевалось построение фотореалистичных изображений с помощью рендеринга — трассировки лучей с учётом свойств среды и материалов (над описанием моделей которых работали целые научные институты), — и перешла в следующую фазу: AI Generated, когда изображение получается уже даже без использования прежних подходов…
Летающие электродвигатели (о чём в начале девяностых ещё не было и речи), — и всё кардинально поменялось с появлением и широким распространением компактных, мощных редкоземельных магнитов, повсеместно внедрившихся в двигатели, — что позволило строить высокоэффективные летающие аппараты малого веса…
И среди подобных тем, к которым научно-техническое сообщество относится с повышенным интересом, безусловно, особое место занимают способы реализации голосового взаимодействия с компьютером — потому что это, по сути, квинтэссенция технического прогресса: общаться голосом с компьютером! :-)
Радует, что к нашим дням эта проблема во многом решена, причём многими способами.
Где при этом, если не ставить себе цель отдачи голосовых команд (что, очевидно, существенно усложняет задачу), а ограничиться только генерацией речи, то задача многократно упрощается!
Благодаря этому подобные решения могут легко исполняться даже на маломощных микроконтроллерах.
Это, впрочем, не отрицает того, что задача распознавания голосовых команд может быть легко решена даже на микроконтроллерах — например, вот здесь вы можете найти «родное» решение от компании Espressif (ESP-Skainet) для локального распознавания голоса без какой-либо отсылки данных на сервер.
Такой подход особенно интересен тем, что позволяет создать автономное решение с низким энергопотреблением, не требующее никакой связи с серверами: голосовой дверной звонок или «умный замок для двери», срабатывающие от команд владельца, становятся вполне реальными...
Однако вернёмся к нашему вопросу...
Очевидно, что самым простым вариантом является воспроизведение предзаписанных фраз, которые хранятся в энергонезависимой памяти.
Предварительные расчёты показывают, что во встроенную flash-память ESP32 может поместиться звуковой файл продолжительностью в районе 20-30 сек (16 бит, 22 кГц). Подробный мануал по работе с таким файлом можно найти здесь.
Однако эту проблему можно в корне устранить, если использовать внешнюю SD-карту: при таком подходе фактический объём записанного звука может быть весьма произвольным (в практическом смысле — многократно превышающим то, что действительно нужно). Например, энтузиасты реализуют варианты решений с множеством доступных фраз или даже фрагментов музыки. Мануал, также пошаговый, есть тут.
Но это самый простой и очевидный вариант.
Если хочется чего-то посложнее, то можно обратиться к уже готовым решениям, предоставляющим возможности синтеза речи. Одним из таких является библиотека Talkie, применяющая линейное предиктивное кодирование — способ хранения данных, который позволяет оперировать их небольшим объёмом за счёт того, что не запоминается каждый короткий фрагмент. Вместо этого каждый последующий фрагмент звука предсказывается исходя из того, какой звук воспроизводится в данный момент. Для воспроизведения речи используется модуляция изначального «гудения» с помощью фильтра, имеющего возможность быстро перестраиваться. Это похоже на то, как голосовые связки человека воспроизводят некий базовый звук, а уже остальной речевой аппарат (гортань, рот, язык и т. д.) модулирует это «гудение», превращая его в речь.
Такой способ позволяет генерировать машинную речь, данные для генерации которой требуют в десятки раз меньше места (килобайты), чем требовала бы настоящая записанная речь. Такой подход был широко распространён в 1970-1980-х годах. Так что использование подобного подхода сегодня, это некий «взгляд в прошлое».
Кроме того, для микроконтроллеров это весьма простая задача, с которой справляются даже относительно слабые системы.
Очеви��ным минусом такого подхода является «механический» голос, как у роботов, ввиду того что он не передаёт всех нюансов настоящего голоса.
С другой стороны, это может быть даже некой «фишкой»! ;-)
Насколько можно понять со слов поддерживающих проект, библиотека не позволяет воспроизводить произвольные слова и содержит лишь набор преднастроенных (более 1000) — только на американском и британском английском, произносимых мужским или женским голосом.
Поддержка русского языка не заявлена.
Пример такого голоса можно услышать ниже:
Было бы неправильно сказать, что эта технология — пережиток прошлого, не имеющего места в современном мире, полном ИИ и прочих странных вещей.
Например, строитель самодельного 3-кВт моноколёсного мотоцикла, построивший его на базе микроконтроллера Arduino, сделал, на мой взгляд, потрясающую вещь: встроил в него компьютерный голос на базе как раз этой библиотеки Talkie!
Смысл затеи был в том, что управлять моноколёсным мотоциклом и так-то непросто (он там рассказывает, как «втыкался лицом» во время тестов :-)), поэтому он сразу отказался от использования каких-либо графических дисплеев, чтобы не отвлекать внимание, и решил встроить систему информирования на основе голоса. Получилось органично и даже, пожалуй, футуристично:
Есть и более приземлённые примеры использования подобной говорилки: например, подробный мануал, как заставить говорить ESP32 или мануал по постройке комнатного термометра (тоже на ESP32).
Понятно, что роботизированный голос на английском языке — это, возможно, и хорошо, но где же русский?! :-)
Для поддержки же русского языка придётся обратиться к другой библиотеке — eSpeak NG, которая тоже использует синтез голоса, и, если не вдаваться в подробности, содержит сценарии (последовательность воспроизведения частот с резонансами в определённых местах) для создания каждого гласного или согласного звука. Однако желающие более глубоко «вдаться» в подробности могут глянуть, например, здесь.
Что касается поддержки языков, то здесь всё весьма богато — более 100 языков и акцентов, где поддержка русского языка есть.
Речь на английском, генерируемая с её помощью, звучит примерно так:
При этом надо иметь в виду, что библиотека довольно тяжёлая, и прошивка, созданная с её помощью, занимает у ESP32 больше половины доступной памяти.
Было бы странно не использовать возможности подключения по Wi-Fi, раз уж мы говорим о ESP32.
Сетевое направление генерации голоса обычно носит название (в одном из вариантов, хотя, это более правильно назвать целым направлением методов, не только онлайн) text-to-speech и позволяет отослать текстовый запрос на нейросетевой сервис крупных компаний, например, Google (Google Cloud Text To Speech) и т.д., получая в ответ звуковой файл для воспроизведения. Качество воспроизводимой речи является весьма высоким.
Проблема лишь в том, что, с одной стороны, реализовать алгоритм такого взаимодействия не совсем просто, а с другой — подобные сервисы всё равно имеют квоты на количество запросов, после которых необходимо переходить на платную версию.
Как альтернативный вариант (более простой технически, но также с квотами) — слать http-запросы с текстом, который нужно перевести в речь, на сервисы наподобие этого и этого, в ответ получая аудиофайл для воспроизведения. Готового варианта для такого решения найти не удалось — нужно писать самостоятельно.
Однако при любом варианте остаётся потребность в стабильном интернет-соединении для передачи трафика, что не совсем удобно в целом ряде случаев…
Как было уже выше сказано, комплекс методов text-to-speech не ограничивается только онлайн-методами. Хотя самые мощные из них всё равно требуют соединения с сервером, только уже в пределах локальной сети — и примером такой системы является нейросетевой движок Piper, в который интегрирован модуль речи eSpeak NG (который мы рассматривали выше).
Качество речи довольно высокое — можно убедиться самостоятельно прямо в браузере: на странице предпрослушивания образцов фраз (можно выбрать разные голоса и разные языки; сейчас выбран русский).
При желании, движок можно обучить новым голосам (такая возможность приложена к коду движка).
Схема работы с движком построена по принципу отправки на сервер post-запроса с фразой для озвучивания, после чего сервер присылает ответ в виде аудиофайла для воспроизведения.
Но если всё же реализовывать общение сервер-ESP32 в рамках такой небольшой сети, то есть вариант потенциально намного лучше (и с более качественным воспроизведением голоса):
Локально на смартфон (например, под Android) устанавливается нейросетевой движок распознавания голоса Vosk.
ESP32 шлёт аудиоданные на смартфон, где они передаются для распознавания Vosk, который переводит их в текст.
Распознанный текст передаётся для воспроизведения голосом встроенному модулю Google TTS.
Аудиопоток от Google TTS захватывается и пересылается на esp32.
Можно, по идее, использовать и встроенный на смартфоне модуль распознавания речи от Google…В общем, есть варианты.
Готовые решения такого плана, на первый взгляд, отсутствуют, так что нужно будет писать самостоятельно.
Таким образом, мы видим, что проблема генерации голоса (и его распознавания, если это действительно нужно) поднимает огромный пласт вопросов. Тем не менее в данный мом��нт существует множество путей их решения, что существенно облегчает задачу…
В любом случае у вас сейчас есть масса способов воспроизвести голос, используя микроконтроллер. А учитывая, что сейчас самый разгар новогодних праздников, пожалуй, самое время заставить «железку» спеть какую-нибудь новогоднюю песню… :-)
© 2025 ООО «МТ ФИНАНС»

