Dieser Text ist zu einem Vortrag in einem XML Seminar an der Humboldt Universität Berlin geschrieben, und hat daher nicht den Anspruch das Thema Voice XML umfassend in allen Tiefen darzulegen. Vielmehr habe ich nur das Ziel einen Einblick in einige Prinzipen, wichtige Element und ihre Attribute zu geben. Der Text ist zwar so geschrieben, daß man ihn hoffentlich auch durchgängig lesen kann, aber es ist empfehlenswert parallel zum Text die beiden Beispiele durchzugehen, da ich keine umfassenden Beispiele in den Text selbst eingebunden habe.
Hier können Sie "Beispiel 1 Wetterdienst" und "Beispiel 2 Auswahl" in einem separaten Fenster öffnen.
Alle wichtigen Informationen zum Thema Voice XML findet man unter http://www.voicexml.org/ . Diese Seite hat auch mir als Quelle, zum erstellen dieser Seite gedient. Auch meine Beispiele sind von dort entnommen.
Gegründet wurde das Voice XML Forum von AT&T, IBM, Lucent und Motorola im März 1999 mit dem Ziel eine neue Computersprache zu entwickeln, welche Inhalte und Informationen im Internet über Sprache und Telefon zugänglich macht.
Voice XML ist ein XML Schema.
Die Version 1.0 von Voice XML ist am 07.03.2000 erschienen und diejenige, an welcher ich mich in diesem Text orientiere.
Wozu Voice XML?
Voice XML wurde für Telefonanwendungen entwickelt, die auf Sprache basieren und unterstützt daher folgende Feature:
Ein Voice XML Anwendung, welche aus einem oder mehreren Voice
XML Dokumenten bestehen kann, bildet einen endlichen Zustandsautomaten, d.h.
der Benutzer befindet sich zu jeder Zeit in einem Gesprächszustand, bzw.
Dialog. Jeder Dialog muß den nächsten Dialog über URI's festlegen.
Verweist die URI auf kein Dokument, wird der gegenwärtige Dialog abgespielt.
Wenn die URI auf keinen Dialog verweist, dann wird der erste Dialog in dem Dokument
abgearbeitet. Wurde kein nachfolgender Dialog festgelegt, oder es ist ein Element
enthalten, welches das Ende des Gespräches festlegt, so wird die Ausführung
der Anwendung beendet.
Ein jedes Voice XML Dokument beginnt mit dem <vxml> Element, das
ein Container für die Dialoge ist.
Ein Gespräch besteht aus Dialogen. In Voice XML gibt es zwei Arten von Dialogen: <form> und <menu>. <Form> dient dem Sammeln von Daten und Darstellen von Informationen, während <menu> den Benutzer mit einer Auswahl konfrontiert, aus der dieser wählen kann. Um ein Gespräch besser strukturieren zu können gibt es außerdem noch <subdialog>, das ähnlich einem Funktionsaufruf funktioniert.
<Form> bildet die Schlüsselkomponente von Voice XML Dokumenten. Das <form> Element hat zwei Attribute: id und scope. Id gibt den Namen von <form> an und scope den Umfang in welchem die Grammatik des <form> Elementes gilt. Ist der Umfang auf dialog gesetzt, so gilt die Grammatik nur innerhalb des <form> Elementes, während sie für das gesamte Dokument gilt, in dem das <form> Element steht, wenn der Umfang auf document gesetzt wurde. Ist das Dokument ein Wurzeldokument und der Umfang auf document gesetzt, so gilt die Grammatik in jedem Dialog der Anwendung.
Forms können form items, Deklarationen von Namen (die kein Feld repräsentieren), Ereignisbehandlungen und Aktionen (welche eintreten sollen wenn bestimmte Kombinationen von field items gefüllt wurden) enthalten. Die form items unterteilen sich in field items und control items.
Field items bestehen aus prompts, welche dem Benutzer sagen was er zu tun hat, Grammatiken, welche die erlaubten Eingaben festlegen, und Ereignisbehandlungen. Es gibt fünf field items. Das field item <field> ist vergleichbar mit einem Eingabefeld und erhält ihren Wert über die automatische Spracherkennung oder die Eingabe über die Telefontastatur. Das <record> Element ist ähnlich dem <field> Element erhält seine Eingabe, aber durch einen Audioclip, der vom Benutzer aufgezeichnet wurde. Mit dem <transfer> Item kann der Benutzer zu einer anderen Telefonnummer transferiert werden. Das item <object> ruft ein plattformspezifisches Objekt auf um z.B. zusätzliche Telefonfunktionalitäten nutzen zu könne. Außerdem gibt es noch das <subdialog> item, welches einen anderen Dialog oder ein anderes Dokument aufruft.
Innerhalb einer Form gibt es zwei verschiedene Arten von Control items. Das <block> item faßt eine Sequenz von Statements, die zur Ausgabe und zur Berechnung, aber nicht zur Eingabe benutzt werden, zusammen. In einer typische Form mit gemischter Initiative benötigt man das <initial> item, wenn der Benutzer nach Informationen gefragt wurde sie aber noch nicht gegeben hat.
<Menu> ist eine Abkürzung für eine Form, die nur ein Feld enthält, das den Benutzer auffordert eine Wahl zu treffen, und ihn dann seiner Wahl entsprechend zu einem anderen Dialog leitet. Das <menu> Element hat die Attribute id, scope und dtmf, wobei für id und scope die selben Regeln gelten wie bei <form>. Wird das dtmf Attribut auf true gesetzt, so erhält jede Auswahl, die nicht explizit ein DTMF Element hat, implizit eine DTMF beginnend mit "1" dann "2" usw.
Die mögliche Auswahl wird durch das <choice> Element festgelegt, indem man ein Fragment einer Sprachgrammatik (z.B. ein bestimmtes Wort) oder einer DTMF Grammatik (z.B. Zahlenkombination) angibt. Die DTMF Sequenz für die Auswahl gibt man mittels des Attributes dtmf an. Mit dem next Attribut legt man die URI des nächsten Dialoges fest, der ausgeführt werden soll, wenn das Fragment der Sprach- oder DTMF Grammatik eingegeben wurde. Anstelle des next Attributes kann man auch das expr Attribut verwenden um einen Ausdruck anzugeben, der bei erfolgter Wahl ausgewertet werden soll oder man gibt mit dem event Attribut ein Ereignis an, das erzeugt werden soll.
Mit dem <enumerate> Element kann man sich eine automatisch erstellte Beschreibung der Möglichkeiten, die man zur Wahl hat, angeben lassen. Dies kann man nutzen, um wie im Beispiel 2 eine Ausgabe zu erstellen die sämtliche Möglichkeiten, welche dem Benutzer zur Verfügung stehen, auflistet.
Das <subdialog> Element dient dem erstellen von Unterdialogen. Die Idee der Unterdialoge ist mit der Idee der Funktionen in anderen Programmiersprachen vergleichbar. Der Aufruf der Unterdialoge erfolgt durch das <subdialog> Element, indem man durch das src Attribut dessen URI angibt. Des weiteren gibt es noch das name Attribut, welches angibt unter welchem Namen der Rückgabewert des Unterdialoges gespeichert werden soll.
Der Aufruf eines Unterdialoges könnte also folgendermaßen aussehen:
<subdialog name="sub1" src="#sub1"> ... <subdialog>
Der Unterdialog selbst muß ein <return> Element enthalten.
Dieses beendet den Unterdialog und gibt die Kontrolle an den Dialog, der den
Unterdialog aufgerufen hat, zurück. Dabei kann man mittels des event
Attributes ein Ereignis hervorrufen und mittel namelist eine Reihe von
Variablen zurückgeben.
Dies kann dann z.B. so aussehen:
<form id="sub1"> ...
<return namelist="X Y"/>
</form>
Ein <link> Element enthält eine oder mehrere Grammatiken. Paßt eine dieser Grammatiken zu einer Eingabe, dann wird der Link ausgeführt. Dies kann einerseits bedeuten, daß der Benutzer zu einem anderen Dialog weitergegeben wird oder andererseits ein Ereignis erzeugt wird. Mit dem next Attribute wird der Benutzer an die entsprechende URI weitergegeben und mit dem event Attribut erzeugt man ein Ereignis. Des weiteren steht dem Programmierer noch das expr Attribut zur Verfügung, das genauso wie das next Attribut funktioniert, mit dem man aber die URI dynamisch erzeugen kann.
Ein Beispiel für <link>:
<link event="help">
<grammar type="application/x-jsgf"> arrgh | alas
all is lost | fie ye forward machine | I don't get it </grammar>
</link>
Wie bereits erwähnt gibt es in Voice XML zwei Möglichkeiten für Eingaben: Spracheingabe und DTMF. Dementsprechend gibt es auch zwei Grammatiken. Das <grammar> Element repräsentiert die Sprachgrammatiken, während das <dtmf> Element die DTMF Grammatik darstellt. Beide Grammatiken können entweder inline oder aber extern angegeben werden. Will man die Grammatik extern angeben, so legt man mit dem Attribut src die Quelle der Grammatik fest. Des weiteren kann man mit scope bei beiden Grammatiken den Wirkungsbereich festlegen und mit type besteht die Möglichkeit die Grammatik dynamisch festzulegen.
Ein Beispiel für eine inline Grammatik:
<grammar type="mime-type"> eine inline Sprachgrammatik | inline speech grammar </grammar>
Und hier noch eine externe Grammatik:
<dtmf src="#externe_DTMF" type="mime-type"/>
Es gibt zwei Arten von Ereignissen. Die Einen werden vom Benutzer hervorgerufen,
wenn dieser nicht antwortet, undeutlich antwortet, Hilfe fordert usw., so das
die Plattform ein Ereignis erzeugt. Außerdem kann der Interpreter ein
Ereignis erzeugen, wenn es Semantikfehler im Voice XML Dokument gibt oder aber
der Interpreter auf ein <throw> Element trifft.
Will man selbst also ein Ereignis erzeugen, so benutzt man dafür das <throw>
Element, wobei man mit dem Attribut event festlegt, wie das erzeugte
Ereignis heißt.
Will man ein Ereignis abfangen um auf dieses zu reagieren, so benutzt man das
<catch> Element. Auch hier legt man mittels des event Attributes
fest um welches Ereignis es sich handelt. Das count Attribut zählt
die Häufigkeit des Auftretens des Ereignisses mit, so daß man auf
verschiedene Häufigkeiten verschieden reagieren kann, z.B. freundlicher
oder auch gereizter. Außerdem kann man mit cond noch eine Bedingung
festlegen, mit der man z.B. ermitteln kann ob man ein Ereignis wirklich abfangen
möchte.
Um die Handhabung der Ereignisbehandlung zu vereinfachen gibt es bereits eine
Reihe von Abkürzungen für <catch> Elemente um bestimmte Ereignisse
abzufangen: <error>, <help>, <noinput>
und <nomatch>.
Eine Erzeugung und Ereignisbehandlung eines Hilferufes könnte folgendermaßen aussehen:
<throw event="help"/>
<catch event="help"> No help available. </catch>
Variablen werden entweder mittels des <var> Elements oder in form
items deklariert. Mit dem Attribut name wird jeweils der Name der Variablen
angegeben. Möchte man den Variablen gleich bei ihrer Deklaration einen
Wert zuweisen, so kann man dies mit dem Attribut expr tun. Variablen
die nicht bei ihrer Deklaration initialisiert wurden erhalten den Wert undefiniert.
Will man Variablen einen Wert zuweisen, so benutzt man das Element <assign>.
Auch hier gibt name den Namen der Variable und expr deren Wert
an.
Ein Beispiel für eine Deklaration ohne Wertzuweisung:
<var name="home_phone"/>
Hier ein Beispiel mit Wertzuweisung:
<var name="pi" expr="3.14159"/>
Noch eine Deklaration innerhalb eines form items:
<field name="num_tickets" type="number"> ... </field>
Und schließlich noch eine Wertzuweisung:
<assign name="city" expr="Los Angeles"/>
Als Variablentypen sind in Voice XML bereits boolean, date, digits, currency, number, phone und time als build in Typen vorhanden.
Zur Kontrolle der synthetischen Sprachausgabe und der Kontrolle der Ausgabe von aufgezeichneten Audiodaten steht dem Benutzer das <prompt> Element zur Verfügung. Mittels des Attributes bargein kann man festlegen, ob der Benutzer das Recht haben soll, die Ausgabe zu unterbrechen. Möchte man die Ausgabe an eine bestimmte Bedingung knüpfen, so benutzt man auch hier wieder cond und mit count kann man die Ausgabe an die Häufigkeit, mit der sich der Nutzer wiederholt, anpassen. Schließlich hat man mit timeout noch die Möglichkeit die Zeit für die nächste Benutzereingabe festzulegen. Man kann das <prompt> Element weglassen, wenn man Ausgaben machen möchte, für die man kein Attribut verändern muß, man keine Sprachmarkierungen benutzen oder die Ausgabe nur aus einem <audio> Element besteht.
Z.B. sind auch dies gültige Ausgaben:
Please say your City.
<audio src="say_your_city.wav"/>
Benutzt man aber das <prompt> Element, so stehen einem eine Reihe von Sprachmarkierungen zur Verfügung, mit denen man Sprechpausen (<break>) einfügen und Betonungen (<emp>) festlegen kann. Außerdem kann man Teile der Ausgabe die von einem besonderen Typ sind (<div>) zusammenfassen, rhapsodische Informationen für den Text (<pros>) festlegen und angeben wie eine Phrase gesprochen werden soll (<sayas>). Durch Benutzung des <audio> Elements kann man die Ausgabe mit einer Audiodatei vermischen und mittels <value> Variabelenreferenzen in die Ausgabe einbetten.
Auch hier ein kleines Beispiel:
<prompt> Please <emp>say</emp> your city. <audio src="say_your_city.wav"> </prompt>
Wie in HTML Dokumenten ist es auch in Voice XML Dokumenten möglich mit dem <meta> Element Metadaten festzulegen. Es werden diese zwar nicht vom Programmierer gefordert, aber es wird empfohlen Informationen über den Autor (author), das Copyright (copyright) und den Unterhalter der Seite (maintainer) anzugeben. Außerdem sollte man noch eine Beschreibung der Seite (description), Schlüsselwörter (keywords) und Anweisungen für Suchroboter (robots) angeben. Das Attribut name gibt hierbei immer den Namen der Metainformation und das Attribut content den Inhalt dieser an, wobei man anstelle von name auch http-equiv benutzen kann.
Hier ein Beispiel für eine Metainformation:
<meta name="author" content="Name">
Um auf die Eingaben des Nutzers in Felder zu reagieren benutzt man das <filled> Element. Dieses benutzt man, um Aktionen festzulegen, die eintreten sollen, wenn eine bestimmte Kombination von Feldern vom Nutzer gefüllt wurden. Das Attribut namelist gibt die Liste der Felder an, auf die sich das <filled> Element bezieht und mode bestimmt an, ob alle (all) oder irgendeines (any) dieser Felder gefüllt sein muß. Die Attribute finden allerdings nur dann Verwendung, wenn das <filled> Element Kindknoten eines <form> Elementes ist, denn ist es Kindknoten eines <field> Elements erübrigen sich diese.
Mit dem <clear> Element kann man ein oder mehrere form items, die mit namelist angegeben werden, zurücksetzen, d.h. es werden die entsprechenden Variablen auf undefiniert gesetzt und die Ausgabe und Ereigniszähler reinitialisiert.
Bedingte Logik wird durch die Elemente <if>, <elseif> und <else> ermöglicht, wobei das Attribut cond die Bedingung angibt.
Durch <reprompt> wird die nächste Ausgabe gewählt und abgespielt und der Ausgabezähler um eins erhöht.
Das <goto> Element leitet den Nutzer zu einem andern form item, einem anderen dialog oder einem anderem Dokument weiter. Eines der Attribute next, expr, nextitem oder expritem muß die Adresse des nächsten Elements bzw. Dokumentes angeben.
Vergleichbar mit <goto> ist das <submit> Element mit dem man im Gegensatz zu <goto> eine Liste von Variablen durch HTTP, GET oder POST an einen Dokumentenserver übermitteln kann.
Wie in HTML kann man auch in Voice XML Dokumente mit dem Element <script> den Code einer Skriptsprache inline oder extern (src) einbinden.
Natürlich gibt es auch die Möglichkeit alle geladenen Dokumente zu beenden. Hierzu stehen dem Programmierer das <exit> und das <disconnect> Element zur Verfügung. Der Unterschied zwischen beiden besteht darin, daß <exit> die Kontrolle zum Interpreter zurückgibt und diesem die Wahl überläßt, was er als nächstes tut, während <disconnect> ein telephone.disconnected.hangup Ereignis erzeugt und die Trennung des Interpreters vom Nutzer verursacht.
<vxml version="1.0">
<form id="weather_info">
<block>Welcome to the weather information
service.</block>
<field name="state">
<prompt>What state?</prompt>
<grammar src="state.gram"
type="application/x-jsgf"/>
<catch event="help">
Please speak the state for which you want the weather. </catch>
</field>
<field name="city">
<prompt>What city?</prompt>
<grammar src="city.gram"
type="application/x-jsgf"/>
<catch event="help">
Please speak the city for which you want the weather. </catch>
</field>
<block> <submit next="/servlet/weather"
namelist="city state"/> </block>
</form>
</vxml>
Ein möglicher Gesprächsablauf:
C: (computer): Welcome to the weather information service.
What state?
H: (human): Help
C: Please speak the state for which you want the weather.
H: Georgia
C: What city?
H: Tblisi
C: I did not understand what you said. What city?
H: Macon
C: The conditions in Macon Georgia are sunny and clear at 11 AM
<vxml version="1.0">
<menu>
<prompt>Welcome home. Say one of: <enumerate/>
</prompt>
<choice next="http://www.sports.example/vxml/start.vxml">
Sports </choice>
<choice next="http://www.weather.example/intro.vxml">
Weather </choice>
<choice next="http://www.stargazer.example/voice/astronews.vxml">
Stargazer astrophysics news </choice>
<noinput>Please say one of <enumerate/></noinput>
</menu>
</vxml>
Und auch hier ein möglicher Gesprächsablauf:
C: Welcome home. Say one of: sports; weather; Stargazer
astrophysics news.
H: Astrology.
C: I did not understand what you said. (a platform-specific default
message.)
C: Welcome home. Say one of: sports; weather; Stargazer astrophysics news.
H: sports.
C: (proceeds to http://www.sports.example/vxml/start.vxml)
geschrieben von Karsten Draba 2001
E-Mail: kdraba@informatik.hu-berlin.de