====== Голосовой тир ====== {{ :projects:vr_overview.jpg?direct&700 }} * Платформы: Arduino Uno * Языки программирования: [[wp>Wiring_(development_platform) | Wiring (C++)]] * Проект на [[wpru>GitHub]]: http://github.com/amperka-projects/guessTheCard * Тэги: распознование речи, голосовое управление, easyvr ===== Что это такое? ===== В этой статье мы расскажем о том, как можно реализовать голосовое управление для своего проекта. Вы сможете говорить роботу, куда ему двигаться, включать/выключать свет, собрать замок, отпирающийся только на ваш голос, или голосовой тир для тренировки произношения иностранных слов. Разумеется реализовать распознавание голоса у новичка самостоятельно не получится. Но есть готовое решение. Мы покажем, как пользоваться этим решением, на примере голосового тира. Наше устройство должно будет слушать игрока, распозновать его речь и опускать карточку на несколько секунд, как только правильно было произнесено написанное на ней слово. В качестве упомянутого готового решения мы возьмём плату [[amp>product/arduino-easyvr-3-plus-shield?utm_source=proj&utm_campaign=guessthecard&utm_medium=wiki|EasyVR 3 Plus Shield]], которая предоставляет простой интерфейс к сложно реализуемым функциям распознавания голоса. ===== Что для этого необходимо? ===== {{ :projects:vr_collage.jpg?direct&700 }} Для изготовления тира с тремя карточками нам понадобятся: - [[amp>product/arduino-uno?utm_source=proj&utm_campaign=guessthecard&utm_medium=wiki|Arduino Uno]] - [[amp>product/arduino-easyvr-3-plus-shield?utm_source=proj&utm_campaign=guessthecard&utm_medium=wiki|EasyVR-шилд]] - [[amp>product/arduino-troyka-shield?utm_source=proj&utm_campaign=guessthecard&utm_medium=wiki|Troyka-шилд]] - [[amp>product/servo-fs90?utm_source=proj&utm_campaign=guessthecard&utm_medium=wiki|Микросервопривод FS90 ×3 шт]] - [[amp>product/usb-power-plug?utm_source=proj&utm_campaign=guessthecard&utm_medium=wiki|Блок питания с USB разъёмом]] - [[amp>product/usb-cable?utm_source=proj&utm_campaign=guessthecard&utm_medium=wiki|USB-кабель]] - Карточки с изображениями или словами ×3 шт ===== Как это собрать? ===== {{ :projects:vr_build_1.jpg?direct&700 }} - Мы будем использовать плату Arduino Uno как переходник USB→UART для начальной настройки EasyVR. Извлеките микросхему ATmega из платы Arduino Uno, чтобы она не вклинивалась в канал UART. {{:продукты:magic-fogg.png?nolink |}}**//Внимание!//** При извлечении микросхемы убедитесь, что питание платы отключено. - Установите на Arduino Uno шилд EasyVR. - Установите перемычку на EasyVR в положение ''PC''. - Установите программу [[http://www.veear.eu/downloads/|EasyVR Commander]], подключите Arduino Uno к компьютеру при помощи [[amp>product/usb-cable?utm_source=proj&utm_campaign=guessthecard&utm_medium=wiki|USB-кабеля]]. - Создайте три команды и обучите их. {{ :projects:vr_build_2.png?direct&700 }} - Временно снимите EasyVR-шилд, поставьте обратно микросхему на Arduino Uno. - Скачайте библиотеку [[http://www.veear.eu/downloads/|EasyVR Arduino Library]]. В Arduino IDE [[программирование:библиотеки|добавьте бибилотеку]], выбрав скачанный zip-архив (распаковывать его не нужно). - [[arduino-быстрый-старт:start|Прошейте Arduino]] скетчем, приведённым ниже, и снова установите на неё EasyVR. - Установите перемычку на EasyVR в положение ''HW''. - Установите на EasyVR плату Тройка-шилд. {{ :projects:vr_build_3.jpg?direct&700 }} - Подключите сервоприводы к тройка-шилду, закрепите карточки на сервоприводах при помощи скрепок или проволоки. Установите сервоприводы так, чтобы в исходном положении карточки стояли. {{ :projects:vr_build_4.jpg?direct&700 }} - Подключите питание. ===== Исходный код ===== #include #include EasyVR easyvr(Serial); Servo* srv; // Номер пина для светодиода, индицирующего ожидание команды const int LED_WAIT = 13; // Номер группы команд enum { GROUP_MAIN = 1, }; // Коды команд из группы 1 enum { G1_SHIRT = 0, G1_PEAR = 1, G1_ORANGE = 2, }; // Соответствие команд индексам в массиве серв srv enum { // Если значение элемента перечисления не задано, то оно принимается // равным <значение предыдущего элемента>+1. Если элемент первый, то ему // присваивается значение 0. SRV_SHIRT, SRV_PEAR, SRV_ORANGE, // Эту константу держите всегда последней и не меняйте её значение: SRV_COUNT }; // Соостветствие серв пинам enum { SRV_SHIRT_PIN = 3, SRV_PEAR_PIN = 5, SRV_ORANGE_PIN = 6 }; void setup(void) { Serial.begin(9600); // Переводим на запись порт для индикации // активности микрофона pinMode(LED_WAIT, OUTPUT); digitalWrite(LED_WAIT, LOW); // Ожидание соединения с платой while(!easyvr.detect()) delay(1000); // Установка таймаута на распознавание easyvr.setTimeout(5); // Выбор языка (Английский) easyvr.setLanguage(EasyVR::ENGLISH); // Конфигурируем сервы srv = new Servo[SRV_COUNT]; srv[ SRV_SHIRT ].attach( SRV_SHIRT_PIN ); srv[ SRV_ORANGE ].attach( SRV_ORANGE_PIN ); srv[ SRV_PEAR ].attach( SRV_PEAR_PIN ); // По очереди протестируем все сервы srv[SRV_SHIRT].write(90); delay(1000); srv[SRV_SHIRT].write(0); delay(1000); srv[SRV_ORANGE].write(90); delay(1000); srv[SRV_ORANGE].write(0); delay(1000); srv[SRV_PEAR].write(90); delay(1000); srv[SRV_PEAR].write(0); } // Данная функция вызывается в случае успешного // распознавания фразы void action(int8_t group, int8_t idx) { // Активируем серву, соответствующую распознанному коду switch (group) { case GROUP_MAIN: switch (idx) { case G1_SHIRT: srv[SRV_SHIRT].write(90); delay(1000); srv[SRV_SHIRT].write(0); break; case G1_PEAR: srv[SRV_PEAR].write(90); delay(1000); srv[SRV_PEAR].write(0); break; case G1_ORANGE: srv[SRV_ORANGE].write(90); delay(1000); srv[SRV_ORANGE].write(0); break; } break; } } void loop(void) { int8_t idx; // Зажигаем светодиод для индикации режима ожидания команды digitalWrite(LED_WAIT, HIGH); // Запускаем процедуру распознавания easyvr.recognizeCommand(GROUP_MAIN); // Ожидаем окончание процесса while(!easyvr.hasFinished()); // Тушим светодиод - либо таймаут, либо команда распознана digitalWrite(LED_WAIT, LOW); // Если убрать эту задержку, то мы перестанем видеть, когда заканчивается // один период ожидания команды и начинается второй. Если произнесение команды // придётся на границу двух периодов, то распознавание закончится неудачей. delay(500); // Получаем код распознанной команды idx = easyvr.getCommand(); if(idx >= 0) { // Выполним действие по команде action(GROUP_MAIN, idx); } else { // Ошибка распознавания или таймаут } } ===== Демонстрация работы устройства ===== {{youtube>h4P38uZoqLs?large}} ===== Что ещё можно сделать с EasyVR? ===== Возможности платы EasyVR — огромны. Мы показали лишь самый простой пример использования этого модуля. При этом было задействовано едва ли 30% возможностей. Помимо распознавания голоса на английском языке модуль способен: - Распознавать команды на некоторых других языках (Немецкий, Французский, Итальянский, Испанский, Корейский и Японский). Это даёт возможность строить устройства для обучения произношению иностранных слов на всех перечисленных языках. - Воспользовавшись режимом «speaker-dependent можно собирать кодовые замки, отпираемые только по вашему голосу. - Устройство также умеет распознавать коды тонового набора. Это даёт возможность разрабатывать исполнительные устройства, принимающие команды по проводной телефонной линии.