Голосовой тир

vr_overview.jpg

Что это такое?

В этой статье мы расскажем о том, как можно реализовать голосовое управление для своего проекта. Вы сможете говорить роботу, куда ему двигаться, включать/выключать свет, собрать замок, отпирающийся только на ваш голос, или голосовой тир для тренировки произношения иностранных слов. Разумеется реализовать распознавание голоса у новичка самостоятельно не получится. Но есть готовое решение. Мы покажем, как пользоваться этим решением, на примере голосового тира.

Наше устройство должно будет слушать игрока, распозновать его речь и опускать карточку на несколько секунд, как только правильно было произнесено написанное на ней слово.

В качестве упомянутого готового решения мы возьмём плату EasyVR 3 Plus Shield, которая предоставляет простой интерфейс к сложно реализуемым функциям распознавания голоса.

Что для этого необходимо?

vr_collage.jpg

Для изготовления тира с тремя карточками нам понадобятся:

  1. Карточки с изображениями или словами ×3 шт

Как это собрать?

vr_build_1.jpg

  1. Мы будем использовать плату Arduino Uno как переходник USB→UART для начальной настройки EasyVR. Извлеките микросхему ATmega из платы Arduino Uno, чтобы она не вклинивалась в канал UART.

    Внимание!

    При извлечении микросхемы убедитесь, что питание платы отключено.

  2. Установите на Arduino Uno шилд EasyVR.
  3. Установите перемычку на EasyVR в положение PC.
  4. Установите программу EasyVR Commander, подключите Arduino Uno к компьютеру при помощи USB-кабеля.
  5. Создайте три команды и обучите их.
  6. Временно снимите EasyVR-шилд, поставьте обратно микросхему на Arduino Uno.
  7. Скачайте библиотеку EasyVR Arduino Library. В Arduino IDE добавьте бибилотеку, выбрав скачанный zip-архив (распаковывать его не нужно).
  8. Прошейте Arduino скетчем, приведённым ниже, и снова установите на неё EasyVR.
  9. Установите перемычку на EasyVR в положение HW.
  10. Установите на EasyVR плату Тройка-шилд. vr_build_3.jpg
  11. Подключите сервоприводы к тройка-шилду, закрепите карточки на сервоприводах при помощи скрепок или проволоки. Установите сервоприводы так, чтобы в исходном положении карточки стояли. vr_build_4.jpg
  12. Подключите питание.

Исходный код

guessTheCard.ino
#include <Servo.h>
#include <EasyVR.h>
 
 
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
    {
        // Ошибка распознавания или таймаут
    }
}

Демонстрация работы устройства

Что ещё можно сделать с EasyVR?

Возможности платы EasyVR — огромны. Мы показали лишь самый простой пример использования этого модуля. При этом было задействовано едва ли 30% возможностей. Помимо распознавания голоса на английском языке модуль способен:

  1. Распознавать команды на некоторых других языках (Немецкий, Французский, Итальянский, Испанский, Корейский и Японский). Это даёт возможность строить устройства для обучения произношению иностранных слов на всех перечисленных языках.
  2. Воспользовавшись режимом «speaker-dependent можно собирать кодовые замки, отпираемые только по вашему голосу.
  3. Устройство также умеет распознавать коды тонового набора. Это даёт возможность разрабатывать исполнительные устройства, принимающие команды по проводной телефонной линии.