Pour réaliser l’analyse d’une commande vocale j’utilise trois mots, le premier décrit l’action, le second l’élément et le troisième l’emplacement
Ex [B]Allumer lumière salon, éteindre lumière salon[/B]
Je dispose de trois tableaux contenant les actions, éléments et emplacements. Lorsqu’une commande vocale est reconnue l’api androïd renvoie un tableau de chaine. Je parcourt les tableaux et recherche les mots dans la chaine si je trouve une occurrence je sauvegarde l’index du tableau.
Ex
ACTION = 0 (allumer), ELEMENT=0 (lumière), EMPLACEMENT=2(salon).
ACTION = 1 (éteindre), ELEMENT=0 (lumière), EMPLACEMENT=2(salon).
Ensuite je détermine un code commande avec une formule de la forme :
65536 *ELEMENT +256* EMPLACEMENT+ ACTION
Soit 0*65536+2*256+0=512 pour allumer lumière salon
Et 0*65536+2*256+1=513 pour éteindre lumière salon
J’envoie ensuite ce code à une méthode de la classe qui se charge d’envoyer une commande Modbus à l’automate. La méthode lit les états des lumières, une structure switch case sélectionne les instructions a exécuter selon l’état de la lumiere.et le code commande calculé
La solution actuelle suffisait pour des actions simples, et encore j’ai dut tricher par exemple pour les 2 volets de la cuisine ; j’ai rajouté les emplacments : cuisine coté et cusine arrière 2 mots au lieu d’un mais bon cela fonctionne...
Maintenant je me trouve devant le problème suivant : je veux commander l’amplificateur home cinéma, pour l’allumer et l’éteindre mon code actuel suffit. :
Allumer amplificateur salon
Mais dès lors que je veux par exemple :
sélectionner radio amplificateur
Je me retrouve devant le problème suivant : L’amplificateur doit se trouver dans la liste des éléments pour : Allumer amplificateur salon
Mais également dans la liste des emplacements pour
Sélectionner radio amplificateur
Je parcours les listes emplacement puis élément puis action, je songe à comparer les occurrences emplacement et element en ignorant l’occurrence element si un emplacement à été déjà trouvé.
Ainsi pour Sélectionner radio amplificateur
En parcourant la liste des emplacements je trouve une occurrence amplificateur index = empX j’arrête le parcours de la liste
Ensuite je parcours la liste des elements je trouve la aussi amplificateur elmX. Je compare les chaines emplacements[empX] et elements[elmX] ils sont identiques aussi j’ignore cette occurrence pour elements et je passe au suivant et là je trouve radio à l’index elmY. j’arrête le parcours de la liste elements
Enfin je parcourt la liste des actions et je trouve l’action sélectionner. j’arrête le parcours de la liste
Bon dans ce cas je peux différencier un même objet selon qu’on désigne son emplacement ou qu’on lui demande d’accomplir l’action
Maintenant imaginons que j’ai deux amplificateurs comment puis-je différencier les amplificateur ?
En stockant la chaine au moment du traitement de la commande sélectionner radio amplificateur la méthode gérant les commandes doit savoir que deux amplificateurs existe et quels sont leur emplacement. Ensuite on peut chercher l’emplacement dans la chaine que l’on a gardé ...Cela doit pouvoir se faire
Maintenant je veux gérer le volume de ces deux amplificateurs compte tenu des instructions de la méthode j’arrive a déterminer quel amplificateur ; mais je n’ai pas donné de valeurs.J’ai seulement dit :
augmenter volume amplificateur du salon
La je peux soit poser programmer un echange question,reponse ou uiliser un increment de volume par defaut. De meme pour sélectionner radio, je voudrais que le programme me demande quel station ou en chosisissent uen par defaut
Je voudrais me rapprocher du modele objet :Objet.methode (paramete) objet . propriete
Bon en fait je l’avoue c’est un sujet qui éprouve sérieusement mes compétences, je me perds en conjoncture et je sens qu’il faut me poser pour ne pas coder, recoder et surcoder. Aussi j’en appel à l’aide des bonnes volontés pour quelques conseils judicieux.
Je vous remercie de votre sollicitude
PS : l’ensemeble du code de mon application est disponible ici :
La classe qui nous intéresse est ici
et ce sont les méthodes : public void Request(ArrayList<String> data) et private String InterpreterCommande()
Partager