Reconnaissance vocale : EasyVR

Bonjour à tous.
J’ai un projet de reconnaissance vocale à faire. Je dois lire une piste audio, reconnaitre un oui ou un non, relire une piste audio et de nouveau reconnaitre un oui ou un non. Selon si j’ai deux fois oui, deux fois non ou un oui/non je lirai une piste audio différente.

Pour cela j’ai acheté sur le site Fortebit un shield easyVR 3+. J’ai ensuite téléchargé une bibliothèque de grammaire “oui/non” disponible sur leur site.

Voilà le code que j’ai réalisé.

#include "Arduino.h"
#if !defined(SERIAL_PORT_MONITOR)
  #error "Arduino version not supported. Please update your IDE to the latest version."
#endif

#if defined(__SAMD21G18A__)
  // Shield Jumper on HW (for Zero, use Programming Port)
  #define port SERIAL_PORT_HARDWARE
  #define pcSerial SERIAL_PORT_MONITOR
#elif defined(SERIAL_PORT_USBVIRTUAL)
  // Shield Jumper on HW (for Leonardo and Due, use Native Port)
  #define port SERIAL_PORT_HARDWARE
  #define pcSerial SERIAL_PORT_USBVIRTUAL
#else
  // Shield Jumper on SW (using pins 12/13 or 8/9 as RX/TX)
  #include "SoftwareSerial.h"
  SoftwareSerial port(12, 13);
  #define pcSerial SERIAL_PORT_MONITOR
#endif

#include "EasyVR.h"

EasyVR easyvr(port);

//Groups and Commands
enum Groups
{
};

//Grammars and Words
enum Wordsets
{
  SET_1  = -1,
  SET_2  = -2,
  SET_3  = -3,
  SET_4  = -4,
};


enum Wordset4 
{
  S4_YES = 0,
  S4_NO = 1,
};


// use negative group for wordsets
int8_t group, idx;

int a;
int b;
int c;
int s;

void setup()
{
  a=0;
  b=0;
  c=0;
  s=0;
  
  // setup PC serial port
  pcSerial.begin(9600);
bridge:
  // bridge mode?
  int mode = easyvr.bridgeRequested(pcSerial);
  switch (mode)
  {
  case EasyVR::BRIDGE_NONE:
    // setup EasyVR serial port
    port.begin(9600);
    // run normally
    pcSerial.println(F("Bridge not requested, run normally"));
    pcSerial.println(F("---"));
    break;
    
  case EasyVR::BRIDGE_NORMAL:
    // setup EasyVR serial port (low speed)
    port.begin(9600);
    // soft-connect the two serial ports (PC and EasyVR)
    easyvr.bridgeLoop(pcSerial);
    // resume normally if aborted
    pcSerial.println(F("Bridge connection aborted"));
    pcSerial.println(F("---"));
    break;
    
  case EasyVR::BRIDGE_BOOT:
    // setup EasyVR serial port (high speed)
    port.begin(115200);
    pcSerial.end();
    pcSerial.begin(115200);
    // soft-connect the two serial ports (PC and EasyVR)
    easyvr.bridgeLoop(pcSerial);
    // resume normally if aborted
    pcSerial.println(F("Bridge connection aborted"));
    pcSerial.println(F("---"));
    break;
  }

  // initialize EasyVR  
  while (!easyvr.detect())
  {
    pcSerial.println(F("EasyVR not detected!"));
    for (int i = 0; i < 10; ++i)
    {
      if (pcSerial.read() == '?')
        goto bridge;
      delay(100);
    }
  }

  pcSerial.print(F("EasyVR detected, version "));
  pcSerial.print(easyvr.getID());

  if (easyvr.getID() < EasyVR::EASYVR3)
    easyvr.setPinOutput(EasyVR::IO1, LOW); // Shield 2.0 LED off

  if (easyvr.getID() < EasyVR::EASYVR)
    pcSerial.print(F(" = VRbot module"));
  else if (easyvr.getID() < EasyVR::EASYVR2)
    pcSerial.print(F(" = EasyVR module"));
  else if (easyvr.getID() < EasyVR::EASYVR3)
    pcSerial.print(F(" = EasyVR 2 module"));
  else
    pcSerial.print(F(" = EasyVR 3 module"));
  pcSerial.print(F(", FW Rev."));
  pcSerial.println(easyvr.getID() & 7);

  easyvr.setDelay(0); // speed-up replies

  easyvr.setTimeout(5);
  easyvr.setLanguage(5); //<-- same language set on EasyVR Commander when code was generated

  group = SET_4; //<-- start group (customize)
}

void loop()
{
  while (b<1) // pour que la piste audio ne tourne pas en boucle
  {
    easyvr.playSound(1,EasyVR::VOL_FULL);// lire la première piste audio
    b=2;
  }
  
  while (s<2)
  {
    if (easyvr.getID()<EasyVR::IO1,HIGH);
      easyvr.setPinOutput(EasyVR:: IO1, HIGH); // en écoute

    if (group<0)
    {
      pcSerial.print("Say a word");
      pcSerial.println(group);
      easyvr.recognizeWord(group);
    }
  
    while (!easyvr.hasFinished());

    if (easyvr.getID()<EasyVR::IO1,HIGH);
      easyvr.setPinOutput(EasyVR::IO1,LOW); // n'écoute plus
    
    idx=easyvr.getWord();

    if (idx==1 && group==SET_4)
    {
      a=a; // si l'utilisateur dit non alors a reste à 0
    }

    else if (idx==0 && group==SET_4)
    {
      a=a+1; // si l'utilisateur dit oui alors a reste augmente de 1
    }

    else
    {
      pcSerial.print("Erreur");
    }

    while (c<1) // pour que la piste audio ne soit pas lue en boucle
    {
      easyvr.playSound(2,EasyVR::VOL_FULL);
      c=2;
    }

    s=s+1; // s augmente de 1 donc le programme fera 2 tours et donc 2 reconnaissances vocales
    }
 

  if(a==1) // si oui/non ou non/oui alors piste audio 3
  {
    easyvr.playSound(3,EasyVR::VOL_FULL);
  }

  else if (a==2) // si oui/oui alors piste audio 4
  {
    easyvr.playSound(4,EasyVR::VOL_FULL);
  }

   else if (a==0) // si non/non alors piste audio 4
  {
   easyvr.playSound(4,EasyVR::VOL_FULL);
  }
  }
  



void action()
{
  switch (group)
  {
  case SET_4:
    switch (idx)
    {
    case S4_YES:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case S4_NO:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    }
    break;
  }
}

J’arrive bien à lire les pistes audio comme je le souhaite mais je n’arrive pas à lancer la reconnaissance vocale. Je ne sais pas si je devrai utiliser le void action car quand je le fais cela termine le programme à la première reconnaissance vocale.

Merci de votre aide