TUTORIELS 
La grammaire de VoiceXML

Page 1 | 2

Présentation de la spécification du W3C pour la reconnaissance vocale, qui permet de définir des grammaires pour le VoiceXML.
 (28 octobre 2002 )
 

Introduction
La grammaire VoiceXML regroupe l'ensemble des mots, phrases et signaux DMTF qui sont reconnus par une application VoiceXML 2.0. Ceux-ci sont définis par la SRGS (Speech Recognition Grammar Specification) introduite par la W3C en conjonction avec la spécification VoiceXML 2.0 -- car il n'existait aucun standard de reconnaissance vocale dans le spécification 1.0. Le DTMF est rendu nécessaire par la possibilité d'une mauvaise réception téléphonique, ou d'un problème de prononciation.
Cette grammaire permet donc de spécifier ce que comprend l'application. Dès qu'il s'agit de générer une réponse, c'est le SSML (Speech Synthesis Markup Language) qui entre en jeu.
En pratique, les régles de grammaires créées par les développeurs permettent de définir les mots que les utilisateurs pourraient donner en réponse, avec leurs variations. Par exemple, une réponse pourrait être "oui", "ouais", "bien sûr", "d'accord", ou bien "demain", "le vingt-six octobre", "vingt-six dix zéro deux"...

Il existe deux formes de syntaxe possibles pour la grammaire VoiceXML: la syntaxe ABNF (Augmented Backus-Naur Form) et la syntaxe XML.
La syntaxe ABNF est une représentation en texte seul (non-XML) prochain de la grammaire BNF déjà utilisée dans de nombreux formats (par exemple, le protocol HTTP est spécifié au format ABNF). La syntaxe XML passe par les éléments XML pour représenter ses constructions grammaticales.
Chaque syntaxe a ses avantages et ses inconvénients: XML offre plus de portabilité, mais est beaucoup plus complexe, et donc plus compliqué à lire qu'ABNF. Ceux qui auront déjà utilisé les formats GSL (Grammar Specification Language) ou JSGF (Java Speech Grammar Format) seront plus à l'aise avec ABNF, mais l'utilisation de la DTD dans un éditeur XML permet de simplifier la tâche...
C'est pourquoi tous les exemples suivants utiliseront les deux syntaxes.

Une grammaire est appellée depuis un fichier VoiceXML à l'aide de la balsie <grammar>:

<grammar xmlns="http://www.w3.org/2001/06/grammar"/>

...pour une grammaire en ligne, ou dans le cas d'une grammaire externe:

<grammar src="Employees.grxml" type="application/srgs+xml"/>

Entêtes
Comme en XML, sans le bon entête, l'interpreteur VoiceXML ne reconnaîtra pas la grammaire correctement.

(fichier grammaire.gram)
# ABNF 1.0 ISO-8859-1;
language fr;
mode voice;
root $racine;


(fichier grammaire.grxml)
<?xml version="1.0" encoding="ISO-8859-1"?>
<grammar mode="voice" version="1.0" xml:lang="fr" root="racine"
xmlns="http://www.w3.org/2001/06/grammar" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/06/grammar http://www.w3.org/TR/speech-grammar/grammar.xsd">

mode permet de spécifier si les entrées sont vocales (voice, par défaut) ou par touches (dmtf). Deux modes ne peuvent coexister dans une même grammaire: si la grammaire est en mode DMTF, alors les entrées vocales ne seront pas acceptées, et inversement. Pour qu'une application puisse accepter à la fois la voix et les entrées DMTF, deux grammaires différentes doivent être définies.
root permet, lorsqu'un fichier contient plusieurs sous-grammaires, de préciser à l'interpréteur quelle est la grammaire principale.

Quelques mots-clés
Rule: une règle de grammaire, sorte de variable. Elle peut être déclarée private ou public selon qu'elle soit accessible uniquement depuis son fichier, ou depuis son fichier et un fichier exterieur.

ABNF:
$prenom = Martin;
public $prenom = Martin;

XML:
<rule id="prenom">Martin</rule>
<rule id="prenom" scope="private">Martin</rule>

Ruleref: Une référence (Rule Reference) à règle/variable (Rule) pointée par un URI, pouvant être locale (auquel cas l'URI est de la forme #nom) ou externe dans le cas où celle-ci est déclarée public (l'URI pouvant alors être relatif ou absolu). L'élément XML <ruleref> ne contient pas de texte ni d'autre élément.

ABNF
public $paris
$<../villes.gram#paris>
$<http://www.monde.com/europe/france/villes.gram#paris>
$nomComplet = $prenom $nom

XML
<ruleref uri="#paris" scope="public"/>
<ruleref uri="../villes.grxml#paris"/>
<ruleref uri="http://www.monde.com/europe/france/villes.grxml#paris"/>
<rule id="nomComplet">
  <ruleref uri="#prenom"/>
  <ruleref uri="#nom"/>
</rule>

Cela permet de faciliter l'encapsulation afin de créer des phrases complètes:

ABNF
$villeArrivee se trouve à $distKm kilomètres de $villeDepart

XML
<ruleref uri="#villeArrivee"/> se trouve à <ruleref uri="#distKm"/> kilomètres de $villeDepart


Le langage d'une grammaire peut par ailleurs être précisé lorsqu'on l'appelle:

ABNF
$<http://www.le-site.com/villes.gram#argentine>!fr
$yes = yes | oui!fr;

XML
<ruleref uri="http://www.le-site.com/villes.gram#argentine" xml:lang="fr"/>
<rule id="yes">
  <one-of>
    <item>yes</item>
    <item xml:lang="fr">oui</item>
  </one-of>
</rule>


Page 1| 2

 
[ Xavier Borderie,JDNet
 
Accueil | Haut de page