Alexandre Alapetite & Pierre Cohade   21/03/2003
Enseignant : Isabelle Ferrané

BE d'interface homme-machine "SpeechMania"

Sommaire

Quitter

Introduction

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.

Sommaire

Prise de contact

La prise de contact avec le langage HDDL c'est révélé assez facile. C'est une structure proche de YACC.

Sommaire

Programmation

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 :

Sommaire

Les concepts

<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>.

automate du concept <un_cent>
Sommaire

Structure de données

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.

Sommaire

Stratégie de confirmation

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".

Sommaire

Nouvelle version

Nous avons ajouté différentes fonctionnalités au code qui nous avait été fourni, comme :

Sur le schéma, en rouge les modifications apportés à la version originale.

graphes des transitions
Sommaire

Exécutions

Requête de consultation par personne

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
Sommaire

Requête de consultation d'une plage horaire

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
Sommaire

Idées et alternatives

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.

Conclusion

Ce BE nous a permis de prendre contact avec un langage (HDDL) permettant de traiter assez facilement l'interaction homme-machine.

Sommaire
https://alexandre.alapetite.fr

Quitter