Распознование голоса

iliusvla
Offline
Зарегистрирован: 22.01.2012

Здравствуйте!

Вообщем есть такая штука: EZ-Builder. И в ней есть распознование голоса(англ.), а мне интересно, есть что-то такое для Arduino. Фишка EZ-B в том, что там не нужно проговаривать команды, просто вводишь текст, а програма распознает всё, и при совпадении выполняет команду.

 

Заранее спасибо! 

Mastino
Offline
Зарегистрирован: 03.12.2011

iliusvla пишет:

Здравствуйте!

Вообщем есть такая штука: EZ-Builder. И в ней есть распознование голоса(англ.), а мне интересно, есть что-то такое для Arduino. Фишка EZ-B в том, что там не нужно проговаривать команды, просто вводишь текст, а програма распознает всё, и при совпадении выполняет команду.

 

Заранее спасибо! 

да есть shield специальный - Arduino Voice Recognition Module
http://www.emartee.com/product/42120/Arduino%20Voice%20Recognition%20Module
http://www.sparkfun.com/products/10963

NASA
Offline
Зарегистрирован: 03.03.2012

Mastino пишет:

да есть shield специальный - Arduino Voice Recognition Module
http://www.emartee.com/product/42120/Arduino%20Voice%20Recognition%20Module
http://www.sparkfun.com/products/10963

Кто-нибудь сравнивал эти два shield'a ? Разницы в цене почти в два раза. Они на разных чипах сделаны, интересно знать как хорошо они распознают.

EasyVR вроде бы хорошо работает, есть положительные отывы. А вот первый не понятно, так как отзывов мало, а на демо видео уж как-то очень стараются в произношении и громкости.

carduino.ru
Offline
Зарегистрирован: 06.12.2011

Сравнения я не встречал, а небольшие отчеты работы этих модулей видел здесь и здесь 

Pavel_
Offline
Зарегистрирован: 19.03.2012

carduino.ru пишет:

небольшие отчеты работы этих модулей видел здесь и здесь 

и еще здесь :)

NASA
Offline
Зарегистрирован: 03.03.2012

Pavel_ пишет:

carduino.ru пишет:

небольшие отчеты работы этих модулей видел здесь и здесь 

и еще здесь :)

Павел, а как всё таки с чувствительностью ? Как далеко микрофон от вас был, и как влияют посторонние шумы? Скажем так, при работающем телевизоре или музыке оно команды распознаёт? Или надо ходить с микрофоном в тишине ? :-)

Pavel_
Offline
Зарегистрирован: 19.03.2012

NASA пишет:

Павел, а как всё таки с чувствительностью ? Как далеко микрофон от вас был, и как влияют посторонние шумы? Скажем так, при работающем телевизоре или музыке оно команды распознаёт? Или надо ходить с микрофоном в тишине ? :-)

чувствительность очень хорошая, особенно если изначально записать команды в условиях тишины и на расстоянии 3-4х метров, так у меня записывались команды Вики и Свет, остальные - не было возможности....записывал ночью нашептывая в микрофон )) поэтому на видео эти команды приходится повторять и произносить громко (позже как подвернуться необходимые условия....перезапишу их).

на видео, микрофон (установлен под потолок в фальш-панель люстры как и остальное железо) от меня находился на расстоянии 1,5 метра, но распознает с любого угла комнаты, даже если с кухни крикнуть иногда схватывает )

про шумы - сильные шумы мешают....например громкая погремушка ребенка обсалютно гулшила все мои команды ))

при работающей музыке - в течении дня довольно долго играло интернет радио с громкостью для комфортного прослушивания в пределах комнаты - команды распознавались успешно.

при работающем телевизоре - пока еще нетестировалось, редко его включаю, последний раз по моему новогоднее поздравление президента смотрел ))

ходить с микрофоном в моем случае не получится т.к. как я уже сказал выше, он у меня под потолком в люстру встроен :-)

chaytan
Offline
Зарегистрирован: 02.02.2012

можна микрофончик с услителем и АРУ применить. при правильно отстроеном АРУ даже шепот слышен отчетливо, и в тоже время нет переусиления при нормальном и громком разговоре. по крайней мере, все ролики что видел на тему голосового управления страдают именно некоторым повышением тона. 

диалог должен быть непринужденным, как по мне.

carduino.ru
Offline
Зарегистрирован: 06.12.2011

Диалог должен быть контрастным и ярким для того что бы его можно было отличить от непринужденного диалога 

chaytan
Offline
Зарегистрирован: 02.02.2012

