====== Голосовой тир ====== {{ :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|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. - Установите на Arduino Uno шилд EasyVR. - Установите перемычку на EasyVR в положение ''PC''. - Установите программу [[https://fortebit.tech/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. - Скачайте библиотеку [[https://fortebit.tech/downloads/|EasyVR Arduino Library]]. В Arduino IDE [[:программирование:библиотеки|добавьте бибилотеку]], выбрав скачанный zip-архив (распаковывать его не нужно). - [[:articles:arduino-ide-install#загрузка_первого_скетча|Прошейте Arduino]] скетчем, приведённым ниже, и снова установите на неё EasyVR. - Установите перемычку на EasyVR в положение ''HW''. - Установите на EasyVR плату Тройка-шилд. {{ :projects:vr_build_3.jpg?direct&700 }} - Подключите сервоприводы к тройка-шилду, закрепите карточки на сервоприводах при помощи скрепок или проволоки. Установите сервоприводы так, чтобы в исходном положении карточки стояли. {{ :projects:vr_build_4.jpg?direct&700 }} - Подключите питание. ===== Исходный код ===== #include "Arduino.h" #include "Platform.h" #include "Servo.h" #include "EasyVR.h" EasyVR easyvr(Serial); Servo* srv; //Groups and Commands enum Groups { GROUP_1 = 1, }; enum Group1 { G1_SHIRT = 0, G1_PEAR = 1, G1_ORANGE = 2, }; enum { SRV_SHIRT = 0, SRV_PEAR = 1, SRV_ORANGE = 2, }; EasyVRBridge bridge; int8_t group, idx; void setup() { Serial.begin(9600); pinMode(13, OUTPUT); digitalWrite(13, LOW); while (!easyvr.detect()) { delay(1000); } easyvr.setPinOutput(EasyVR::IO1, LOW); easyvr.setTimeout(5); easyvr.setLanguage(0); group = EasyVR::TRIGGER; //<-- start group (customize) srv = new Servo[3]; srv[SRV_SHIRT].attach(3); srv[SRV_SHIRT].write(0); srv[SRV_ORANGE].attach(5); srv[SRV_ORANGE].write(0); srv[SRV_PEAR].attach(6); srv[SRV_PEAR].write(0); srv[SRV_SHIRT].write(90); delay(2000); srv[SRV_SHIRT].write(0); delay(1000); srv[SRV_ORANGE].write(90); delay(2000); srv[SRV_ORANGE].write(0); delay(1000); srv[SRV_PEAR].write(90); delay(2000); srv[SRV_PEAR].write(0); } void action(); void loop() { easyvr.setPinOutput(EasyVR::IO1, HIGH); // LED on (listening) easyvr.recognizeCommand(group); do { // can do some processing while waiting for a spoken command } while (!easyvr.hasFinished()); easyvr.setPinOutput(EasyVR::IO1, LOW); // LED off idx = easyvr.getWord(); if(idx >= 0) { // built-in trigger (ROBOT) // group = GROUP_X; <-- jump to another group X return; } idx = easyvr.getCommand(); if(idx >= 0) { // print debug message uint8_t train = 0; char name[32]; easyvr.dumpCommand(group, idx, name, train); // perform some action action(); } else // errors or timeout { digitalWrite(13, LOW); if(easyvr.isTimeout()) /* error */; int16_t err = easyvr.getError(); } } void action() { digitalWrite(13, HIGH); switch (group) { case GROUP_1: switch (idx) { case G1_SHIRT: // write your action code here // group = GROUP_X; <-- or jump to another group X for composite commands srv[SRV_SHIRT].write(90); delay(1000); srv[SRV_SHIRT].write(0); break; case G1_PEAR: // write your action code here // group = GROUP_X; <-- or jump to another group X for composite commands srv[SRV_PEAR].write(90); delay(1000); srv[SRV_PEAR].write(0); break; case G1_ORANGE: // write your action code here // group = GROUP_X; <-- or jump to another group X for composite commands srv[SRV_ORANGE].write(90); delay(1000); srv[SRV_ORANGE].write(0); break; } break; } } ===== Демонстрация работы устройства ===== {{youtube>h4P38uZoqLs?large}} ===== Что ещё можно сделать с EasyVR? ===== Возможности платы EasyVR — огромны. Мы показали лишь самый простой пример использования этого модуля. При этом было задействовано едва ли 30% возможностей. Помимо распознавания голоса на английском языке модуль способен: - Распознавать команды на некоторых других языках (Немецкий, Французский, Итальянский, Испанский, Корейский и Японский). Это даёт возможность строить устройства для обучения произношению иностранных слов на всех перечисленных языках. - Воспользовавшись режимом «speaker-dependent можно собирать кодовые замки, отпираемые только по вашему голосу. - Устройство также умеет распознавать коды тонового набора. Это даёт возможность разрабатывать исполнительные устройства, принимающие команды по проводной телефонной линии.