Studienprojekt 2002
Computerlinguistisches Seminar der Universität Heidelberg
Teilnehmer: Kai Jung, Klaus Rüggenmann, Azim Kücükoba
Autor: Klaus Rüggenmann, Nov 2002
krueggen@ix.urz.uni-heidelberg.de / klaus@atomicweb.de

Dokumentation
Teilprojekt 2: Telefonieanwendung Wettervorhersage

Inhalt:


0. Allgemeines
1. Der Dialog
2. Architektur
3. Bestandteile der Anwendung
4. Voraussetzungen und Resourcen

1. Allgemeines

Die Anwendung ist ein dynamisch generierter VXML-Dialog, der zur Ausführung auf einem VXML 1.0 konformen Voice Server gedacht ist. Das VXML wird über PHP4 erzeugt. Man braucht also einen Voice Server, der das VXML interpretieren kann und einen PHP fähigen Webserver, von dem der Voice Server die VXML-Seiten bekommt. Die benötigten Wetter-Informationen werden von einem Drittanbieter bezogen, hier ist das www.netscape.de/wetter.

Je nach Installation kann der Voice Server in einer Telefonieumgebung (Telefonkarte) oder mit native Audio (übliche Soundkarte) betrieben werden. Da die VXML-Seiten nicht statisch sind, werden sie mit einem HTTP GET geholt, man referenziert beim Voice Server die Anwendung mit der URL des Dialogstarts, in diesem Fall die Datei query.php4 (also http://www.meinhost.com/.../wetter/query.php4).

2. Der Dialog

Der Voice Server nimmt einen Anruf entgegen. Wenn die Anwendung bei einem externen Telefonie-Provider (z.B. www.voxpilot.com) läuft und die Anwendung nicht direkt mit einer Telefonnummer verknüpft ist, muss man sich zuerst über Login und Pin anmelden. Dann holt der Voice Server von der URL des Dialogstarts die erste VXML-Seite (query.php4). Der Benutzer wird begrüßt, erhält einen kurze Erklärung des Systems und wird dann zu einer Eingabe aufgefordert. Die Eingabe kann aus einer Stadt oder einem Bundesland bestehen, die in der Grammatik enthalten sind.

Wenn der Erkenner die Äußerung des Benutzers einem Eintrag in der Grammattik zuordnen kann, wirft er das filled-event und führt die für diesen Fall vorgesehende Aktion aus. Die erkannte Stadt / das Bundesland wird dann an das Skript answer.php4 geschickt. Dort wird mit Hilfe der Klassen Wetter (in Wetter.php4) und HtmlParser( in HtmlParser.php4) die Ansage erzeugt.

Die Klasse Wetter stellt alles bereit, was für das holen der Wetterdaten bei unserem speziellen Informationsabieter erforderlich ist. Mit einem Objekt vom Typ Wetter wird also nachgerpüft, ob die Eingabe korrekt war, was für eine Request-String in diesem Fall an das Skript von www.netscape.de/wetter geschickt werden muss. Es wird nachgeprüft ob eine vernünftige Html-Seite zurückgeliefert wurde. Wenn das so ist, werden die Wetterinformationen mit HtmlParser extrahiert, dem Wetter Objekt übergeben und von dem aufbereitet.

Die Antwort (oder wenn was nicht stimmt ein Fehler) wird daraufhin angesagt, und der Anwendungsteil query.php4 wird wieder aufgerufen. Der Benutzer kann eine neue Stadt auswählen usw.

Man sollte darauf achten, den timeout der VXML Anwendung für HTTP GET nicht zu kurz zu wählen, denn wenn die Antwort zusammengestellt wird, sind 3 Server beteiligt, und der Voice Server muss warten, bis die fertige Antwort bei ihm ankommt: z.B. wird bei der derzeitigen Implementierung (Dez 2002) von www.voxpilot.com (Voice Server) die Anfrage an das Skript answer.php4 geschickt, das unter http://www.rzuser.uni-heidelberg.de/~krueggen/studpro/wetter/vxml/answer.php4 abgelegt ist. Dieses wiederum muss sich die Wetterinformationen bei www.netscape.de/wetter holen. Die fertige Antwort muss dann wieder an www.voxpilot.com geschickt werden. Im Regelfall dauert der Weg nur ein oder zwei Sekunden, und die Ansage kommt relativ fix. Wenn aber eine Verbindung einmal nicht sofort zustande kommt, und der Voice Server ein fetchtimeout event wirft, dann bekommt man eine relativ unangenehme Fehlermeldung angesagt und die Anwendung wird abgebrochen. Darum ist es wichtig die property fetchtimeout vorsichtshalber auf wenigstens 5 s zu setzen (als property entweder im vxml_root.vxml global, oder jeweils in query.php4 und answer.php4).

3. Architektur

4. Bestandteile der Anwendung:

query.php4
locations.grammar
answer.php4
vxml_root.vxml
bye.vxml
Wetter.php4
HtmlParser.php4

query.php4:

Diese Datei ist der Start der Anwendung. Wenn also vom Voice Provider nur eine Datei als VXML Anwendung anzugeben ist,
dann ist das diese! Sie wird aber auch benutzt um die von answer.php4 gelieferte Antworten, Fehlermeldungen u.ä. zurückzugeben. Außerdem
kann der Dialog nach der ersten Auskunft weitergeführt werden.

locations.grammar:

Diese Datei ist die Grammatik für Ortsangaben, für die eine Wettervorhersage angefragt werden kann. Sie ist in query.php4 als externe Grammatik eingebunden. Die Grammatik ist in der GSL-Syntax geschrieben (Grammar Specification Language, NUANCE 7.0, www.nuance.com). Im Prinzip sind hier reguläre Ausdrücke für die Äußerungen formuliert, die der Erkenner akzeptieren soll. Das Ergebnis der Erkennung wird dann an answer.php4 geschickt, welches die Ansage für den angeforderten Ort generiert.

answer.php4:

Diese Datei wird von query.php4 aufgerufen, wenn der Erkenner eine gültige Stadt identifiziert hat. Diese wird in der Varible $rawquery übergeben. Über die Methoden der Klasse Wetter wird die Anfrage in den String umgewandelt, den der Bereitsteller der Information (hier www.netscape.de/wetter/index.jsp) als query-String sehen will. Die zurückkommende HTML-Seite wird mit der Klasse HtmlParser verarbeitet, welche die Vorhersage aus der Seite extrahiert. Diese Daten bekommt das Wetter Objekt, welches sie dann noch aufbereitet. Dann wird daraus die Antwort zusammengesetzt und angesagt.

vxml_root.vxml:

Diese Datei ist das root-Dokument der VXML-Anwendung. Sie wird von jedem einzelnen Dokument aus mit application="vxml_root.vxml" im VXML-Tag referenziert. Hier werden einige grundlegende Properties der Anwendung festgelegt, wie z.B. die Sprache für Erkenner und TTS und der timeout für HTTP-fetching. Ausserdem sind Grammatiken, welche hier definiert werden, zu jedem Zeitpunkt aktiv (zusätzlich zu anderen eventuell gerade aktiven Grammatiken mit einem kleineren scope).

bye.vxml:

Diese Datei wird aufgerufen, wenn der Benutzer den Dialog beenden will, oder ihn versehntlich beenden würde. Über die default-Grammatik für das deutsche Sprachmodul wird (bei diesem Voice Server) für die Verabschiedungsformeln des Deutschen ein exit-event geworfen. Das event wird auf jeder Seite mit dem catch-Tag aufgefangen, und zu bye.vxml umgeleitet. Sonst bekommt man eine englische Verabschiedung. Auf dieser Seite wird außerdem noch einmal gefragt, ob man den Dialog beenden möchte, denn zuweilen liefert der Erkenner auch fälschlich eine Form der deutschen Verabschiedung bei Telefonaten (wie 'tschüß' und 'auf Wiederhören'). So wird sichergestellt, dass man das Gespräch nicht versehntlich beendet.

Wetter.php4

Diese Datei enthält die Klasse Wetter. Sie enthält alles, was für die für die Datenbeschaffung bei http://www.netscape.de/wetter/index.jsp spezifisch ist.
- Basis URL
- Query für eine bestimmte Stadt
- Position der gewünschten Infos in der zurückgelieferten Seite
- die Muster für den Müll um die Infos herum
- die Städte, welche für ein bestimmtes Bundesland erfasst sind

dazu hat die Klasse die folgenden Eigenschaften und Methoden:

Wetter
$tableCont

fill()
getUrl()
getMorTag()
getMorMinTemp()
getMorMaxTemp()
getMorRegen()
getMorVormSit()
getMorNachmSit()
parseTag()
parseMinTemp()
parseMaxTemp()
parseRegen()
getBuLaStaedte()
getQuery()


Die genauere Dokumentation der einzelnen Funktionen findet sich im Quelltext.

HtmlParser.php4:

Diese Datei enthält die Klasse HtmlParser. Sie enthält eine Methode, mit der man eine bestimmte Tabelle in ein zweidimensionales Array lesen kann. Für die behandelten Fälle wurde keine weitergehende Zugriffsmöglichkeit auf HTML Elemente benötigt. Man könnte statt dieser Klasse aber auch einen 'richtigen' HTML Parser benutzen und auf die Elemente im Parse-Baum zugreifen. Das zweidimensionale Array ist aber einfache zu handhaben und reicht für diese Zwecke.

HtmlParser
$seite
$rest
$table
$maxRows
$maxCols
getTable()
getRest()
getRows()
getColConts()

Die genauere Dokumentation der einzelnen Funktionen findet sich im Quelltext.

 

5. Voraussetzungen und Resourcen:

Voice Server:

Ein Voice Server besteht aus den Bestandteilen VXML-Interpreter, Sprachsynthese sowie Spracherkenner. Er kann über native Audioein- / Ausgabe mit einer normalen Soundkarte oder idealerweise mit einer Telefonkarte betrieben werden. Man kann sich z.B. eine kostenfreie Entwicklerlizenz für den Nuance "Voice Web Server 2.0" ( www.nuance.com ) besorgen, und mit der Software arbeiten. Man kann es auf den Plattformen Windows2000 oder SPARC Solaris installieren, und das native audio läuft nur mit einer original SoundBlaster Karte.

Alternativ gibt es auch schon kommerzielle Hoster von VXML-Anwendungen, welche eine Möglichkeit bieten Telefonie-Anwendungen mit einem Testaccount zu entwickeln. Dies hat den Vorteil, dass man die Telefonie-Umgebung nicht selbst kaufen und konfigurieren muss. Für diese Arbeit wurde ein Testaccount der irischen Firma Voxpilot ( www.voxpilot.com ) benutzt. Die Anwendung selbst muss nicht dort liegen, man kann sie einfach mit einer URL referenzieren.

 

VXML:

Die Markup-Sprache dient dazu, Dialogabläufe zu definieren. Ein Dialog ist in diesem Fall immer eine Abfolge von TTS-synthetisierten oder aufgenommenen Ansagen des Voice Servers und Antworten des Benutzers. Man hat die Möglichkeit Menüs zu definieren, sowie auf bestimmte Benutzer-Antworten mit Aktionen zu reagieren. VXML-Dialoge können genau wie HTML-Seiten mit einem serverseitigen Skript generiert werden. Dadurch kann man auch auf schon existierende Web-Anwendungen, Datenbanken o.ä. zugreifen und es ist eine nahtlose Integration mit der Logik schon existierender Web-Angebote möglich.

Entstanden ist die xml-Variante zunächst aus einer Kooperation von AT&T, Lucent, Motorola und IBM und wurde vom gemeinsamen VoiceXML Forum ( http://www.voicexml.org ) veröffentlicht. Mittlerweile ist die Verantwortung für die Weiterentwicklung und Veröffentlichung auf das W3C Konsortium übergeganen ( http://www.w3.org/Voice/ ). Dort findet man auch die Spezifikationen der Versionen 1.0 und 2.0. Die Implementierung des Standards variiert allerdings etwas, und es lohnt sich, die Besonderheiten des verwendeten VXML Interpreters anzusehen.

In dieser Arbeit wurde VXML1.0 in der Implementierung von Voxpilot ( www.voxpilot.com ) verwendet. Der dtd findet sich unter http://dtd.voxpilot.com/voice/1.0/voxpilot_voicexml-1.0.dtd.