как по мне так вовсе наоборот, в чем прикол когда приходишь и начинаешь говорить на повышеных тонах... а ночью, что тоже громко говорить??? 

ведь всеравно, запуск программы по кодовому слову... без него любой диалог игнорируется...

skystorm
skystorm аватар
Offline
Зарегистрирован: 17.01.2012

Почитал, взял тоже попробывать EasyVR, с нуля разабрался за один вечер.
Понравилось! Теперь будет в наличии в моем магазине "Модуль голосового управления для Arduino EasyVR"

log-win
Offline
Зарегистрирован: 18.04.2012

А к меге помогите подключить EasyVR , в демо коде используется софтовый сериал , и режим бриджа .

У меге 4 аппаратных сериал , вот к 4 хочу подключить , ни как не могу справится со скетчем .

axill
Offline
Зарегистрирован: 05.09.2011

Pavel_ пишет:

carduino.ru пишет:

небольшие отчеты работы этих модулей видел здесь и здесь 

и еще здесь :)

Классный пример! :) Обработка в EasyVR сделана в две ступени?

Т.е. сначала распознается "Вики" и только потом ловится команда, так?

Zapek@n
Offline
Зарегистрирован: 16.02.2012

Тоже хочу взять. В домите 38 Евро http://domit.co.uk/ru/arduino-shields/arduino-veear-easyvr-shield.html

Была ветка про подключение, грабли и обновление прошивки на этом модуле http://arduino.ru/forum/programmirovanie/nuzhna-pomosh-po-easyvr-shield

log-win
Offline
Зарегистрирован: 18.04.2012

Была ветка про подключение, грабли и обновление прошивки на этом модуле http://arduino.ru/forum/programmirovanie/nuzhna-pomosh-po-easyvr-shield   - ссылка не работает .

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

 

Pavel_
Offline
Зарегистрирован: 19.03.2012

axill пишет:

Pavel_ пишет:

carduino.ru пишет:

небольшие отчеты работы этих модулей видел здесь и здесь 

и еще здесь :)

Классный пример! :) Обработка в EasyVR сделана в две ступени?

Т.е. сначала распознается "Вики" и только потом ловится команда, так?


 

использовал модуль VRBot.

ну можно и так сказать "в две ступени", но по научному )) - слово триггер (Вики), при распозновании которого программа переходеит в подменю, в котором уже ожидает другие команды (Свет, Темно, Ярко), в общем все как Вы и предполождили.

axill
Offline
Зарегистрирован: 05.09.2011

Pavel_ пишет:

использовал модуль VRBot.

ну можно и так сказать "в две ступени", но по научному )) - слово триггер (Вики), при распозновании которого программа переходеит в подменю, в котором уже ожидает другие команды (Свет, Темно, Ярко), в общем все как Вы и предполождили.

VRBot это тоже, что EasyVR?

микрофон штатный, из комплекта?

Zapek@n
Offline
Зарегистрирован: 16.02.2012

log-win пишет:

- ссылка не работает .

Прощу прощения, пробел затесался. Вот правильные ссылки:

http://domit.co.uk/ru/arduino-shields/arduino-veear-easyvr-shield.html

http://arduino.ru/forum/programmirovanie/nuzhna-pomosh-po-easyvr-shield
 

Pavel_
Offline
Зарегистрирован: 19.03.2012

axill пишет:

Pavel_ пишет:

использовал модуль VRBot.

ну можно и так сказать "в две ступени", но по научному )) - слово триггер (Вики), при распозновании которого программа переходеит в подменю, в котором уже ожидает другие команды (Свет, Темно, Ярко), в общем все как Вы и предполождили.

VRBot это тоже, что EasyVR?

микрофон штатный, из комплекта?

Тоже самое, но EasyVR лучше )

в EasyVR еще есть возможность воспроизводить записанные звуки (до 9 минут записанного звука или речи).

