Тема распознавания голоса микроконтроллером довольно интересна и нова, поэтому я решил представить вам схему устройства распознавания голоса на микроконтроллере, а точнее на Arduino. Распознавание голоса довольно непростая задача, а реализовать это на микроконтроллере еще сложнее, в силу ограниченности его ресурсов. В нашем случае реализация распознавания голоса будет на микроконтроллере ATmega328P, работающего на частоте 16МГц.

Распознавание голоса на Arduino

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

В моей схеме распознавания голоса на микроконтроллере была использована uSpeech в силу своей автономности и малых размеров. Хотя у неё есть недостаток, такой как ограниченность распознавания. Эта библиотека позволяет распознавать только фонемы, т.е. отдельные звуки, но для многих схем и устройств этого более чем достаточно. Ниже приведен список используемых фонем (звуков):

Фонема (звук) Соответствующая ей буква (может быть несколько)
«е» е
«х» х, ш, щ, дж, ж, з
«в» в, может срабатывать на з
«ф» ф
«с» с
«о» о, а, ш, л, м, н, у, ю
» « слишком тихий звук

В качестве микрофона используется электретный микрофон (ссылка на статью на Wikipedia), обычно он выглядит так:

Электретный микрофон

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

Микрофонный усилитель на операционном усилителе (ОУ) LM358

Либо можно купить готовый микрофон с усилителем на eBay или AliExpress, найти можно по запросу «Mic amplifier arduino» или «Микрофонный усилитель Arduino». Выглядит он так:

Микрофонный усилитель (готовый модуль)

Микрофон с микрофонным усилителем желательно подключить к микроконтроллеру через резистор 470…2К и разделительный конденсатор (он уже есть в самих схемах усилителей, а также на готовых платах), который убирает постоянную составляющую.

Схема подключения микрофона и усилителя к Arduino следующая: микрофон через усилитель подключается к аналоговому порту Ардуино A0, три светодиода через резисторы подключаются к цифровым выходам 5,6,7 (схему можно изменить, внеся соответствующие, небольшие правки в исходный код программы).

Схема подключения микрофона к Arduino для распознавания голоса

В качестве индикаторов распознанных команд были использованы три светодиода разных цветов.

В исходном примере библиотеки uSpeech сравнивались одиночные фонемы (звуки). Пример позволял распознать 6 фонем (звуков): «ф», «е», «о», «в», «с», «х» (f, e, o, v, s, h). Мной был использован массив байт, который содержал паттерны, распознаваемых слов, что позволило в конечном итоге распознавать не отдельные фонемы (звуки), а целые слова, состоящие из распознаваемых фонем. Массив полученных звуков сравнивается с заранее прописанным массивом байт (паттерном слова), и в случае совпадения, с учетом заданного порога чувствительности, делается вывод о том, какое слово было произнесено.

Например, заранее прописанные паттерны для английских слов green,orange и white были следующие  «vvvoeeeeeeeofff», «hhhhhvoovvvvf», «hooooooffffffff». Для нахождения наиболее ближайшего эквивалента произносимом  слову необходимо находить минимальное редакционное расстояние  (расстояние Левенштейна). Для повышения точности и игнорирования нерелевантных паттернов при распозновании использовалась константа LOWEST_COST_MAX_THREASHOLD, определяющая уровень достоверности. Подбирая её значение можно добиться высокой точности распознавания.

Скомпилированный скетч занимает около 20% FLASH-памяти микроконтроллера и около 500 байт, т.е. 25% ОЗУ. Библиотеку для распознавания голосовых команд на Ардуино – uSpeech можно скачать здесь (необходимо нажать зеленую кнопку «Clone or download»). Установка библиотеки стандартная – необходимо распаковать архив и поместить папку в “C:/Users/<Имя пользователя>/Documents/Arduino/libraries”.

Демонстрация работы устройства:
https://www.youtube.com/watch?v=_zlD2lvWB7k

Скачать архив с исходником скетча для Arduino и самой библиотекой.

Просмотров всего: 16 721, сегодня: 1

1 Комментарий

  1. Не понимаю цели проекта. Командовать игрушечной машинкой? Так джойстики в виде руля и рычага переключения передач и нескольких кнопок и/или педалей и проще, и удобнее. Корабликом? Опять и проще, и приятней джойстики. В виде штурвала и машинного телеграфа. Чат-бот на серебро Лёбнера? Во-первых, без синтеза он не получится. Во-вторых, где его применять? В техподдержке перед живым специалистом? В кол-центре? В сотовой компании, чтоб окончательно разогнать операторов? Так они не только могут позволить себе приличные компы, но следует ожидать, что компы даже есть по дефолту и что контроллеры для них как раз не удобны. Синтезатор – совсем другое дело, на нём можно и речевой информатор сделать, и того же бота, и квесты зачитывать, и даже разбавить молчание игрового персонажа РПГ. И совсем не везде в пару нужна распознавалка. При этом сам бот – тоже проект не тривиальный даже для расбери пая. А для чего-то серьёзного сам факт наличия распознавалки требует не хилых таких защит и контроля. И вовсе не программных.

Напишите комментарий