Тема распознавания голоса микроконтроллером довольно интересна и нова, поэтому я решил представить вам схему устройства распознавания голоса на микроконтроллере, а точнее на Arduino. Распознавание голоса довольно непростая задача, а реализовать это на микроконтроллере еще сложнее, в силу ограниченности его ресурсов. В нашем случае реализация распознавания голоса будет на микроконтроллере ATmega328P, работающего на частоте 16МГц.
В данном устройстве была использована библиотека uSpeech, которая полностью автономна и не требует передачи голосовых команд на компьютер для дальнейшего распознавания, как того требуют другие библиотеки и модули, например, такие как BitVoicer.
В моей схеме распознавания голоса на микроконтроллере была использована uSpeech в силу своей автономности и малых размеров. Хотя у неё есть недостаток, такой как ограниченность распознавания. Эта библиотека позволяет распознавать только фонемы, т.е. отдельные звуки, но для многих схем и устройств этого более чем достаточно. Ниже приведен список используемых фонем (звуков):
Фонема (звук) | Соответствующая ей буква (может быть несколько) |
«е» | е |
«х» | х, ш, щ, дж, ж, з |
«в» | в, может срабатывать на з |
«ф» | ф |
«с» | с |
«о» | о, а, ш, л, м, н, у, ю |
» « | слишком тихий звук |
В качестве микрофона используется электретный микрофон (ссылка на статью на Wikipedia), обычно он выглядит так:
Сигнал с него достаточно слабый, поэтому его необходимо усилить. Усилитель для микрофона можно сделать из пары транзисторов, как было в схеме микрофонного усилителя на Радиодеде, так и на операционном усилителе, например, так:
Либо можно купить готовый микрофон с усилителем на eBay или AliExpress, найти можно по запросу «Mic amplifier arduino» или «Микрофонный усилитель Arduino». Выглядит он так:
Микрофон с микрофонным усилителем желательно подключить к микроконтроллеру через резистор 470…2К и разделительный конденсатор (он уже есть в самих схемах усилителей, а также на готовых платах), который убирает постоянную составляющую.
Схема подключения микрофона и усилителя к Arduino следующая: микрофон через усилитель подключается к аналоговому порту Ардуино A0, три светодиода через резисторы подключаются к цифровым выходам 5,6,7 (схему можно изменить, внеся соответствующие, небольшие правки в исходный код программы).
В качестве индикаторов распознанных команд были использованы три светодиода разных цветов.
В исходном примере библиотеки 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 и самой библиотекой.
1 Комментарий
Не понимаю цели проекта. Командовать игрушечной машинкой? Так джойстики в виде руля и рычага переключения передач и нескольких кнопок и/или педалей и проще, и удобнее. Корабликом? Опять и проще, и приятней джойстики. В виде штурвала и машинного телеграфа. Чат-бот на серебро Лёбнера? Во-первых, без синтеза он не получится. Во-вторых, где его применять? В техподдержке перед живым специалистом? В кол-центре? В сотовой компании, чтоб окончательно разогнать операторов? Так они не только могут позволить себе приличные компы, но следует ожидать, что компы даже есть по дефолту и что контроллеры для них как раз не удобны. Синтезатор – совсем другое дело, на нём можно и речевой информатор сделать, и того же бота, и квесты зачитывать, и даже разбавить молчание игрового персонажа РПГ. И совсем не везде в пару нужна распознавалка. При этом сам бот – тоже проект не тривиальный даже для расбери пая. А для чего-то серьёзного сам факт наличия распознавалки требует не хилых таких защит и контроля. И вовсе не программных.