в моем проекте звуки "слушаю"и "повторите" записаны в ардуинку и ею-же воспроизводятся, еще хотел, что бы  было подтверждение успешно выполненой команды звуком "готово", но памяти 4кБ ардуинки не хватило ((

Да, микрофон используется штатный.

log-win
Offline
Зарегистрирован: 18.04.2012

А какой версией компилятора загоняете скетч в ардуино ? Я на 1.1 не могу скомпилировать , пишет ошибку в библиотеке .

Если не сложно скинте счетч . Используется режим бридж и софтсериал , или чисто на аппаратном UART построено ??

Просто тут вот непонятнка , Есть отдельно платка EasyVR , есть DevKit , вот через дев кит все отлично тестится  , на платку звуки и команды записываются . НО когда подключаю к ардуинке то никаких признаков , сериал монитор пишет что не обнаружен EasyVR . Это проделваю на разных платах и на UNO и на Mega . 

 

 

Pavel_
Offline
Зарегистрирован: 19.03.2012

log-win пишет:
А какой версией компилятора загоняете скетч в ардуино ? Я на 1.1 не могу скомпилировать , пишет ошибку в библиотеке .
 версия компилятора 1.0

log-win пишет:
Если не сложно скинте счетч . Используется режим бридж и софтсериал , или чисто на аппаратном UART построено ??

#include <SoftwareSerial.h>
#include "protocol.h"

#include <stdint.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "listen.h"
#include "repeat.h"
//#include "performed.h"
//#define SAMPLE_RATE 16000

uint8_t _receivePin;
uint8_t _transmitPin;
long _baudRate;
int _bitPeriod;

int mute=0; //переменная состояния тишины
int svet1state=1; //переменная состояния вкл-выкл SVET_1
int svet2state=1; //переменная состояния вкл-выкл SVET_2

int speakerPin = 11;
volatile uint16_t sample=0;
volatile uint8_t lastSample, FirstSample;
volatile byte new_data,future_data,old_data;
volatile byte stat=0;
unsigned char *wave;
unsigned int length;

void setup(){  
  
  // PC UART Init
  pinMode(0, INPUT);         // sets the digital pin as input
  pinMode(1, OUTPUT);        // sets the digital pin as output

  // VRbot UART Init
  pinMode(12, INPUT);        // sets the digital pin as input
  pinMode(13, OUTPUT);       // sets the digital pin as output
  
  // Input Output Init
  pinMode(2,INPUT);          // sets the digital pin as input
  pinMode(3,OUTPUT);         // sets the digital pin as output
  pinMode(4,OUTPUT);         // sets the digital pin as output
  
  pinMode(5,OUTPUT);         // buzz
  pinMode(7,OUTPUT);         // svet_1
  pinMode(8,OUTPUT);         // svet_2
      
  digitalWrite(3,HIGH);      // Set pin 3 high
  digitalWrite(4,LOW);       // Set pin 4 low
  
  //digitalWrite(5,HIGH);    // test buzz
  digitalWrite(7,HIGH);      // default svet_1=ON
  digitalWrite(8,HIGH);      // default svet_2=ON
    
 pinMode(speakerPin, OUTPUT);
 digitalWrite(11, LOW);
  
  // connect Di2 to Di3 to enter Normal mode - Di2 is high
  // connect Di2 to Di4 to enter Bridge mode - Di2 is low
  // bridge mode allow direct communication between VRbot module and VRbot GUI software

  if (digitalRead(2)==LOW){   // if Di2 is LOW enter Bridge mode 
      
      while(1)
      {
        int pc2vr = digitalRead(0);
        digitalWrite(13, pc2vr);
    
        int vr2pc = digitalRead(12);
        digitalWrite(1, vr2pc);
     }
  } 

  // if Di2 is HIGH enter Normal mode
  Serial.begin(9600);
  delay(200);
  Serial.println("Arduino 2009 VRBot control program");
  Serial.println("Normal Mode");
  
  // Set up and detect VRbot
  
  VRbot_setup();  

 

leshak
Offline
Зарегистрирован: 29.09.2011

 На всякий случай напомню что SoftwareSerial не на любом пине может RX организовать. 

На всякий случай сверте свое подключение с разделом "Limitations" на странице библиотеки http://arduino.cc/en/Reference/SoftwareSerial 

А "ошибка в библиотеке", убедитесь что не стоит какая-нибудь старая версия SoftwareSerial. Раньше ее нужно было "ставить отдельно", а потом она вошла "в официальную поставку". Может "со старых времен" что-то осталось и "законфликтовало".

log-win
Offline
Зарегистрирован: 18.04.2012

leshak пишет:

 На всякий случай напомню что SoftwareSerial не на любом пине может RX организовать. 

На всякий случай сверте свое подключение с разделом "Limitations" на странице библиотеки http://arduino.cc/en/Reference/SoftwareSerial 

А "ошибка в библиотеке", убедитесь что не стоит какая-нибудь старая версия SoftwareSerial. Раньше ее нужно было "ставить отдельно", а потом она вошла "в официальную поставку". Может "со старых времен" что-то осталось и "законфликтовало".

Дело в том что я не хочу использовать сериалсофт !

На меге есть 4 аппаратных сериал , вот на Serial1  , пины 18 и 19 я и хочу подключить VR .

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

  SoftwareSerial port(12,13);

#include "EasyVR.h"
 

EasyVR easyvr(port);

port.begin(9600);

Вот команды кода где используются софтсериал , получается что к переменной easyvr  привязывается все ,

вот строка на пример далее по использованию языка на модуле

easyvr.setLanguage(EasyVR::ITALIAN);

Вот как правильно подправить скетч ?? чтоб не софт сериал а Serial1 ??

step962
Offline
Зарегистрирован: 23.05.2011

log-win пишет:

  SoftwareSerial port(12,13);

Здесь вы определяете объект port класса SoftwareSerial и инициализируете его, задавая пины приема/передачи.

Закомментируйте ее.

log-win пишет:

#include "EasyVR.h"

Тут вы подцепляете библиотеку для работы с голосом. Оставьте как есть

log-win пишет:

EasyVR easyvr(port);

Тут сождаете объект easyvr класса EasuVR и инициализируете его, передавая в качестве Serial-интерфейса объект port. Исправьте на что-нибудь типа EasyVR easyvr(Serial1).

log-win пишет:

port.begin(9600);

Правим на Serial1.begin(9600);

Ну и дальше по тексту (СВОЕГО скетча - не библиотеки) заменяем все вхождения port на Serial1.

Много таких вхождений? Тогда определите переменную port:

ClassName port;

и свяжите ее с объектом Serial1:

port=Serial1;

ClassName здесь - имя класса для аппаратного сериала. Вроде бы HardwareSerial, но это надо проверить на практике.

По идее этого должно быть достаточно...

 

log-win
Offline
Зарегистрирован: 18.04.2012

Попробовал я сделать изменения но ничего не получается , скеч дает ошибку на этих изменениях . В общем помогите подправить код для работы по Serial1 . Вот есть скеч , в нем пины для LED не присвоены пока , но это легко  , а вот справится с сериал ну ни как не могу .

#if defined(ARDUINO) && ARDUINO >= 100
  #include "Arduino.h"
  #include "SoftwareSerial.h"
  SoftwareSerial port(12,13);
#else // Arduino 0022 - use modified NewSoftSerial
  #include "WProgram.h"
  #include "NewSoftSerial.h"
  NewSoftSerial port(12,13);
#endif

#include "EasyVR.h"
EasyVR easyvr(port);

//Groups and Commands
enum Groups
{
  GROUP_0  = 0,
  GROUP_1  = 1,
};

enum Group0 
{
  G0_ARDUINO = 0,
};

enum Group1 
{
  G1_LED_ON = 0,
  G1_LED_OFF = 1,
};


EasyVRBridge bridge;

int8_t group, idx;

void setup()
{
  // bridge mode?
  if (bridge.check())
  {
    cli();
    bridge.loop(0, 1, 12, 13);
  }
  // run normally
  Serial.begin(9600);
  port.begin(9600);

  if (!easyvr.detect())
  {
    Serial.println("EasyVR not detected!");
    for (;;);
  }

  easyvr.setPinOutput(EasyVR::IO1, LOW);
  Serial.println("EasyVR detected!");
  easyvr.setTimeout(5);
  easyvr.setLanguage(0);

  group = EasyVR::TRIGGER; //<-- start group (customize)
}

void action();

void loop()
{
  easyvr.setPinOutput(EasyVR::IO1, HIGH); // LED on (listening)

  Serial.print("Say a command in Group ");
  Serial.println(group);
  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];
    Serial.print("Command: ");
    Serial.print(idx);
    if (easyvr.dumpCommand(group, idx, name, train))
    {
      Serial.print(" = ");
      Serial.println(name);
    }
    else
      Serial.println();
    easyvr.playSound(0, EasyVR::VOL_FULL);
    // perform some action
    action();
  }
  else // errors or timeout
  {
    if (easyvr.isTimeout())
      Serial.println("Timed out, try again...");
    int16_t err = easyvr.getError();
    if (err >= 0)
    {
      Serial.print("Error ");
      Serial.println(err, HEX);
    }
  }
}

void action()
{
    switch (group)
    {
    case GROUP_0:
      switch (idx)
      {
      case G0_ARDUINO:
        // write your action code here
        // group = GROUP_X; <-- or jump to another group X for composite commands
        break;
      }
      break;
    case GROUP_1:
      switch (idx)
      {
      case G1_LED_ON:
        // write your action code here
        // group = GROUP_X; <-- or jump to another group X for composite commands
        break;
      case G1_LED_OFF:
        // write your action code here
        // group = GROUP_X; <-- or jump to another group X for composite commands
        break;
      }
      break;
    }
}

 

 В принципе получать инфу на сериал монитор мне не надо , достаточно нормальной работы связки .

Тоесть хочу убрать от суды сериалсофт и режим бриджа . Но как чего убираю так скеч не проходит проверку .

step962
Offline
Зарегистрирован: 23.05.2011

log-win пишет:

Попробовал я сделать изменения но ничего не получается , скеч дает ошибку на этих изменениях .

1) Ну, наверное, все же не скетч, а компилятор.

