====== Голосовой тир ======
{{ :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 можно собирать кодовые замки, отпираемые только по вашему голосу.
- Устройство также умеет распознавать коды тонового набора. Это даёт возможность разрабатывать исполнительные устройства, принимающие команды по проводной телефонной линии.