Ci-dessous une traduction“Google” avec ses défauts
EasyVR est un Module de reconnaissance vocale conçu pour ajouter facilement des fonctions polyvalentes,des capacités de reconnaissance vocale efficaces à pratiquement n'importe quelle application. Le module EasyVR peut être utilisé avec n'importe quel hôte avec une interface UART ( Serie RS232) alimentée en 3.3V-5V, comme PIC, Arduino, Raspberry. Certains exemples d'application incluent l'automatisation domotique, telle que la lumière commandée par la voix, Interrupteurs, serrures ou lits, ou ajouter de la reconnaissance vocale aux robots.
Dans les commandes Speaker Independent (SI) pour les commandes de base prêtes pour les Langues suivantes:
Prise en charge jusqu'à 32 utilisateurs
L'EasyVR est un module “esclave” communiquant via une interface série asynchrone (communément appelée Interface UART), avec Les caractéristiques suivantes:
Exemple d'une série Cadre de données représentant le caractère “A” (décimal 65 ou hexadécimal 41)
Le microphone fourni avec le module EasyVR est un microphone à condensateur électreté omnidirectionnel (Horn EM9745P-382):
Une bonne fixation du micro peut nettement améliorer la qualité de la reconnaissance vocale
1. Montage encastré -L'élément de microphone doit être positionné aussi près du support surface et doit être bien maintenu dans un boîtier en plastique. Il ne doit pas y avoir d'espace entre le microphone et le boîtier. Un tel espace peut conduire à une résonance acoustique, Ce qui peut réduire la précision de la reconnaissance.
2. Aucun obstacle, avec un grand trou - La zone devant l'élément de microphone doit être dégagée sans obstruction, afin d'éviter toute interférence avec la reconnaissance. Le diamètre du trou dans le boîtier pour l'entrée du micro, doit être d'au moins 5 mm. Toute la surface en plastique devant le micro doit être aussi mince que possible, ne dépassant pas 0,7 mm.
3.Isolation - Le micro doit être isolé acoustiquement du boîtier. Ceci peut être réalisé en entourant l'élément de micro avec un matériau spongieux tel que du caoutchouc ou de la mousse. Le micro fourni possède ce type de mousse isolante. Le but est de prévenir les bruits parasites produits par la manipulation,de tels bruits parasites peuvent réduire la précision de la reconnaissance.
4.Distance -Si le micro est placé entre 15 cm à 30 cm de la bouche du locuteur, La puissance du signal diminue d'un facteur quatre en fonction de la distance. Les différences entre une voix forte et une voix douce peuvent également faire varier d'un facteur quatre la puissance du signal. Bien que le préamplificateur interne EasyVR compense une large plage dynamique de la puissance du signal d'entrée, si sa portée est dépassée, l'application utilisateur peut fournir une réponse au locuteur au sujet du volume de la voix. voir annexe “Erreur R codes”
Sur le côté inférieur de la carte il y a deux résistances SMD que vous pouvez déplacer pour sélectionner les deux broches de Arduino sur lequel l'EasyVR sera connecté en mode Serial Logiciel (Mode Jumper sur SW).
RX-Broche du récepteur série Serial
TX-Broche du transmetteur série logiciel
Le choix des broches 12 - 13 pour une compatibilité ascendante avec les révisions matérielles précédentes du bouclier EasyVR. Cependant, ces broches peuvent également être utilisées pour l'interface SPI, donc un autre choix de broches 8 - 9 est prévu. Si vous voulez utiliser des broches différentes assurez-vous La broche du récepteur supporte les interruptions de changement.
On peut faire des réglages pour améliorer la reconnaissance vocale dans le menu “Tools” et “Recognition Settings”
Mais cela reste quand même assez pointu pour faire un bon réglage , je vais me contenter dans un premier temps des sons enregistrés en implicite (voir WordSet 1,2,et 3). Ils sont mieux reconnu même si l'on change de voix.
Avec Arduino 2009 Uno - Mega
Testez le Shield avec Arduino
Testez le bouclier avec le EasyVR Commander
Télécharger un nouveau son dans le tableau ou mise à jour du firmware
Lorsque le EasyVR Commander est connecté, vous pouvez générer un modèle de code pour Arduino Cela va Utiliser les bibliothèques fournies (voir Librairie EasyVR pour Arduino ). Il vous suffit d'écrire des commandes reconnues.
EasyVR-Commander-3.14.0.232-All
easyvr-arduino-library-1.11.1.zip
Le programme EasyVR V3.14.0 est utilisé pour entrer les commandes vocales dans le module. Ce programme est un programme Windows, on peut l'installer sous Linux via wine , mais il faut paramétrer les ports com 1, com2 ou autres.
Une méthode, dans le répertoire .wine/dosdevices taper la commande ln -s /dev/ttyUSB0 com1 , cela ne fonctionne pas à tout les coups…
Lancer le logiciel EasyVR3 et connecté votre Arduino avec le shield inséré et vérifié le cavalier sur “PC” , connecté par “File” et “Connect” . Vous avez toutes les commandes vocales qui s'affichent dans les différents groupes. Au départ il n'y a que dans le groupe “Trigger” avec “Robot” et dans les groupes “Wordset”.
Il est proposé 15 groupes pour la programmation des commandes. Avec 32 commandes Maxi à configurer en tout. La premier chose à faire c'est de configurer le Français, dans “Tools” → “Set Language” → “French”. Ceci pour les commandes implicites en Francais , mais pas pour les menus…
On va faire un exemple simple pour commencer , allumer une LED sur la broche 9 de l'Arduino avec 2 commandes vocales : ALLUME et ETEINT
On se positionne sur le Groupe 1 ( Index 1) , on va dans “Edit” → “Add Command” ou ” Shift+INS“. Une nouvelle ligne s'affiche dans la fenêtre de droite, taper dans le champ colonne “Label” le mot “ALLUME”. En fait on peut taper ce que l'on veut, mais si l'on tape “ETEINT” et que l'on veut allumer cela être très compliqué à gérer. Le logiciel ne reconnais pas le mot mais le son que l'on va enregistrer pour ce mot.
Maintenant on va enregistrer le son lié au mot, Sélectionner la ligne “ALLUME” dans “Edit” → “Train Command” ou “ENTER” Un pop up s'affiche nous demandant de cliquer sur le bouton “Phase1” . A partir de ce clic, l'affichage “Speak now…” dure 5 secondes pour enregistre le son. S'il n'y pas pas reconnaissance d'un son une fenêtre “Timeout expired” s'affiche . Cliquer sur “OK” et recommencer “Phase 1”. Quand la phase 1 est terminée , une phase 2 et proposée pour vérifier à nouveau le son , on clique sur “Phase 2” et on réenregistre le même son, si les 2 sons ne sont pas identique il faut recommencer la phase 2 et si le délai est trop long ou le son trop long , il faut tout recommencer au début. Quand le son est bon , on a dans le champ “Trained” la valeur 2 , qui indique que les 2 enregistrements sont bon et prêt à être utilisés . Si dans le champ “Conflict”, OK n'est pas inscrit, il faut recommencer tout l'enregistrement du mot.
On procède de même pour le deuxième mot et tous les mots que l'on veut enregistrer ( MAX 32 )
On insère également dans le groupe “Trigger” le mot “Arduino” que l'on enregistre de la même manière. Ceci pour avoir une sorte de mot de passe pour démarrer la reconnaissance vocale. On pourrait mettre n'importe quel mot , il faut juste s”en souvenir…
Quand les mots/sons sont enregistrés, on va générer le code pour l'Arduino. Dans “File” → “Generate Code” , on choisi le répertoire et le nom du fichier à généré et “Enregistrer”
On se déconnecte : “File” → “Disconnect”, On remet le cavalier “J7” sur la position “SW”
On ouvre l'IDE Arduino, on charge le programme que l'on vient de générer, on vérifie le type de carte et le port Com utilisé.
dans “void setup()” du programme on insère les lignes :
pinMode(9,OUTPUT); digitalWrite(9,LOW);
Dans le même programme , on va dans le sous programme “void action()”
dans la partie “Case GO_ARDUINO” on insère la ligne
group = GROUP_1;
dans la partie “Case GROUP_1” on insere :
switch (idx) { case G1_ALLUME: digitalWrite(9, HIGHT); group = GROUP_1; // on peut mettre group = GROUP_0 si l'on veut à chaque fois redire le mot de passe "Arduino" break; case G1_ETEINT: digtalWrite(9, LOW); group = GROUP_1; break; }
#include "Arduino.h" #if !defined(SERIAL_PORT_MONITOR) #error "Arduino version not supported. Please update your IDE to the latest version." #endif #if defined(SERIAL_PORT_USBVIRTUAL) // Shield Jumper on HW (for Leonardo and Due) #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 { GROUP_0 = 0, GROUP_1 = 1, }; enum Group0 { G0_ARDUINO = 0, }; enum Group1 { G1_ALLUME = 0, G1_ETEINT = 1, }; int8_t group, idx; void setup() { pinMode(9, OUTPUT); digitalWrite(9,LOW); // setup PC serial port pcSerial.begin(9600); // 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("---")); pcSerial.println(F("Bridge not started!")); 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("---")); pcSerial.println(F("Bridge connection aborted!")); break; case EasyVR::BRIDGE_BOOT: // setup EasyVR serial port (high speed) port.begin(115200); // soft-connect the two serial ports (PC and EasyVR) easyvr.bridgeLoop(pcSerial); // resume normally if aborted pcSerial.println(F("---")); pcSerial.println(F("Bridge connection aborted!")); break; } while (!easyvr.detect()) { Serial.println("EasyVR not detected!"); delay(1000); } easyvr.setPinOutput(EasyVR::IO1, LOW); Serial.println("EasyVR detected!"); easyvr.setTimeout(10); easyvr.setLanguage(5); group = EasyVR::TRIGGER; //<-- start group (customize) } void action(); void loop() { if (easyvr.getID() < EasyVR::EASYVR3) 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()); if (easyvr.getID() < EasyVR::EASYVR3) 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(); // beep 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: group = GROUP_1;// apres avoir dit le mot "Arduino" on va au groupe 1 break; } break; case GROUP_1: switch (idx) { case G1_ALLUME: digitalWrite(9, HIGH); group = GROUP_1;// on reste dans le groupe 1 break; case G1_ETEINT: digitalWrite(9, LOW); group = GROUP_1;// on reste dans le groupe 1 break; } break; } }
le code qui commande l'allumage de la LED 9 par le miaulement d'un chat ou par le meuglement d'une vache et qui l’éteint par le barrissement d'un éléphant. Le code de démarrage est toujours “Arduino”
Les sons Miaou Meuh et Elephant
#include "Arduino.h" #if !defined(SERIAL_PORT_MONITOR) #error "Arduino version not supported. Please update your IDE to the latest version." #endif #if defined(SERIAL_PORT_USBVIRTUAL) // Shield Jumper on HW (for Leonardo and Due) #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); // on déclare le port série virtuel sur les broches 12 et 13 pour le dialogue entre le Shield et l'Arduino #define pcSerial SERIAL_PORT_MONITOR #endif #include "EasyVR.h" // on inclue la bibliothèque EasyVR EasyVR easyvr(port); //Groups and Commands enum Groups // les sons sont programmés avec le logiciel EasyVR v3.11.0 { GROUP_0 = 0,// le groupe 0 contient le mot de passe de démarrage "Arduino" sans ce mot de passe le shield ne démarre pas la reconnaissance vocale GROUP_1 = 1, // les 2 sons pour "ALLUME" et "ÉTEINT" GROUP_2 = 2, // Les 2 sons pour allumer la LED avec une tape sur le bureau et 2 Tapes pour éteindre la LED GROUP_3 = 3, // les 3 sons : Miau et Meuhh pour allumer , le barrissement pour éteindre // GROUP_0 correspond à l'index du groupe 0 dans le logiciel EasyVR etc ... }; enum Group0 { G0_ARDUINO = 0,// le son "ARDUINO" correspond à l'index du son 0 dans le groupe 0 }; enum Group1 { G1_ALLUME = 0,// le son "ALLUME" correspond à l'index du son 0 dans le groupe 1 G1_ETEINT = 1,// le son "ETEINT" correspond à l'index du son 1 dans le groupe 1 }; enum Group2 { G2_TAP = 0, // le son "TAP" correspond à l'index du sons 0 dans le groupe 2 G2_TAPTAP = 1,// le son "TAPTAP" correspond à l'index du son 1 dans le groupe 2 }; enum Group3 { G3_MIAOU = 0, // le son "MIAOU" correspond à l'index du son 0 dans le groupe 3 G3_MEUHHH = 1, // le son "MEUHH" correspond à l'index du son 1 dans le groupe 3 G3_ELEPHANT = 2, // le son "BARRISSEMENT" correspond à l'index du son 2 dans le groupe 3 }; int8_t group, idx;// Déclare les variables "group" et "idx" en entier signé sur 8 bits void setup() { pinMode(9, OUTPUT); // on declare la broche 9 de l'Arduino en sortie digitalWrite(9,LOW); // on eteint la LED 9 // setup PC serial port pcSerial.begin(9600); // 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("---")); pcSerial.println(F("Bridge not started!")); 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("---")); pcSerial.println(F("Bridge connection aborted!")); break; case EasyVR::BRIDGE_BOOT: // setup EasyVR serial port (high speed) port.begin(115200); // soft-connect the two serial ports (PC and EasyVR) easyvr.bridgeLoop(pcSerial); // resume normally if aborted pcSerial.println(F("---")); pcSerial.println(F("Bridge connection aborted!")); break; } while (!easyvr.detect()) { Serial.println("EasyVR not detected!"); delay(1000); } easyvr.setPinOutput(EasyVR::IO1, LOW); // on éteint la led IO1 sur le module reconnaissance vocale Serial.println("EasyVR detected!"); easyvr.setTimeout(10); easyvr.setLanguage(5); group = EasyVR::TRIGGER; //<-- start group (customize) le groupe du début ici on demande le mot de passe "ARDUINO" } void action(); // on test si on reconnais un son void loop() { if (easyvr.getID() < EasyVR::EASYVR3) 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()); if (easyvr.getID() < EasyVR::EASYVR3) 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(); // beep 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 group = GROUP_3; break; } break; case GROUP_1: switch (idx) { case G1_ALLUME: digitalWrite(9, HIGH); group = GROUP_1; break; case G1_ETEINT: digitalWrite(9, LOW); group = GROUP_2; break; } break; case GROUP_2: switch (idx) { case G2_TAP: digitalWrite(9, HIGH); group = GROUP_2; break; case G2_TAPTAP: digitalWrite(9, LOW); group = GROUP_3; break; } break; case GROUP_3: switch (idx) { case G3_MIAOU: digitalWrite(9, HIGH); group = GROUP_3; break; case G3_MEUHHH: digitalWrite(9, HIGH); group = GROUP_3; break; case G3_ELEPHANT: digitalWrite(9, LOW); group = GROUP_3; break; } break; } }
Le programme pour allumer/éteindre la LED9 , en parlant Français , d'abord dire le mot “ROBOT” , un bip retenti. Ensuite le mot “ACTION” allume le LED9 et le mot “ARRETE” éteint la LED9.
#include "Arduino.h" #if !defined(SERIAL_PORT_MONITOR) #error "Arduino version not supported. Please update your IDE to the latest version." #endif #if defined(SERIAL_PORT_USBVIRTUAL) // Shield Jumper on HW (for Leonardo and Due) #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); int8_t group, idx; void setup() { pinMode(9, OUTPUT); digitalWrite(9,LOW); // setup PC serial port pcSerial.begin(9600); // 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("---")); pcSerial.println(F("Bridge not started!")); 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("---")); pcSerial.println(F("Bridge connection aborted!")); break; case EasyVR::BRIDGE_BOOT: // setup EasyVR serial port (high speed) port.begin(115200); // soft-connect the two serial ports (PC and EasyVR) easyvr.bridgeLoop(pcSerial); // resume normally if aborted pcSerial.println(F("---")); pcSerial.println(F("Bridge connection aborted!")); break; } while (!easyvr.detect()) { Serial.println("EasyVR not detected!"); delay(1000); } easyvr.setPinOutput(EasyVR::IO1, LOW); Serial.println("EasyVR detected!"); easyvr.setTimeout(5); easyvr.setLanguage(5); // 0 = Anglais; 5 = Français, en fait le son est Français mais le texte reste Anglais group = 0; //<-- start group (considering to start from custom grammar 0) } void action(); void loop() { if (easyvr.getID() < EasyVR::EASYVR3) easyvr.setPinOutput(EasyVR::IO1, HIGH); // LED on (listening) Serial.print(" Dire la commande WS "); Serial.println(group); easyvr.recognizeWord(group); // pou les commandes SI ( Multi Locuteur) //easyvr.recognizeCommand(group); // used for SD commands/trigger or for built-in trigger word do { // can do some processing while waiting for a spoken command } while (!easyvr.hasFinished()); if (easyvr.getID() < EasyVR::EASYVR3) easyvr.setPinOutput(EasyVR::IO1, LOW); // LED off /* This part of the code is not needed if using SI commands only (excluding the built-in trigger ROBOT) if (idx >= 0) { // built-in trigger (ROBOT) // group = GROUP_X; <-- jump to another group X return; } idx = easyvr.getCommand(); */ idx = easyvr.getWord(); if (idx >= 0) { // print debug message for SI commands uint8_t flags, num; char name[32]; Serial.print("Command: "); Serial.print(idx); if (easyvr.dumpGrammar(group, flags, num)) for (int8_t i = 0; i <= idx; ++i) easyvr.getNextWordLabel(name); pcSerial.print(F(" = ")); pcSerial.println(name); // beep 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 0: // groupe TRIGGER switch (idx) { case 0: group = 1; // saute au Groupe WORDSET N°1 break; } break; case 1: // Groupe WORDSET N°1 switch (idx) { case 0: digitalWrite(9, HIGH); group = 1; break; case 6: digitalWrite(9, LOW); group = 1; break; } break; } }
#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, GROUP_2 = 2, GROUP_3 = 3, }; enum Group0 { G0_ADAM = 0, }; enum Group1 { G1_VEILLE = 0, G1_LUMIERE = 1, }; enum Group2 { G2_ACTIVATION = 0, }; enum Group3 { G3_OUI = 0, G3_NON = 1, }; EasyVRBridge bridge; int8_t group, idx, LED; 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 (;;); } enum Level {NORMAL}; easyvr.setPinOutput(EasyVR::IO1, LOW); Serial.println("EasyVR detected!"); easyvr.setTimeout(10); easyvr.setLanguage(5); easyvr.setKnob(0); easyvr.setLevel(2); 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(); // 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_ADAM: easyvr.playSound(7, EasyVR::VOL_FULL); group = GROUP_1; break; } break; case GROUP_1: switch (idx) { case G1_VEILLE: if (LED == 1) { easyvr.playSound(3, EasyVR::VOL_FULL); group = GROUP_3; } else { easyvr.playSound(1, EasyVR::VOL_FULL); group = GROUP_2; } break; case G1_LUMIERE: if (LED == 1) { LED = 0; easyvr.setPinOutput(EasyVR::IO2, LOW); easyvr.playSound(9, EasyVR::VOL_FULL); group = GROUP_1; } else { LED = 1; easyvr.setPinOutput(EasyVR::IO2, HIGH); easyvr.playSound(8, EasyVR::VOL_FULL); group = GROUP_1; } break; } break; case GROUP_2: switch (idx) { case G2_ACTIVATION: easyvr.playSound(2, EasyVR::VOL_FULL); group = GROUP_0; break; } break; case GROUP_3: switch (idx) { case G3_OUI: LED = 0; easyvr.playSound(1, EasyVR::VOL_FULL); easyvr.setPinOutput(EasyVR::IO2, LOW); group = GROUP_2; break; case G3_NON: easyvr.playSound(1, EasyVR::VOL_FULL); group = GROUP_2; break; } break; } }
Explications
Voici le code, explication plus en détails :
easyvr.playSound(1, EasyVR::VOL_FULL);
Cette ligne a pour fonction de sélectionner un enregistrement préalablement fait sur Audacity (ou autre) lorsqu'une instruction aura été reconnue.
Cet enregistrement est à envoyer sur la carte à l'aide de QuickSynthesis, un logiciel complémentaire du logiciel EasyVRCommander (téléchargeable sur ce site avec le manuel utilisateur et la datasheet pour de plus amples informations : http://www.veear.eu/products/easyvr-arduino-shield/ )
qui permet d'enregistrer les commandes vocales à reconnaître à l'aide du micro fourni avec le shield.
Si on décortique ce qu'il y a entre parenthèses, le 1 signifie que c'est le premier enregistrement qui est sélectionné (Dans mon cas, il dira “Au revoir Monsieur) dans la liste de tout ceux que vous aurez enregistré sur la carte. VOL_FULL sert évidemment à contrôler le volume sortant des haut-parleurs.
case G1_LUMIERE: if (LED == 1)
Plus de détails sur ces deux lignes : La première ligne correspond à l'instruction reconnue par le micro (petite info, une fois les commandes enregistrées sur EasyVRCommander, il vous est possible de générer automatiquement le code, il ne vous suffira alors plus qu'à le modifier à votre guise pour répondre à vos besoins), celle du dessous correspond à une condition qui détecte si la LED est déjà allumée ou pas, l'utilité étant de n'utiliser que le mot LUMIERE pour allumer et éteindre la LED.