2) Что за ошибка? (текст сообщений)

leshak
Offline
Зарегистрирован: 29.09.2011

step962 пишет:

Ну и дальше по тексту (СВОЕГО скетча - не библиотеки) заменяем все вхождения port на Serial1.

Можно еще попробовать возложить эту отвественную работу на сам компилятор

#define port Serial1

Тогда, если нам вдруг придумаете переехать на другой сериал - исправим на #define port Serial2

leshak
Offline
Зарегистрирован: 29.09.2011

log-win пишет:

Попробовал я сделать изменения но ничего не получается , скеч дает ошибку на этих изменениях . В общем помогите подправить код для работы по Serial1 . Вот есть скеч , в нем пины для LED не присвоены пока , но это легко  , а вот справится с сериал ну ни как не могу .

Что-то не видно ваших попыток "сделать изменения". Попробуйте вообще выкинуть строки с первой по восьмую. И вместо них написать

#define port Serial1

И если "будут ошибки", то не нужно предполагать наличие телепатов. Лучше просто скажите что за ошибки.

 

log-win
Offline
Зарегистрирован: 18.04.2012


#include "EasyVR.h"
EasyVR easyvr(Serial1);

//Groups and Commands
enum Groups
{
  GROUP_0  = 0,
  GROUP_1  = 1,
};

