Инструменты пользователя

Инструменты сайта


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

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 "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;
    }
}

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

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

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

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