Данный модуль может не только распознавать 121 встроенную команду на английском языке, но и дает возможность использовать 17 пользовательских командных слов, в качестве которых можно использовать любые звуки: свист, щелчки, кошачье мяуканье. Распознавание происходит полностью в автономном режиме - подключение к сети Интернет не требуется.
Модуль выпускается компанией DFROBOT.
Спецификация:
- Рабочее напряжение: 3,3 - 5В;
- Максимальный рабочий ток: ≤370 мА (5В);
- Связь: I2C/UART;
- Адрес I2C: 0x64;
- Фиксированная команда: 121;
- Фиксированная команда пробуждения: 1;
- Пользовательская команда: 17;
- Команда активации обучения: 1;
- Чувствительность встроенного микрофона: -28 дБ;
- Размер модуля: 49×32мм.
Совместимость с контроллерами Arduino: Arduino UNO, Arduino Leonardo, Arduino MEGA, контроллерами серии FireBeetle, Raspberry Pi, ESP32 (логика с уровнями 3,3В/5В)
Модуль оснащен 2 микрофонами, что делает процесс распознавания относительно точным и надежным даже в шумных условиях. На плате есть встроенный динамик (SPK1) и возможность подключения внешнего динамика (разъем SPK1). Для связи в внешним миром и подключения питания в комплекте есть кабель.
Установка библиотеки:
Перед началом работы необходимо скачать библиотеку DFRobot_DF2301Q
Открываем среду Arduino IDE
Скетч -> Подключить библиотеку -> Добавить .ZIP библиотеку
Указываем путь к скачанному с GitHub архиву.
Схема подключения:
Протестируем модуль совместно с платой Arduino NANO. Взаимодействовать с платой будем по протоколу I2C. Перед подключением переключатель интерфейсов на плате переводим в левое положение. Для голосовых ответов будем использовать встроенный динамик, соответственно переключатель выхода динамика переводим в правое положение.
В плате Arduino NANO (UNO) интерфейс I2C находится на контактах:
- A4 (SDA) <-> контакт D/T
- A5 (SCL) <-> контакт C/R
питание:
- +5V <-> VCC
- GND <-> GND
Заливка тестового примера:
Открываем монитор порта на скорости 115200 и будим плату фразой
- "Hello robot"
Плата нам отвечает: "Yes Im here" (Да, я здесь), выходит из спящего режима, и на ней загорается синий светодиод.
В монитор порта вываливается ID принятой команды.
Пока горит этот светодиод, плата слушает окружающие звуки и пытается уловить в них голосовые сообщения. Комментарии в тестовом примере я перевел на русский язык.
Все примеры кода будут доступны по ссылке в описании в конце статьи.
Модуль имеет возможность изменить уровень громкости ответа(строка_16), отключить ответ(строка_18), изменить время перехода в спящий режим(строка_20). В режиме работы по протоколу I2C можно разбудить модуль не командой пробуждения, а непосредственно из программы(строка_23).
В основном цикле состояние модуля вычитывается методом: .getCMDID();
На выходе однобайтовое число (без знака, тип uint8_t).
После пробуждения можно использовать 121 встроенную команду.
Список весьма внушительный - на все случаи жизни. Подойдет как для робота, так и для умного дома. Единственный минус: произносить все фразы нужно на английском языке. Впрочем, если вы занимаетесь программированием, не думаю, что это большая проблема, тем более, что фразы можно прослушать в любом онлайн-переводчике, а изучение иностранного языка вреда еще никому не приносило.
"Ломаный" английский язык плата также отлично понимает, так что уровня Крамарова хватит за глаза и за уши.
Управление светодиодом с помощью встроенных голосовых команд
Светодиод через токоограничивающий резистор номиналом 220 Om подключаем к ноге D2.
Поскольку модуль возвращает однобайтовое число, написание программы сводится к уверенному знанию единственной конструкции "switch - case".
Разберем пример программы, которая по встроенной голосовой команде
- "Turn on the light" включает светодиод;
- "Turn off the light" выключает светодиод.
Ищем в табличке ID этих команд:
Код будет выглядеть следующим образом:
Если потребуется управлять еще чем-нибудь, добавляем нужное количество GPIO и конструкций "case".
Голосовой ассистент, который хочется именно тебе, а не тот, который купил.
Встроенная в плату возможность обучения позволяет сделать голосового ассистента, который может отвечать на любые команды.
Например:
- будить плату будет слово "Афина";
- команда "Включи свет" - будет включать светодиод;
- команда "Выключи свет" - будет выключать светодиод.
Для корректного распознавания голосовой команды она должна иметь достаточную длительность: если будете подбирать красивое женское имя типа "Ася" или "Дуся", лучше добавить "Привет Ася", "Привет Дуся". Можно использовать и другие слова, но плата отвечает женским голосом, поэтому обозвать её например "Д.Ж.А.Р.В.И.С" ну.... такое себе....
Что-либо кодить не придется, достаточно пообщаться с платой на английском языке. Скетч для отладки подойдет из предыдущего примера со светодиодом.
Какие ID будет возвращать плата при реакции на пользовательские команды, смотрим в этой таблице:
Пользовательское слово пробуждения вернет 1, остальные пользовательские команды числа 5...21.
В процессе обучения плата также будет возвращать ответы. Их ID указаны в этой таблице:
Разучиваем пользовательское слово пробуждения
Все, что выделено жирным шрифтом в этом разделе, нужно будет произносить вслух. Плата отвечает на английском языке через динамик.
- будим плату с помощью встроенной команды "Hello robot";
- произносим фразу "Learning wake word";
- плата ответит: " Learning now, be quiet, please say the wake word to be learned!" (нужна тишина, и сейчас начнётся обучение);
- произносим "Афина";
- плата ответит: "Learning successful, please say it again!" (я усё поняла, повторите фразу снова)
- произносим "Афина";
- плата ответит: "Learning successful, please say it again!" (я усё поняла, повторите фразу снова);
- произносим "Афина";
- плата сообщит: "Ok, learning completed!" (обучение завершено).
Ждем 15 секунд, пока плата уснет, и пробуем разбудить её командой "Афина".
Плата возвращает 1. Теперь плату можно будить пользовательской командой "Афина" (ID=1) и встроенной командой "Hello robot" (ID=2).
Изучение пользовательских команд
Изучение пользовательских команд идет подряд от первой до семнадцатой. Если все 17 команд не нужны, можно в любой момент прекратить обучение командой "Exit learning". Нам нужно всего две, поэтому алгоритм обучения будет такой:
- будим плату любой командой встроенной "Hello robot" или той, которую уже выучили: "Афина";
- произносим фразу "Learning command word";
- плата ответит: "Learning now, be quiet, please learn the command word according to the prompt! Please say the first command to be learned!" (обучение запущено, назовите первую команду);
- произносим "Включи свет";
- плата ответит: "Learning successful, please say it again!" (Обучение прошло успешно, повторите, пожалуйста!);
- произносим "Включи свет";
- плата ответит: "Learning successful, please say it again!" (Обучение прошло успешно, повторите, пожалуйста!)
- произносим "Включи свет";
- плата ответит: "OK, learned the first command successfully! Please say the second command to be learned!" (ОК, первая команда успешно изучена! Пожалуйста, произнесите вторую команду, которую нужно изучить!)
- аналогично повторяем три раза вторую команду "Выключи свет"
- поскольку больше команд использовать не планируется, произносим "Exit learning"
Открываем монитор порта в среде Arduino IDE и тестируем:
- "Афина";
- "Включи свет";
- "Выключи свет";
Осталось подправить скетч и "умная колонка" с поддержкой русского языка для управления светодиодом готова:
Ходят слухи, что обученные таким образом модули голосового управления могут распознавать только голос человека, который её обучал, но по факту это оказалась не совсем так. Результаты эксперимента: "Учил один человек, а управлял другой" можете посмотреть в видео в конце этой статьи. Распознавать голос посторонних людей этому модулю вполне по силам (достаточно сохранять скорость произношения и интонацию).
Удаление пользовательских команд
Если потребуется изменить набор пользовательских команд или слово пробуждения, пользуемся следующим голосовым алгоритмом:
- будим плату встроенной "Hello robot" или пользовательской командой;
- произносим "I want to delete";
- плата ответит: "Do you want to delete the learned wake word or command word?"
Далее возможны следующие голосовые варианты управления:
- "Delete command word" - Удаляет все пользовательские команды.
- "Delete wake word" - Удаляет слово пробуждения.
- "Delete all" - Удаляет и слово пробуждения, и пользовательские команды.
- "Exit deleting" - выйти из режима удаления.
Теперь плату можно обучать новым голосовым сообщениям.
Резюме:
Возможность изменять набор голосовых команд делает данный модуль голосового управления достаточно универсальным для применения. Он подойдет не только для кружков робототехники, но и для умного дома. В помещении может находиться разное количество источников освещения, кондиционер (может быть, а может и не быть), телевизор, вентилятор и.т.д. и.т.п. 17 настраиваемых голосовых команд в кипе со 121 встроенной могут решить практически любую задачу голосового управления. Два микрофона обеспечивают хорошую чувствительность: c расстояния 4-х метров даже настраиваемые команды распознавались у меня без каких-либо проблем. Естественно, что не нужно заталкивать в каждую лампочку такой модуль. Можно подключить его к ESP8266/ESP32 и отсылать команды через домашнюю сеть Wi-Fi (подключение к сети Интернет при этом не потребуется).
Краткую инструкцию по настройке и результаты тестирования можно посмотреть в этом видео:
Коды примеров из статьи можно скачать тут
Ссылка на документацию (английский) DF2301Q
Купить модуль можно тут:
https://ozon.onelink.me/SNMZ/s8s8lhjb
Реклама. ИП Семëнова ИНН 780518548815
Оглавление канала доступно по этой ссылке:
Всем удачи!