enum Group0 
{
  G0_ARDUINO = 0,
};

enum Group1 
{
  G1_LED_ON = 0,
  G1_LED_OF = 1,
};


EasyVRBridge bridge;

int8_t group, idx;

void setup()
{

  // run normally
  Serial.begin(9600);
  Serial1.begin(9600);

  if (!easyvr.detect())
  {
    Serial.println("EasyVR not detected!");
    for (;;);
  }

  easyvr.setPinOutput(EasyVR::IO1, LOW);
  Serial.println("EasyVR detected!");
  easyvr.setTimeout(5);
  easyvr.setLanguage(0);

  group = EasyVR::TRIGGER; //<-- start group (customize)
}

void action();

void loop()
{
  easyvr.setPinOutput(EasyVR::IO1, HIGH); // LED on (listening)

  Serial.print("Say a command in Group ");
  Serial.println(group);
  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];
    Serial.print("Command: ");
    Serial.print(idx);
    if (easyvr.dumpCommand(group, idx, name, train))
    {
      Serial.print(" = ");
      Serial.println(name);
    }
    else
      Serial.println();
    easyvr.playSound(0, EasyVR::VOL_FULL);
    // perform some action
    action();
  }
  else // errors or timeout
  {
    if (easyvr.isTimeout())
      Serial.println("Timed out, try again...");
    int16_t err = easyvr.getError();
    if (err >= 0)
    {
      Serial.print("Error ");
      Serial.println(err, HEX);
    }
  }
}

void action()
{
    switch (group)
    {
    case GROUP_0:
      switch (idx)
      {
      case G0_ARDUINO:
        // write your action code here
        // group = GROUP_X; <-- or jump to another group X for composite commands
        break;
      }
      break;
    case GROUP_1:
      switch (idx)
      {
      case G1_LED_ON:
        // write your action code here
        // group = GROUP_X; <-- or jump to another group X for composite commands
        break;
      case G1_LED_OF:
        // write your action code here
        // group = GROUP_X; <-- or jump to another group X for composite commands
        break;
      }
      break;
    }
}

Ребятки низкий поклон вам , все разобрался . Спасибочки .

Вот какие изменения сделал и все заработало .

Я сам немного косякнул , после изменения не выбрал что у меня мега , а стояло уно , :) .

 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Настало время заняться включением света голосом.

Хочу приобрести Voice recognition V3

Кто использует, кто пробовал. Ваше мнение?

bwn
Offline
Зарегистрирован: 25.08.2014

Затейница, Вы.)))))

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

[Скрытый текст]

Пока муж денег дал надо пробовать XD

[/Скрытый текст]