... {this.$value="SpRaChDiaLoGsYsTeME HoMeP@gE"}; ...

Grammatiken (Speech Recognition Grammars)

Einer der wichtigsten Bausteine einer VoiceXML-Anwendung sind Grammatiken.

In Grammatiken werden die Benutzeräusserungen (oder DTMF-Töne) spezifiziert, die zu einem bestimmten Zeitpunkt von dem Spracherkenner eines VoiceXML-Systems erkannt werden müssen. Das VoiceXML-System kann nämlich nur dann etwas mit der sprachlichen Eingabe anfangen, wenn diese zu einem bestimmten Zeitpunkt eine der aktiven Grammatiken "matcht".
Besonders im Zusammanhang mit gemischter Initiative ist es wichtig, dass der Voice Browser Unterstützung bietet, wenn mehrere Eingabefelder und mehrere Grammatiken zum gleichen Zeitpunkt aktiv sein müssen.

Es gibt unterschiedliche Typen von Grammatiken:
  • inline grammars:
    werden gleich im grammar-Tag in einem VoiceXML-File definiert.
  • built-in grammars:
    können, müssen aber nicht redefiniert werden, da bereits implementiert und ausgiebig getestet (IBM: digits, boolean etc.)
  • external grammars:
    werden in einem externen File in z.B. Java Speech Grammar Format spezifiziert.
Es gibt unterschiedliche Grammatikformate:
  • JSGF
  • SGL
  • ABNF
  • XML
  • ...
Einer der grossen Nachteile von VoiceXML1.0 als Standart ist, dass es keinen Standart bezüglich des Formats der benutzten Grammatiken gibt. Voice Server von IBM akzeptiert zum Beispiel nur Java Speech Format Grammars (JSGF), Voice Web Server von Nuance dagegen will Nuance SGL (Grammar Spacification Language) als Grammatik haben. Für den Programmierer bedeutet es im Endeffekt, dass die Grammatiken immer neu geschrieben werden müssen, damit die Anwendung mit einem bestimmten Voice Server läuft.

In Verbindung mit VoiceXML2.0 wurde zur Verbesserung der Lage von W3C Grammar Specification (SRGS) eingeführt. Von VoiceXML2.0 werden 2 textuelle Grammatikformate unterstützt: ABNF (Arugmented Bacus-Naur Form) und XML (eXtensible Markup Language).

XML-Grammatiken bestehen aus ASCII-Zeichen, die in XML-Tags eingeschlossen sind. ABNF Grammatiken benutzen dagegen Sonderzeichen (special characters), um in einem ASCII-String definierten grammatischen Ausdrücke zu spezifizieren.

Welcher von diesen Formaten vom Programmierer benutzt wird, ist eigentlich Geschmacksache - das Ergebnis kommt im Grossen und Ganzen auf das Gleiche hinaus. ABNF-Notation wird bestimmt denjenigen näher liegen, die bereits Erfahrungen mit JSGF oder GSL gemacht haben. XML-Format erschwert die Lesbarkeit von ABNF, was besonders den Anfängern Angst und Schrecken einjagt ;-)

Ab der VoiceXML2.0-Spezifikation wird XML-Grammatikformat gefordert, was bedeutet, dass man sich an diesen Format halten sollte, wenn einem die Portabilität seines Systems am Herzen liegt.

Aber man sollte sich von der Unlesbarkeit der XML nicht abschrecken lassen - so schwer ist die Syntax gar nicht, vor allem wenn man drei folgende Regeln im Kopf behält:
  1. Du musst deine Elemente immer schliessen:
  2. <user>User1<user/>

  3. Schachtele deine Elemente immer hierarhisch:
  4. <userList>
      <user>User1<user/>
      <user>User2<user/>
    <userList/>

  5. Du musst deine Attribute immer in Anführungszeichen setzen:
  6. <user name = "Name" vname = "Vorname"/>

