On envisage de développer, grâce au logiciel SpeechMania,
un système de dialogue oral, permettant aux personnes abonnées d'accéder à différents services comme la gestion d'un agenda,
la gestion d'un répertoire, ...
Ainsi, un abonné pourra contacter le serveur par téléphone et dialoguer avec le système pour que la tâche envisagée.
La prise de contact avec le langage HDDL c'est révélé assez facile. C'est une structure proche de YACC.
Vous pouvez consulter les sources du programme principal : agenda.hdl.
Nous allons détailler les différentes parties, à partir d'exemples issus de ces sources :
<no> BOOLEAN : 'non' { TRUE; } | 'non' 'merci' { TRUE; } ;
Ici, le concept "no", dont le type de variable est booléen, sera vérifié si le système peut trouvé le mot "non", ou "non" suivit de "merci". C'est une grammaire classique, le séparateur vertical "|" exprimant le "ou" entre les différentes expressions permettant de valider le concept.
<centaine> INTEGER nb : 'cent' {nb:= 100;} // 100 | 'cent' <un_cent> {nb := 100 + #2.nb; } // 101-199 | <chiffre> 'cents' {nb := #1.nb * 100; } //200-300...900 | <chiffre> 'cent' <un_cent> {nb := (#1.nb * 100) + #3.nb; } //201-999 ;
Ce deuxième exemple de grammaire illustre la possibilité d'inclure, plutôt que des mots précis, des sous grammaires,
comme ici les concepts <chiffre>
et <un_cent>
qui font appel à leurs grammaires respectives ;
ce principe pouvant se répéter sur plusieurs niveaux.
En expression régulière, le concept <centaine>
pourrait s'écrire sous la forme : (cent <un_cent>?)|(<chiffre> cent(s|<un_cent>))
.
Ce concept <centaine>
permet ainsi de décrire les nombres de 100 à 999 de manière concise.
Si on étudie la dernière ligne de la grammaire <chiffre> 'cent' <un_cent>
,
cela signifie n'importe quel nombre suivit du mot "cent", suivit de n'importe quel nombre de 1 à 99, soit 201 à 999.
Voici d'ailleurs la grammaire du concept <chiffre>
.
<chiffre> INTEGER nb, DATE date : 'deux' { nb := 2; date := $,,2,,;} | 'trois' { nb := 3; date := $,,3,,;} | 'quatre' { nb := 4; date := $,,4,,;} | 'cinq' { nb := 5; date := $,,5,,;} | 'six' { nb := 6; date := $,,6,,;} | 'sept' { nb := 7; date := $,,7,,;} | 'huit' { nb := 8; date := $,,8,,;} | 'neuf' { nb := 9; date := $,,9,,;} ;
Voilà enfin sous forme d'automate le concept <un_cent>
.
Les différentes variables utilisées dans le programme sont renseignées au cours de la reconnaissance. Les différentes parties d'une grammaire (mots ou sous-grammaires) peuvent être utilisés comme valeurs.
<centaine> INTEGER nb : 'cent' {nb:= 100;} //100 | 'cent' <un_cent> {nb := 100 + #2.nb; } //101-199 | <chiffre> 'cents' {nb := #1.nb * 100; } //200-300...900 | <chiffre> 'cent' <un_cent> {nb := (#1.nb * 100) + #3.nb; } //201-999 ;
Dans cet exemple, sur la ligne 1, le mot "cent" est reconnu, la valeur numérique 100 est alors affectée "en dur" en retour.
Sur la ligne 2, il s'agit de reconnaître les nombres entre 101 et 199,
ils commencent tous par le mot "cent" puis un autre nombre compris entre 1 et 99 pour lequel une sous-grammaire <un_cent>
est utilisée.
Il faudra donc affecter comme valeur de retour 100 plus la valeur de retour de la sous-grammaire <un_cent>
,
valeur auxquelles on accède par #2.nb
où #2 indique que l'on opère sur le deuxième élément de la ligne de grammaire
(le premier étant "cent") et .nb
pour indiquer le format de données (certaines grammaires peuvent retourner plusieurs types de données).
Certaines variables utilisent des structures de données plus complexes que les types primitifs.
STRUCT Type_heure { INTEGER heure; INTEGER minute; }
Voilà notre code permettant de déclarer la structure de données Type_heure
permettant de stocker une heure.
<horaire> Type_heure heureminutes : <unite> 'heure' <un_cent> {heureminutes := STRUCT Type_heure (#1.nb, #3.nb); } | <un_cent> 'heures' <un_cent> {heureminutes := STRUCT Type_heure (#1.nb, #3.nb); } | <unite> 'heure' {heureminutes := STRUCT Type_heure (#1.nb, 0); } | <un_cent> 'heures' {heureminutes := STRUCT Type_heure (#1.nb, 0); } ;
Et ci-dessus le concept permettant de renseigner le type de données Type_heure
,
avec utilisation de #n.xx
et de sous-grammaires.
Avec la structure de programme
COND (UNDEFINED(XXX)) { ... } COND (VERIFIABLE(XXX)) { ... }
utilisée tout au long du programme, une question est posée pour chaque variable à renseigner (UNDEFINED
).
Lors d'une réponse valide de l'utilisateur, ladite variable passe alors dans l'état NOT_VERIFIED
.
Le bloc de code VERIFIABLE
peut alors être appelé, au cours duquel une question est posée à l'utilisateur pour
vérifier la valeur attribuée précédemment à la variable.
Cette stratégie est clairement de type "confirmation explicite" :
une question est posée, on a la réponse, puis le système demande si oui ou non la variable a la bonne valeur.
ex :
- ...
- de quelle gare partez vous ?
- je pars de Marseille
- vous souhaitez partir de Marseille ?
- oui
- ...
Si les blocs de code VERIFIABLE(XXX)
étaient omis, cela permettrait de faire de la "confirmation implicite".
Nous avons ajouté différentes fonctionnalités au code qui nous avait été fourni, comme :
Type_heure
avec la structure de donnée associéetype_action
pour choisir l'action à effectuer et nom_personne
pour l'accès par nom,
avec les sous-dialogues associés.Sur le schéma, en rouge les modifications apportés à la version originale.
Voici un exemple d'exécution de notre programme ainsi modifié. La trace complète est consultable ici.
enter command (c start) : c start received system prompt : Bienvenue sur le serveur de gestion des agendas received system prompt : Quel est votre numero d'abonne ? enter sentence: . douze received system prompt : Voulez-vous acceder a l'agenda de l'abonne numero|douze enter sentence: . oui su best path: oui received system prompt : Que souhaitez vous faire ? (personnes,consulter,ajouter,supprimer,modifier) enter sentence: . personnes su best path: personnes received system prompt : Souhaitez-vous faire l'action|personnes enter sentence: . oui su best path: oui received system prompt : A quelle personne voulez-vous accéder ? enter sentence: . alexandre su best path: alexandre received system prompt : Vous souhaitez voir tous vos rendez-vous avec alexandre|alexandre enter sentence: . oui su best path: oui received system prompt : Veuillez patienter, je recherche votre information received system prompt : Voici vos rendez-vous avec alexandre received system prompt : Nous vous remercions pour votre appel. Au revoir enter command (c start) : c stop
Voici un autre exemple d'exécution. La trace complète est consultable ici.
enter command (c start) : c start received system prompt : Bienvenue sur le serveur de gestion des agendas received system prompt : Quel est votre numero d'abonne? enter sentence: . dix su best path: dix received system prompt : Voulez-vous acceder a l'agenda de l'abonne numero|dix enter sentence: . oui su best path: oui received system prompt : Que souhaitez vous faire ? (personnes,consulter,ajouter,supprimer,modifier) enter sentence: . consulter su best path: consulter received system prompt : Souhaitez-vous faire l'action|consulter enter sentence: . oui su best path: oui received system prompt : Quel jour souhaitez-vous consulter enter sentence: . apres midi su best path: apres midi received system prompt : Vous souhaitez des informations concernant vos rendez-vous prevus|l' apres-midi enter sentence: . oui su best path: oui received system prompt : Quel jour souhaitez-vous consulter enter sentence: . demain su best path: demain received system prompt : Souhaitez-vous acceder l'agenda pour la date du|jeudi|vingt-sept|fevrier|2003 enter sentence: . oui su best path: oui received system prompt : Veuillez patienter, je recherche votre information received system prompt : Voici vos rendez-vous.................. received system prompt : Nous vous remercions pour votre appel. Au revoir enter command (c start) : c stop
Lors de l'utilisation de ce programme, la lourdeur de la confirmation explicite systématique est frappante. On pourrait mettre en place un peu de confirmation implicite, lorsque cela est aisé, comme dans cet exemple :
received system prompt : Que souhaitez vous faire ? (personnes,consulter,ajouter,supprimer,modifier) enter sentence: . consulter su best path: consulter received system prompt : Quel jour souhaitez-vous consulter enter sentence: . apres midi
Enfin, les possibilités d'accès à l'agenda pourraient être largement améliorées, mais il s'agissait ici d'un simple exemple d'utilisation de HDDL.
Ce BE nous a permis de prendre contact avec un langage (HDDL) permettant de traiter assez facilement l'interaction homme-machine.