Tutorial: VoiceXML Grammatiken
Inhalt
Dieses Tutorial gibt eine detaillierte Einführung in die Grammatiken, die in VoiceXML verwendet werden.
Im Folgenden werden folgende Punkte adressiert:
1 Allgemeines zu VoiceXML Grammatiken
2 Arten von VoiceXML Grammatiken (Grammars)
2.1 Implizite Grammar
2.2 In-line Grammar
2.3 Built-In Grammar
2.4 Externe Grammar
2.5 Kombinationen von Grammars
3 Grammatiken der Spracherkenner (ASR Grammar)
3.1 Nuance GSL
3.2 W3C SRGS
3.3 Nuance SRGS für OpenSpeech Recognizer
3.4 ABNF
4 DTMF Grammatiken
4.1 Übersicht
4.2 SRGS
5 Grammarspezifische Einstellungen in VoiceXML
5.1 Bargein
5.2 Confidence level
6 Natürliche Spracherkennung - Tags & Slots
7 Weitere Informationen und Links
1 Allgemeines zu VoiceXML Grammatiken
Grammatiken beschreiben die möglichen Eingaben, die ein VoiceXML Browser zu einem definierten Zeitpunkt akzeptiert.
Wenn der Anrufer eine Sequenz von DTMF- Tasten eingibt, oder eine bestimmte Phrase ins Telefon spricht, vergleicht der VoiceXML Browser,
diese Sequenz / Phrase mit einer der gegenwärtig aktiven Grammatiken.
Im Erfolgsfall wird der Browser die mit der Eingabe verbundene Aktion ausführen, d.h. er wird die dem <field> Tag zugehörige <filled> Sektion ausführen. Sollte der Anrufer nichts sagen, oder etwas, das der Voice
Browser nicht in der Grammatik findet, so wird ein <noinput> bzw.
<nomatch> Event ausgelöst, auf das an anderer Stelle in der Applikation reagiert werden kann. Dabei stellt der
VoiceXML Browser Standardreaktionen zur Verfügung, die man nach Belieben verändern kann.
Das Design von Sprachgrammatiken ist eine anspruchsvolle Aufgabe. Die möglichen Äußerungen eines Anrufers müssen mit Bedacht ausgewählt werden, damit
man genau die Informationen zu erhält, die man in der laufenden Anwendung gerade benötigt. VoiceXML Grammatiken besitzen bestimmte Charakteristiken,
die es zu beachten gilt:
- Grammatiken sind historisch bedingt an den Spracherkenner gebunden.
- Grammatiken besitzen eine spezifische Syntax.
- Grammatik-Design ist Teil einer guten Dialogentwicklung. Der Entwickler muss die möglichen Äußerungen
im Dialogzusammenhang erkennen und verstehen können.
- Grammatiken haben unterschiedliche Gültigkeitsbereiche.
- Es können gleichzeitig mehrere Grammatiken aktiv sein.
- Grammatiken können auf unterschiedliche Art und Weise referenziert werden.
Grammatiken sind typischerweise an den Lieferanten der Spracherkennungssoftware (ASR Engine) gebunden. Dies ist seitens der VoiceXML
Spezifikation nicht geplant, jedoch im heutigen Spracherkennungsmarkt Fakt. Das W3C ist innerhalb der Version 2.0 der VoiceXML Spezifikation mit
der Definition eine plattformunabhängigen XML Grammatik, der Speech Recognition Grammar Specification (SRGS) diesem Umstand entgegengetreten, und mehr und mehr Spracherkenner folgen mittlerweile diesem Standard.
Die Hauptunterschied zwischen der standardisierten und der ASR-spezifischen Grammatik sind z.B.
- Unabhängige Grammatiken sind portierbar.
- Ein einziger Standard ist leichter erlernbar als mehrere spezifische Sprachen.
- Unabhängige Grammatiken sind weniger reich an Funktionen.
- Es gibt kein einheitliches Format für die Kompilierung (Grammatiken werden vor der Verwendung im Spracherkenner in
maschinennahe Befehle kompiliert).
- Es existieren bereits vielfältige spezifische Grammatiken oder Tools zum Erstellen und Pflegen spezifischer Grammatiken.
Viele VoiceXML Gateways unterstützen neben den im W3C definierten unabhängigen Formaten eine oder mehrere spezifische ASR Formate.
Aus technischer Sicht steht der Benutzung von mehreren Spracherkennern nichts entgegen, lizenzrechtlich gesehen sollte man sich für
einen Hersteller entscheiden, denn ASR Lizenzen sind neben der TTS der mit Abstand teuerste Teil einer VoiceXML Plattform.
Spezifische Spracherkenner sind u.a.
- Nuance OpenSpeech Recognizer (vormals Scansoft bzw. SpeechWorks)
- Nuance 8.x
- IBM
- Telisma
- Microsoft
Scansoft hat in den letzten Jahren nahezu alle grossen ASR-Lieferanten aufgekauft (Philips, SpeechWorks, Nuance) Sie sind nunmehr mit Abstand die Nummer eins am Markt.
Scansoft nennt jedoch -wegen des grossen amerikanischen Marktes- seinen Spracherkenner "Nuance ASR", und dabei gibt es zwei Versionen:
- Nuance 8.x (Name beibehalten)
- Nuance OSR (vormals Scansoft OSR bzw. SpeechWorks OSR)
Es bleibt abzuwarten, wie sich Nuance bei den zukünftigen Version ihrer Spracherkenner positioniert.
2 Arten von VoiceXML Grammatiken (Grammars)
Grammatiken beschreiben mögliche DTMF- und Spracheingaben. Jede Grammatik kann auf unterschiedliche Art und Weise genutzt werden. Man
unterscheidet dabei:
- Implizit
- In-line
- Built-in
- Extern
2.1 Implizite Grammar
Implizite Grammatiken werden für <menu>, <choice> oder
<option> Tags automatisch generiert.
Auch werden bei globalen Kommandos wie "help", "cancel", und "exit" implizit Grammatiken benutzt.
Implizite Grammatiken werden als spezifische Grammatiken des jeweiligen Spracherkenners erstellt..
Im folgenden Beispiel scheint auf den ersten Blick keine Grammatik definiert, weil nirgendwo ein <grammar> Tag
zu finden ist.
Durch das <choice> Tag generiert der VoiceXML Browser jedoch implizit eine Grammatik, die die definierten
Worte (hier: 'Apfel', 'Birne', 'Kirsche') sowie die DTMF Tasten 1, 2 oder 3 erkennen kann.
<?xml version="1.0"?>
<vxml version="2.0">
<menu dtmf="true">
<prompt> Bitte sagen Sie Apfel, Birne oder Kirsche. </prompt>
<choice next="#apfel"> Apfel </choice>
<choice next="#birne"> Birne </choice>
<choice next="#kirsche"> Kirsche </choice>
</menu>
<form id="apfel">
<block>
Sie haben Apfel gewählt.
<exit/>
</block>
</form>
<form id="birne">
<block>
Sie haben Birne gewählt.
<exit/>
</block>
</form>
<form id="kirsche">
<block>
Sie haben Kirsche gewählt.
<exit/>
</block>
</form>
</vxml>
2.2 In-line Grammar
In-line Grammatiken werden in VoiceXML zwischen <grammar> oder <dtmf> Tags
spezifiziert, und ermöglichen einen grundsätzlichen Zugriff auf die Möglichkeiten des installierten Spracherkenners.
VoiceXML Gateways benutzen grundsätzlich eine ASR Engine als Default- Spracherkenner. Bei der Verwendung anderer Spracherkenner muss die
dem VoiceXML Browser im <grammar> Tag mitgeteilt werden, z.B. über
<grammar type="format"> bzw. <dtmf type="format">
In-line Grammar (VoiceXML Default Format)
Beispiel:
Die farblich unterschiedlich markierten <grammar> Bereiche zeigen verschiedene Grammarformate
für ein und dieselben möglichen Antworten:
- John
- John Smith
- Mary
- Mary Jones
<?xml version="1.0"?>
<vxml version="2.0">
<form>
<field name="anruf">
<prompt> Wen möchten Sie anrufen ? </prompt>
<!-- ABNF -->
<grammar> john | john smith | mary | mary jones </grammar>
<!-- Nuance GSL -->
<grammar> john [smith] | mary [jones] </grammar>
<!-- XML -->
<grammar xml:lang="en-US" version="1.0" root="ROOT">
<rule id="ROOT" scope="public">
<one-of>
<item> john </item>
<item> john smith </item>
<item> mary </item>
<item> mary jones </item>
</one-of>
</rule>
</rule>
<filled>
Rufe <value expr="anruf"/> an...
</filled>
</field>
</form>
</vxml>
In-line Grammar (ASR spezifisches Format)
Eine andere Möglichkeit zur Definition von Inline Grammatiken ist die Beschreibung in der jeweiligen ASR spezifischen Sprache.
Da nur der Spracherkenner und nicht der VoiceXML Browser diese Beschreibungsprache interpretieren kann, muss dieser Bereich in
VoiceXML mittels CDATA vor dem Browser "versteckt" (auskommentiert) werden; der VoiceXML Browser reicht diese Information ungeprüft an die ASR Engine weiter.
Man kann auch auf den CDATA Block verzichten, muß dann jedoch zahlreiche Zeichen "escapen" (z.B. muss '<' als '<' geschrieben werden).
Beispiel (Nuance Format):
<?xml version="1.0"?>
<vxml version="2.0">
<form>
<field name="anruf">
<prompt> Wen möchten Sie anrufen ? </prompt>
<grammar type="application/gsl">
<![CDATA[
Name [ ( john ?smith ) ( mary ?jones ) ]
]]>
</grammar>
<filled>
Rufe <value expr="anruf"/> an...
</filled>
</field>
</form>
</vxml>
In-line DTMF-Format
Beispiel (XML Format):
<?xml version="1.0"?>
<vxml version="2.0">
<form>
<field name="anruf">
<prompt>
Drücken Sie 1 um John Smith anzurufen,
Drücken Sie 2 um Mary Jones anzurufen.
</prompt>
<dtmf type="application/grammar-xml" version="1.0" root="ROOT"
<rule id="ROOT" scope="public">
<one-of>
<item> 1 </item>
<item> 2 </item>
</one-of>
</rule>
</dtmf>
<filled>
Rufe <value expr="anruf"/> an...
</filled>
</field>
</form>
</vxml>
2.3 Built-in Grammar
Built-in Grammatiken sind vordefinierte Grammatiken für häufig verwendete Eingaben.
Sie decken Datum, Ziffern, Nummern, Telefonnummern, Zeiten oder Währungen ab und werden in VoiceXML wie folgt referenziert:
<grammar src="builtin:grammar/type"/>
oder
<dtmf src="builtin:grammar/type"/>
wobei type die Werte boolean, date, digits, currency, number, phone oder time enthalten darf.
Möchte man ASR und DTMF gemischt benutzen, verwendet man:
<field name="test" type="type">
Den unterschiedlichen Built-In Grammatiken kann man Parameter mitgeben.
Die Zifferngrammatik besitzt z.B. folgende erweiterte Syntax:
<field type="digits?parameter">
wobei parameter die Werte minlength=n, maxlength=n oder length=n annehmen kann.
Beispiel:
<?xml version="1.0"?>
<vxml version="2.0">
<form>
<field name="field1" type="digits?length=4">
<prompt> Bitte nennen Sie ihre vierstellige PIN. </prompt>
<filled>
<if cond="field1 == '1234'">
Zutritt gewährt.
<else/>
Zutritt verweigert.
</if>
</filled>
</form>
</vxml>
2.4 Externe Grammatiken
Externe Grammatiken werden in separaten Dateien definiert, und sie werden durch einem simplen <grammar>
Tag mittels src Attribut, referenziert. Diese Grammatiken werden mit Standard http Methoden vom Webserver geholt.
Zwei wichtige Dinge gilt es dabei zu beachten:
- Die Grammatik ist syntaktisch korrekt und entspricht der aktiven ASR Sprache auf dem VoiceXML Gateway
- Die Datei ist per http abrufbar
Wird ein Grammatiktyp verwendet, der von der Standardeinstellung der Plattform abweicht, muss dies im
Tag mit <grammar type="<format>">
oder <dtmf type="<format>"> mitgeteilt werden
Der Inhalt der Grammar ist im folgenden Beispiel nicht erkennbar, der Link verweist lediglich auf die verwendete Datei.
<?xml version="1.0"?>
<vxml version="2.0">
<form>
<field name="field1">
<prompt> Bitte sagen Sie Apfel, Birne oder Kirsche. </prompt>
<grammar src="http://www.irgendwo.de/grammar.txt"/>
<filled>
Sie sagten <value expr="field1"/>.
</filled>
</field>
</form>
</vxml>
Durch die Standard http Mechanismen können Grammatiken zur Laufzeit auch durch Applikationssprachen dynamisch erstellt werden.
Im folgenden Beispiel wird die Grammatik erst bei Bedarf für die UserID 1234 mit den für diese UserID gültigen Daten erstellt.
<?xml version="1.0"?>
<vxml version="2.0">
<form>
<field name="name">
<prompt> Wen möchten Sie anrufen ? </prompt>
<grammar src="Adressbuch_grammar.jsp?userID=1234"/>
<filled>
Ich rufe <value expr="name"/> an.
. . .
</filled>
</field>
</form>
</vxml>
Hinweis:
Laut W3C Spezifikation kann auch durch <grammar src="file_URI#RuleName"/> auf eine einzelne Beschreibung
(Rule) innerhalb einer Grammatik verwiesen werden. Dieses Feature ist jedoch Plattform- und ASR- abhängig und wird nicht durchgängig
unterstützt.
2.5 Kombinationen von Grammatiken
Kein Eingabefeld ist an einen bestimmten Grammatiktyp gebunden, es können mehrere, unterschiedliche Typen der soeben
beschriebenen (implizit, inline, builtin, extern) gleichzeitig verwendet werden. Dabei können auch Sprach - und
DTMF- Grammatiken beliebig gemischt werden.
<?xml version="1.0"?>
<vxml version="2.0">
<!-- Definition der impliziten Grammatik -->
<property name="universals" value="help"/>
<form>
<help>
Sie sagten Hilfe.
<reprompt/>
</help>
<field name="field1">
<!-- Definition der inline Grammatik -->
<grammar> hallo </grammar>
<!-- Definition der builtin Grammatik -->
<grammar src="builtin:grammar/boolean"/>
<!-- Definition der externen Grammatik -->
grammar src="extern.txt"/>
<prompt>
Sagen Sie Hilfe, hallo, ja, nein, oder extern.
</prompt>
<filled>
Sie sagten <value expr="field1"/>.
</filled>
</field>
</form>
</vxml>
Hinweis:
Verwendet man Sprach- und DTMF Grammar gleichzeitig, muss innerhalb der VoiceXML Propertydefinition
inputmodes auf "dtmf voice" gesetzt werden (normalerweise Standardwert).
3 Grammatiken der Spracherkenner (ASR Grammar)
In diesem Abschnitt werden die bekannten Grammarformate einleitend beschrieben.
- Nuance GSL
- Nuance OSR SRGS
- SRGS
- ABNF
3.1 Nuance GSL
Nachfolgend werden die Grundregeln zur Verwendung von Nuance GSL beschrieben.
Alle Regelbezeichnungen einer Nuance-Grammatik beginnen mit einem Großbuchstaben.
;GSL2.0
TopRuleName ( Top Rule Definitionen)
Subgrammer1Name (Definitionen )
Subgrammer2Name (Definitionen)
Die Definitionen selber dürfen keine Großbuchstaben enthalten, es sei denn sie verweisen auf Subgrammatiken.
Die grundsätzliche Syntax einer Nuance Grammar folgt dem Schema:
- ( ... ) für eine Phrase (Gruppierung)
- [ ... ] für alternative Phrasen (entweder oder)
- ? für optionale Phrasen
- * für 0 oder mehr Wiederholungen
- + für 1 oder mehr Wiederholungen
Beispiel:
;GSL2.0
Bestellung ( [Essen Trinken] ?bitte )
Essen ( eine *sehr scharfe pizza )
Trinken ( +kalte cola )
Bei der Verwendung dieser Grammatik ist alles erlaubt, was in den Subgrammatiken "Essen" und "Trinken" definiert wurde,
plus dem optionalen Wörtchen "bitte":
- eine scharfe pizza
- eine scharfe pizza bitte
- eine sehr scharfe pizza
- eine sehr scharfe pizza bitte
- eine sehr sehr scharfe pizza
- eine sehr sehr scharfe pizza bitte
- kalte cola
- kalte cola bitte
- kalte kalte cola
- kalte kalte cola bitte
Bei Verwendung externer Grammatiken wird das Ergebnis der <field> Variablen zugewiesen
...
<field name="field1">
<grammar src="order_grammar.txt"/>
<filled>
<if cond="field1 == '...'">
<goto next="#..."/>
<else/>
<goto next="#..."/>
</if>
</filled>
</field>
...
Verwendung von Slots in Nuance Grammatiken
Häufig ist es unmöglich, die Aussage des Anrufers als Rückgabewert weiter zu verwenden, da meistens mehrere Eingaben
möglich sind (10 verschiedene im o.g. Beispiel). Es wäre weitaus einfacher, wenn anstelle von 10 Ergebnissen nur "Pizza"
oder "Cola" zurückgeliefert würde, damit das Ergebnis leichter verarbeitet werden kann.
Darüber hinaus ist es manchmal sinnvoll, andere Werte als das Gesagte an die Applikation zurückzuliefern (z.B. numerisch),
weil man damit besser arbeiten kann.
In diesem Fall werden die möglichen Aussagen wie gehabt in der Grammatik definiert, als Rückgabewert (Slot) wird
jedoch ein anderer Wert festgelegt:
;GSL2.0
Monat [
januar {<monat "jan">}
februar {<monat "feb">}
maerz {<monat "mrz">}
]
<monat "jan"> sagt dem Spracherkenner, dass wenn er das Wort "januar" erkennt, er den Slot
"monat" mit dem Wert "jan" zurückliefern soll.
Verwendung von Subgrammatiken
Subgrammatiken können Zeichenketten oder Nummern an die aufrufende Grammatik zurückgeben, die dann wiederum als Teil des
Gesamtergebnisses an die VoiceXML Schicht weitergereicht werden.
Ein entscheidender Vorteil ist die Wiederverwendbarkeit. Einmal als Subgrammatik definiert und getestet, kann sie an jeder
beliebigen Stelle in der Grammatik referenziert und genutzt werden.
Um den Wert einer Subgrammatik an die VoiceXML Applikation zurück zu liefern, muss die Hauptgrammatik diese Subgrammatik
und dessen Rückgabewert referenzieren, und diesen Wert einem Slot zuweisen.
Das sieht dann wie folgt aus:
;GSL2.0
Datum ( Monat:mon ) {<monat $mon>}
Monat [
januar {return("jan")}
februar {return("feb")}
maerz {return("mrz")}
]
Beim Aufruf der Grammar "Datum" wird die Subgrammar "Monat" aufgerufen, und der Rückgabewert ("jan", "feb" oder "mrz")
wird in die Variable "mon" geschrieben.
Mit <month $mon> wird dann der Wert in den Slot Monat geschrieben, und dieser Slotwert wird an die VoiceXML
Applikation zurückgeliefert wird.
Slots in VoiceXML
Damit eine VoiceXML Applikation etwas mit den Slotwerten anstellen kann, muss man diese im VoiceXML explizit definieren.
Dies erreicht man durch die Angabe des Slotnamens im <field> Tag:
<field name="field1" slot="monat">
Multi-slot Grammatik
Die Definition einer Grammar ist nicht zwingend auf einen Slot beschränkt, es können problemlos mehrere Slots gleichzeitig
durch die Grammatik gefüllt und in VoiceXML weiterverarbeitet werden.
Weitere Informationen sind im Kapitel 6 zu finden.
Hier ein kurzes Beispiel:
;GSL2.0
BankGrammar
(
Amount:betr ueberweisen
) {<command "ueberweisen"> <amount $betr>}
Amount [
]
(einen euro) {return(1)}
(zwei euro) {return(2)}
(drei euro) {return(3)}
]
Folgende Äusserungen sind erlaubt:
- ein Euro überweisen -> Slots/ Werte: command= "ueberweisen"; amount=1
- zwei Euro überweisen -> Slots/ Werte: command= "ueberweisen"; amount=2
- drei Euro überweisen -> Slots/ Werte: command= "ueberweisen"; amount=3
Die VoiceXML Applikation sähe folgendermaßen aus:
<?xml version="1.0"?>
<vxml version="2.0">
<form>
<grammar src="bank_grammar.txt"/>
<block> Was möchten Sie tun ? </block>
Was möchten Sie tun ?
<block> Was möchten Sie tun ? </block>
<field name="field1" slot="command">
</field>
<field name="field2" slot="amount">
</field>
<filled mode="all" namelist="field1 field2">
<!-- Kommando weiterverarbeiten -->
</filled>
</form>
</vxml>
Sagt der Anrufer z.B. "zwei Euro überweisen", so wird <field1> der Wert 'überweisen', und
<field2> der Wert '2' zugewiesen. Das wird dadurch bewirkt, dass den
<field> Tags unterschiedliche Slot- Attribute zugewiesen wurden.
Durch die Attribute mode und namelist wird das <filled> Tag nur dann ausgeführt, wenn beide Elemente (genauer: die Elemente
<field1> und <field2>) mit Werten belegt wurden.
3.2 W3C SRGS
Die W3C Voice Browser Arbeitsgruppe definierte mit SRGS eine XML-basierte Grammatik, die unabhängig vom Spracherkennerlieferanten sein soll.
Details sind in der
Speech Recognition Grammar Specification (SRGS) zu finden.
Bei Inline Grammatiken im SRGS Format muss man jedoch besonderen Wert darauf
legen, dass sich VoiceXML und Grammar XML nicht in die Quere kommen, z.b. bei der Verwendung von '<' und '>'.
SRGS Grammar wird somit meist extern definiert und referenziert.
3.3 Nuance SRGS für OpenSpeech Recognizer
3.3.1 Allgemeines zu Nuance SRGS
Das Nuance SRGS Grammarformat wird vom Nuance OpenSpeech Recognizer (OSR) unterstützt und entspricht der W3C SRGS Grammatik Spezifikation.
Nachfolgend einige allgemeine Definitionen zum XML Grammarformat:
- Jede <grammar> ist eine Sequenz von <rule> Tags
- Die Top Level <rule> wird durch das root Attribut
im <grammar> Tag referenziert
- Das Attribut scope jeder <rule> legt fest, ob die Regel
für VoiceXML sichtbar ist (public oder private)
- Sublevel <rule> Referenzen erstellt man mit dem <ruleref> Tag
- Das <item> Tag wird verwendet, um Phrasen zu gruppieren
- Das <one-of> Tag wird für eine Auswahl möglicher Phrasen verwendet
Zu Beginn erst einmal ein Beispiel für eine SRGS Grammatik. Die Bestandteile werde ich anschliessend erläutern:
<grammar xml:lang="de-DE" version="1.0" root="Hauptregel" xmlns="http://www.w3.org/2001/06/grammar">
<rule id="Hauptregel" scope="public">
<item>
<ruleref uri="#essen"/>
</item>
<item repeat="0-1">bitte</count>
</rule>
<rule id="essen">
eine
<item repeat="0+">sehr</item>
scharfe pizza
</rule>
</grammar>
Bei Verwendung dieser Grammar sind folgende Aussagen möglich:
- eine scharfe Pizza
- eine scharfe Pizza bitte
- eine sehr scharfe Pizza
- eine sehr scharfe Pizza bitte
- eine sehr sehr scharfe Pizza
- eine sehr sehr scharfe Pizza bitte
- eine sehr ... scharfe Pizza
- eine sehr ... scharfe Pizza bitte
3.3.2 <grammar>
Alle Grammatiken müssen mit einem öffnenden <grammer> Tag beginnen, sowie einem
schliessenden </grammar> Tag beendet werden.
Grundsäzlich sieht der Container für eine XML-Grammatik somit wie folgt aus:
<grammar xml:lang="de-DE" version="1.0" root="{Top Level rule}" mode="{speech, dtmf}" xmlns="http://www.w3.org/2001/06/grammar">
...
</grammar>
Mit xml:lang wählt man die Sprache der Erkennung. Diese kann im Verlauf der Grammatik noch beinflusst werden.
Über root gibt man die regel an, die beim Laden der Grammatik aktiviert wird, wenn im VoiceXML-Aufruf keine Referenz
angegeben wurde.
mode zeigt auf, ob die Grammatik eine Sprach- oder DTMF-Grammatik ist.
Voice- und DTMF-Grammatiken können in SRGS NICHT in einer Datei gemischt werden. Möchte man ASR und DTMF gemeinsam verwenden,
so muss man zwei separate Dateien erstellen und parallel laden.
3.3.3 <rule>
Eine Grammatik kann aus einer oder mehreren Regeln (Rules) bestehen. Rules bilden die oberste Definitionsebene einer Grammatik und kapseln Grammatikcode.
Jede <rule> muss einen eindeutigen Namen erhalten. Gross- und Kleinschreibung wird dabei berücksichtigt.
Ebenso kann ein Gültigkeitsbereich (public, private) angegeben werden.
Eine <rule> mit dem Scope 'private' sind nur innerhalb der Grammatik referenzierbar.
3.3.4 <ruleref>
Werden Phrasen öfter benötigt, so kann man diese in eigene Rules auslagern und per <ruleref> referenzieren.
Liegen diese Regeln innerhalb der eigenen Grammatik, erfolgt die Refereinzierung über: <ruleref="#Rulename">.
Externe Regeln anderer Grammatiken werden mittels <ruleref="http://www.beispiel.de/beispiel.grxml{#Rulename}"> refernziert
Beispiel:
<grammar xml:lang="de-DE" version="1.0" root="Hauptregel" xmlns="http://www.w3.org/2001/06/grammar">
<rule id="Hauptregel" scope="public">
<item>
eine <ruleref uri="#essen"/>
</item>
<item repeat="0-1">bitte</count>
</rule>
<rule id="essen">
<item repeat="0+">sehr</item>
scharfe pizza
</rule>
</grammar>
3.3.5 <item>
Ein <item>-Element fast zusammengehörende Phrasen zusammen. Mit dem Attribut repeat können diese Phrasen auch optional gemacht werden. Im Zusammenspiel mit <one-of> kann einem
<item> eine Gewichtung hinzugefügt werden. Diese zeigt an, wie wahrscheinlich dieses item genutzt wird
(siehe auch <one-of>).
Beispiel:
<grammar xml:lang="de-DE" version="1.0" root="ROOT">
<rule id="ROOT" scope="public">
<item repeat="0-1"> ich möchte </item>
<item> beratung </item>
</rule>
</grammar>
3.3.6 <one-of>
Beispiel:
<grammar xml:lang="de-DE" version="1.0" root="ROOT">
<rule id="ROOT" scope="public">
<one-of>
<item weight="0.9"> ... </item>
<item weight="0.2"> ... </item>
<item weight="0.1"> ... </item>
</one-of>
</rule>
</grammar>
3.3.7 <tag>
Die XML Grammar erlaubt ebenso wie die Nuance GSL Grammar die Verwendung von einem oder mehreren
Slots zur Rückgabe spezifischer Erkennungsergebnisse:
<grammar xml:lang="de-DE" version="1.0" root="ROOT">
<rule id="ROOT" scope="public">
<one-of>
<item> januar <tag> month='jan'; </tag> </item>
<item> februar <tag> month='feb'; </tag> </item>
<item> märz <tag> month='mrz'; </tag> </item>
</one-of>
</rule>
</grammar>
Der ECMA-Script Code (z.B. month='jan';) innerhalb des Tags teilt dem Spracherkenner mit, dass er bei Erkennung von "Januar" den
Wert "jan" zurückgeben soll.
Es ist ebenso möglich, Ergebnisse von Subgrammatiken über die Hauptgrammatik an die VoiceXML Applikation zurückzugeben:
<grammar xml:lang="de-DE" version="1.0" root="ROOT">
<rule id="ROOT" scope="public">
<ruleref uri="#month" tag="Monat=monatsname.mon;"/>
</rule>
<rule id="monatsname">
<one-of>
<item tag="mon='jan';"> januar </item>
<item tag="mon='feb';"> februar </item>
<item tag="mon='mrz';"> maerz </item>
</one-of>
</rule>
</grammar>
Die Subregel monatsname wird aufgerufen, und der Wert wird in die Tagvariable mon eingetragen.
Auf diese Variable kann von der Top Level Regel aus mittels rulename.tagvariable (monatsname.mon) zugegriffen werden.
Mit diesem Wert wird dann die Top Level Variable Monat belegt.
Wichtig:
Um Variablenwerte an eine VoiceXML Applikation zu übergeben, muss die Top Level Regel ein Tag Attribut definieren.
Wird dies nicht gemacht, werden anstelle der Slotwerte die eigentlich Phrasen zurückgegeben.
Wir der nachfolgend rot markierte Teil vergessen, so werden anstelle der gewünschten Slotwerte 'jan',
'feb' oder 'mrz' die eigentlichen Phrasen 'januar', 'februar' bzw. 'maerz' zurückgeliefert.
<grammar xml:lang="de-DE" version="1.0" root="ROOT">
<rule id="ROOT" scope="public">
<ruleref uri="#month"
tag="Monat=monatsname.mon"
/>
</rule>
<rule id="monatsname">
<one-of>
<item tag="mon='jan';"> januar </item>
<item tag="mon='feb';"> februar </item>
<item tag="mon='mrz';"> maerz </item>
</one-of>
</rule>
</grammar>
3.3.8 Weitere Tags
<example>
<meta>
<token>
3.3.9 Multi-Slot SRGS Grammatiken
Beispiel:
<grammar xml:lang="de-DE" version="1.0" root="ROOT">
<rule id="ROOT" scope="public">
<ruleref uri="#money" tag="amount=betrag.a;"/>
<item> <tag> command='ueberweisung';</tag> ueberweisen </item>
</rule>
<rule id="betrag">
<one-of>
<item> <tag> a=1; </tag> einen euro </item>
<item> <tag> a=2; </tag> zwei euro </item>
<item> <tag> a=3; </tag> drei euro </item>
</one-of>
</rule>
</grammar>
Folgende Äusserungen sind erlaubt:
- einen Euro überweisen -> Slots/ Werte: command="ueberweisen"; amount=1
- zwei Euro überweisen -> Slots/ Werte: command="ueberweisen"; amount=2
- drei Euro überweisen -> Slots/ Werte: command="ueberweisen"; amount=3
Die VoiceXML Applikation wäre folgendermassen anzupassen:
<?xml version="1.0"?>
<vxml version="2.0">
<form>
<grammar src="bank_grammar.txt"/>
<block> Was möchten Sie tun ? </block>
Was möchten Sie tun ?
<block> Was möchten Sie tun ? </block>
<field name="field1" slot="command">
</field>
<field name="field2" slot="amount">
</field>
<filled mode="all" namelist="field1 field2">
<!-- Kommando weiterverarbeiten -->
</filled>
</form>
</vxml>
3.4 ABNF Grammatik
ABNF and XML Grammatiken sind sich ähnlich, und können einfach untereinander konvertiert werden.
ABNF wird meines Wissens eher selten verwendet.
Eine detaillierte Beschreibung von ABNF ist Teil der
Speech Recognition Grammar Specification (SRGS), und dort eingehend erläutert.
ABNF besitzt folgende Konstrukte:
- Sequenz A B
- Auswahl A | B
- Gruppierung (A | B)
- Optionales [A]
ABNF besitzt ebenfalls '*' und '+' zum Kennzeichnen von mehrmaligem Vorkommen einer Phrase.
(* Vorkommen größer oder gleich 0, + Vorkommen größer 0).
Eine ABNF Grammatik wird in eine Zeile geschrieben, oder mittels Rules auf mehrtere Zeilen verteilt.
[john | (john smith) | mary | (mary jones)] anrufen
Eine ABNF Grammar wird zur Laufzeit meistens in das Spracherkenner-spezifische Sprache übersetzt.
Verwendung von Slots in ABNF Grammatiken
januar {month:jan} | februar {month:feb} | maerz {month:mar}
oder auch
januar {month:jan} | februar {month:feb} | maerz {month:mar}
ABNF Sub-Grammatiken
$date = $month;
$month = januar {month:jan} | februar {month:feb} | maerz {month:mar};
Subgrammatiken & Slots in ABNF
$bankTransaction = $amount ueberweisen {command:ueberweisung};
$amount = (ein euro) {amount:1} | (zwei euro) {amount:2} | (drei euro) {amount:3};
4 DTMF Grammatiken
4.1 Allgemeines
Die DTMF Unterstützung ist bereits standardmässig in VoiceXML eingebaut.
Eine separate Definition von DTMF Grammatiken ist normalerweise nicht erforderlich.
Bei reinen DTMF-Anwendungen kann auf den Spracherkenner sogar ganz verzichtet werden, wenn die DTMF Grammar nicht als
<grammar>, sondern über <option> definiert ist. Die
Tastenerkennung erfolgt dann direkt auf dem Telefonieboard.
4.2 SRGS DTMF Grammatiken
Beispiel:
<grammar xml:lang="de-DE" version="1.0" root="ROOT"
mode="dtmf"
>
<rule id="ROOT" scope="public">
<one-of>
<item> 1 </item>
<item> 2 </item>
<item> 3 </item>
<item> 4 </item>
<item> 5 </item>
</one-of>
</rule>
</grammar>
Wichtig:
Voice- und DTMF-Grammatiken können in SRGS NICHT in einer Datei gemischt werden. Möchte man ASR und DTMF gemeinsam verwenden,
so muss man zwei separate Dateien erstellen und parallel laden.
5 Grammarspezifische Einstellungen in VoiceXML
Die nachfolgenden Grundeinstellungen (Properties) ermöglichen zur Laufzeit die Steuerung spracherkennerspezifischer Einstellungen.
Je nachdem, wo sie in der Applikation definiert werden, gelten die Einstellungen:
- Für die gesamte VoiceXML Applikation
- Für ein VoiceXML Dokument
- Eine <form> oder <menu>
- Individuell für Tags wie
<field>,
<form>,
<object>,
<record>,
<subdialog> oder
<transfer>
5.1 Barge In
Beispiel:
<property name="bargein" value="true"/>
Barge In kontrolliert die Möglichkeit, eine laufende Ansage durch Eingaben (Sprache und/oder Tastendruck) zu unterbrechen.
Ist Bargein eingeschaltet (= true), so wartet der Spracherkenner auf Eingaben bereits wenn die Ansage zu spielen beginnt,
bei ausgeschaltetem Bargein (=false) öffnet der Spracherkenner den Eingabekanal erst, wenn die Ansage zu Ende
gespielt wurde; alles bis dahin Gesagte wird ignoriert.
Die Defaulteinstellung ist meistens "true".
5.2 Confidence level
Beispiel:
<property name="confidencelevel" value="[0.0-1.0]"/>
Spracherkennung funktioniert grob gesagt durch Vergleiche der durch die Grammatik definierten Phrasen (und deren hinterlegten
akustischen Modellen) mit den auf dem Sprachkanal gerade eingehenden akustischen Phrasen.
Der Spracherkenner findet eine Äußerung, die möglichst nahe an dem Gesagten liegt, und gibt dieser erkannten Aussage eine
Wichtung, wie "sicher" er sich ist.
Ist dies Wichtung größer als der durch confidencelevel eingestellten Wert, so gilt die Aussage als erkannt, und das Ergebnis
wird der Applikation übergeben. Ist der Wert niedriger, d.h. der Spracherkenner ist sich nicht sonderlich sicher, wird ein
"nomatch" Ereignis ausgelöst, welches durch die VoiceXML Applikation abgearbeitet werden muss.
Die Defaulteinstellung ist meistens "0.5" (entspricht somit 50%).
Durch die Abfrage des Confidence levels in der Applikation kann man den Dialog entsprechend steuern. Wurde etwas erkannt, der Wert
ist aber niedrig, kann man im Dialog ggf. nachfragen, ob das Erkannte wirkliche gesagt wurde.
Je höher der Wert ist, desto unwahrscheinlicher ist ein Fehlerkennung des Spracherkenners (false accept)
6 Natürliche Spracherkennung - Tags & Slots
Natürliche Sprache ist die Sprache, die bei der menschlichen Kommunikation verwendet wird.
Natürliche Sprache zeichnet sich durch folgende Merkmale aus:
- Wir sprechen nicht in Einzelworten und -äußerungen (wir nutzen Phrasen und Sätze)
- Wir wenden unzählige Nuancen der natürlichen Sprache an, d.h. es gibt Hunderte Möglichkeiten, um etwas Bestimmtes auszudrücken
Wenn sie sich per Telefon eine Pizza bestellen, sagen Sie bei jedem Anruf immer genau dasselbe ?
Auch wenn Sie sich jedesmal dieselbe Pizza bestellen, werden Sie die Bestellung wohl häufig anders formulieren.
Sie werden vielleicht sagen "Ich hätte gerne die Pizza Thunfisch …", oder "Bitte bringen Sie mir die Thunfisch Pizza…".
Die unterschiedliche Formulierung ändert nichts am eigentlichen Wunsch, nämlich einer Thunfisch Pizza. Für uns Menschen ist das klar,
aber woher soll das eine Maschine wissen, die Sprache mit vordefinierten Grammatiken vergleicht.
Der Ansatz der natürlichen Spracherkennung ist nun, der Kommunikation mit dem System etwas mehr Freiheit zu verleihen, und verschiedene
Phrasen und auch ganze Sätze zuzulassen. Dem System wird über die Grammatik jedoch nur das Wesentliche zurückgeliefert, ausschmückende
Phrasen wie "bitte" usw. werden schon in der Grammatik herausgefiltert.
Eine Natural Language Grammatik für eine Pizzabestellung kann zum Beispiel folgende Äußerungen zulassen:
- kann ich bitte [bestellung].
- ich möchte [bestellung].
- ich hätte gerne [bestellung].
wobei [bestellung] ein beliebige Anzahl, gefolgt von "klein", "mittel", "groß" sein kann, plus einer Liste der
gewünschten Garnierungen. Jede Phrase sendet das Ergebnis [bestellung] zurück, und das ist die eigentliche Bedeutung der Aussage.
Jedes Grammatikformat hat ihre eigenen Methoden, um Rückgabewerte zu verändern und vorzufiltern, und damit eine natürliche Spracherkennung
zu ermöglichen. Dies wurden bei den Beschreibungen der einzelnen Grammatikformate bereits angerissen.
7 Weitere Informationen und Links
Weitere Informationen zu Spracherkennungs - Grammatiken gibt es u.a.:
|