JSGF, ABNF, XML-Notationen in Vergleich

Hier werden Grundtermini der Grammatikgestaltung eingeführt und auf Beispielen der 3 gängigen Grammatikformate erläutert.

File Extensions

JSGF Grammatiken sind Dateien mit der Extension *.jsgf, die empfohlenen Extensions für ABNF's und XML's heissen jeweils *.gram und *.grxml.

Header

Sobald so eine Datei angelegt worden ist, müssen zuerst die Header geschrieben werden, denn aus diesen der Voice Browser schliessen kann, welche Grammatik er zur Verfügung hat und wie diese zu behandeln ist.

Header sollten nun folgende Informationen enthalten:

Grammatiktyp (jsgf, abnf oder xml), bestehend aus der Bezeichnung der Grammatik und der Grammatikversion (aktuell: 1.0) und Encoding (optional), welches für die gegebene Sprache benutzt wird.

JSGF
#JSGF V1.0;

ABNF
# ABNF 1.0 ISO-8859-1;

XML
<?xml version="1.0" encoding="ISO-8859-1"?>

Vermerk , für welche Sprache die Grammatik erstell ist (Bei ABNF und XML im Voice-Modus):
JSGF
#JSGF V1.0;

ABNF
# ABNF 1.0 ISO-8859-1;
language en;

XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<grammar version="1.0" xmlns="http://www.w3.org/2001/06/grammar"
xml:lang="en" mode="voice" root="rootRule">

Modus : entweder voice (default) oder dtmf (nur Telefontasten werden erlaubt), gemischter Modus wird nicht erlaubt, d.h. wenn beide Modi benötigt werden, sind auch 2 separate Grammatiken für jeden Modus zu spezifizieren. Bei einer JSGF-Grammatik sollte an dieser Stelle der Name der Grammatik spezifiziert werden:

JSGF
#JSGF V1.0;
grammar teachers;

ABNF
# ABNF 1.0 ISO-8859-1;
language en;
mode voice;

XML
<?xml version="1.0" encoding="ISO-8859-1"?:gt;
<grammar version="1.0" xmlns="http://www.w3.org/2001/06/grammar"
xml:lang="en" mode="dtmf" root="rootRule">

In dem Fall, wenn bei der ABNF oder XML - Grammatik mehrere Regeln in einem File zusammenleben, muss unbedingt die Hauptgrammatik spezifiziert werden, welche ausgeführt wird, wenn der Grammatikfile aufgerufen wird. Bei JSGF-Grammatik werden alle Regeln eines Grammatikfiles aktiv, die als <public> gekennzeichnet werden.

JSGF
#JSGF V1.0;
grammar teachers;

ABNF
# ABNF 1.0 ISO-8859-1;
language en;
mode voice;
root $rootRule;

XML
<?xml version="1.0" encoding="ISO-8859-1"?:gt;
<grammar version="1.0"
xmlns="http://www.w3.org/2001/06/grammar"
xml:lang="en" mode="dtmf" root="rootRule">

Regeln

Wie bereits aus JSGF bekannt, können Grammatik-Dateien mehrere Regeln enthalten. Diese legen fest, welche Sprachausdrücke zu dem aktuellen Zeitpunkt als grammatisch zu betrachten sind (und folglich zur Anwendung gehören). Jede Regel hat ihren eindeutigen Namen und Gültigkeitsbereich (public oder private):

JSGF
#JSGF V1.0;
grammar teachers;
public <name> = Kluge;

ABNF
# ABNF 1.0 ISO-8859-1;
language en;
mode voice;
root $rootRule;
public $name = Kluge;

XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<grammar version="1.0" xmlns="http://www.w3.org/2001/06/grammar" xml:lang="en" mode="dtmf" root="rootRule">
< rule id="name" scope="private" >Kluge </rule>
</grammar>
</xml>




JSGF, ABNF, n best lists, inline, external, built-in, Regeln, Syntax, code samples