Jens Oliver Meiert

Einführung in VoiceXML 2.0 (W3C)

Originalversion:
https://www.w3.org/­Voice/Guide/
Übersetzer:
Jens Oliver Meiert, meiert.com
Datum der Übersetzung:
1. März 2005 (↻ 20. Juli 2007)

Bei diesem Dokument handelt es sich um die deutsche Übersetzung eines W3C-Textes. Dieser Text ist urheberrechtlich geschützt; bitte beachten Sie die Hinweise des Originaldokuments sowie die Anmerkungen der W3C-Dokumentlizenz. Die Übersetzung hat keine durch das W3C legitimierte, normative Wirkung. Das einzige maßgebliche Dokument ist das englische Original.

Bitte senden Sie Fehler und Korrekturen zur deutschen Fassung an den Übersetzer. Kommentare des Übersetzers, die als solche gekennzeichnet sind, unterliegen dem Urheberrecht des Übersetzers. Sie sind kein Bestandteil des Ursprungsdokuments.

Dave Raggett. Einführung in VoiceXML 2.0

Dave Raggett, revidiert am 14. November 2001.

Dies ist eine kurze Einführung in VoiceXML. Sie verdankt ihre Entstehung einem weitgereisten Satz Folien von Scott McGlashan (HP). Scott führt den zweiten Vorsitz bei der W3C-Sprach-Browser-Arbeitsgruppe und leitet die VoiceXML-Untergruppe.

Inhalt

VoiceXML-Überblick

Telefon, VoiceXML-Interpreter und eine Website.

Was ist VoiceXML? Nun, VoiceXML ist eine XML-Sprache zum Schreiben von Websites, mit denen man sowohl durch das Hören von Bedienhinweisen und Klängen interagieren, als auch durch gesprochene Eingaben Befehle geben kann. VoiceXML bringt das Internet zum Telefon. Es gibt eine wachsende Anzahl von Sprachportalen, die Sie anrufen und ausprobieren können, wenn Sie einen Eindruck davon bekommen wollen, wie das genau aussieht. Etliche Seiten bieten zudem freies Hosting für VoiceXML. Einige Referenzen zu solchen Seiten können in der FAQ auf der Übersichtsseite gefunden werden.

VoiceXML ist nicht HTML. HTML wurde für visuelle Websites entworfen und entbehrt der Kontrolle über die Benutzer-Anwendung-Kommunikation, die für eine sprachbasierte Oberfläche erforderlich ist. Bei der Sprache ist es so, dass man nur eine Sache gleichzeitig wahrnehmen kann (ähnlich dem Lesen einer Zeitung mit einem Zehnfach-Vergrößerungsglas). VoiceXML wurde sorgfältig entworfen, um Autoren die volle Kontrolle über den gesprochenen Dialog zwischen Benutzer und Anwendung zu geben. Die Applikation und der Benutzer übernehmen das Sprechen rundenweise: Die Anwendung erbittet ein Kommando vom Benutzer, und dieser antwortet im Gegenzug.

VoiceXML-Dokumente beschreiben:

VoiceXML erleichtert es, schnell neue Anwendungen zu erschaffen, und schirmt Entwickler von den systemnahen sowie den Implementierungsdetails ab. Es trennt Nutzerinteraktion von Dienstlogik. Die W3C-VoiceXML-Spezifikation stellt die verbindliche Referenz für VoiceXML dar. Sie können darauf bezogene Arbeit auf der Sprach-Browser-Übersichtsseite des W3C einsehen.

Grundkonzepte von VoiceXML

Eine Session beginnt, wenn der Benutzer anfängt, mit einem VoiceXML-Interpreter zu interagieren, und wird fortgesetzt, während VoiceXML-Dokumente ge- und entladen werden. Die Session endet, wenn dies vom Benutzer, dem VoiceXML-Dokument oder dem Interpreterkontext angefordert wird. Die Plattform definiert das grundsätzliche Sessionverhalten, obwohl dies teilweise durch VoiceXML überschrieben werden kann.

VoiceXML-Dokumente definieren Anwendungen als einen Satz von benannten Dialogzuständen. Der Benutzer befindet sich immer in jeweils einem Dialogzustand. Jeder Dialog spezifiziert den nächsten Dialog, zu dem über eine URL übergegangen wird.

VoiceXML-Dialoge umfassen Formulare und Menüs. Ein Menü präsentiert dem Benutzer eine Reihe von Optionen sowie die Übergänge zu anderen Dialogzuständen, die auf der Auswahl des Benutzers basieren. Ein Formular definiert eine Interaktion, die Werte für alle Felder in dem Formular sammelt. Jedes Feld kann eine Eingabeaufforderung, den erwarteten Input und Evaluierungsregeln spezifizieren. Das Formular kann auf nahezu dieselbe Weise wie bei HTML an einen Server übermittelt werden.

Eine Anwendung ist ein Satz von VoiceXML-Dokumenten, die dasselbe Anwendungshauptdokument teilen. Das Hauptdokument wird automatisch geladen, sobald eines der Anwendungsdokumente geladen wird, und es bleibt geladen, bis ein Übergang zu einer anderen Anwendung stattfindet oder der Anruf unterbrochen wird. Die Informationen aus dem Hauptdokument stehen allen Dokumenten aus derselben Anwendung zur Verfügung.

Mehrere VoiceXML-Dokumente können dasselbe Anwendungshauptdokument teilen.

Jeder Dialogzustand besitzt eine oder mehrere mit ihm assoziierte Grammatiken, die dazu gebraucht werden, die erwarteten Nutzereingaben entweder als gesprochener Input oder als Tonwahl (DTMF) zu beschreiben. Im einfachsten Fall sind nur die Grammatiken des Dialogs aktiv. In komplexeren Fällen können noch andere Grammatiken aktiv sein:

Ein Subdialog ist wie ein Funktionsaufruf: Er erlaubt Ihnen, zu einem neuen Dialog »herauszurufen« und kehrt dann zum Originaldialog zurück, wobei er die lokale Zustandsinformation speichert. Subdialoge können dazu verwendet werden, Bestätigungen zu verarbeiten oder um eine Bibliothek von wiederverwendbaren Dialogen für verbreitete Aufgaben zu erstellen.

Vererbungsmodell zum Abfangen von Ereignissen.

VoiceXML gestattet, Variablen zu definieren, um Daten vorzuhalten. Diese können auf jeder Ebene spezifiziert werden, und ihr Anwendungsbereich folgt einem Vererbungsmodell. Sie können die Werte von Variablen abfragen, um herauszufinden, in welchen Dialogzustand als nächstes zu wechseln ist. Variablenausdrücke können auch für konditionale Eingabaufforderungen, Grammatiken &c. verwendet werden.

Ereignisse werden erzeugt, wenn der Benutzer auf eine Eingabeaufforderung nicht antwortet oder die Eingabe nicht verstanden wird. VoiceXML erlaubt es, sogenannte »Handler« zu schreiben, um solche Ereignisse abzufangen. Diese folgen einem Vererbungsmodell, und Ereignisse können auf einer höheren Ebene gefangen werden, wenn auf der Dialogebene kein entsprechender Handler vorhanden ist.

VoiceXML gestattet es, Scripting (ECMAScript) zu gebrauchen, wenn Sie zusätzliche Kontrolle über die Anwendung benötigen. VoiceXML wendet eine »formularfüllende Metapher« an – Sie können eine komplexe Grammatik definieren, um die Werte von verschiedenen Feldern in einer einzelnen Antwort zusammenzuführen. Jedes unausgefüllte Feld kann durch spezielle Subdialoge, die inline in den einzelnen Dialogen definiert werden, gehandhabt werden.

VoiceXML-Beispiele

Hier ist eine einfache VoiceXML-Anwendung. Sie sagt »Willkommen zum Reiseplaner!«, spielt einen kurzen Werbejingle und endet dann:

<?xml version="1.0" encoding="iso-8859-1"?>
<vxml version="2.0" xml:lang="de">
  <form>
    <block>
     <prompt bargein="false">
       Willkommen zum Reiseplaner!
       <audio src="https://example.com/mobile?code=12s4" />
     </prompt>
   </block>
  </form>
</vxml>

Das folgende Beispiel bietet ein Menü mit drei Optionen: »Sport«, »Wetter« und »Nachrichten«.

<?xml version="1.0"?>
<vxml version="2.0">
  <menu>
    <prompt>
      Bitte wählen Sie aus: <enumerate />
    </prompt>
    <choice next="http://sports.example.com/start.vxml">
      Sport
    </choice>
    <choice next="http://weather.example.com/intro.vxml">
      Wetter
    </choice>
    <choice next="http://news.example.com/news.vxml">
      Nachrichten
    </choice>
    <noinput>Bitte wählen Sie ein Thema aus: <enumerate /></noinput>
  </menu>
</vxml>

Dieser Dialog könnte wie folgt weitergehen:

Computer: Bitte wählen Sie aus: Sport; Wetter; Nachrichten.
Mensch: Astrologie
Computer: Ich habe nicht verstanden, was Sie gesagt haben.
(eine plattform-spezifische Standardmeldung)
Computer: Bitte wählen Sie aus: Sport; Wetter; Nachrichten.
Mensch: Sport
Computer: (geht weiter zu http://sports.example.com/start.vxml)

Es folgt ein weiteres Beispiel, diesmal mit einem Formular, das den Benutzer bittet, eine Stadt sowie eine Anzahl von Reisenden zu wählen. Sobald diese Informationen gesammelt sind, werden sie an einen Webserver übermittelt:

<?xml version="1.0" encoding="iso-8859-1"?>
<vxml version="2.0" xml:lang="de">
  <form>
    <field name="city">
      <prompt>
        Wohin wollen Sie reisen?
      </prompt>
      <option>Edinburgh</option>
      <option>New York</option>
      <option>London</option>
      <option>Paris</option>
      <option>Stockholm</option>
    </field>
    <field name="travellers" type="number">
      <prompt>
        Wie viele Personen reisen nach <value expr="city" />?
      </prompt>
    </field>
    <block>
      <submit next="https://example.com/handler" namelist="city travellers" />
    </block>
  </form>
</vxml>

VoiceXML ermöglicht es Ihnen, nach und nach detailliertere Eingabeaufforderungen auszugeben, wenn der Benutzer Schwierigkeiten hat, zu antworten. Dies basiert auf einem Zähler, der bei jedem Durchlauf hochgesetzt wird. Das folgende Beispiel veranschaulicht dies für das Feld, das die Anzahl der Reisenden festhalten soll. Der Benutzer wird anfangs gefragt: »Wie viele Personen reisen nach Paris?« Wenn auf diese Frage keine zufriedenstellende Antwort folgt, wird der Benutzer gebeten: »Bitte nennen Sie mir die Anzahl der Reisenden.« Das nomatch-Element bietet eine Art »Mahnung«, wenn der Benutzer etwas anderes als eine Zahl gesagt hat:

<field name="travellers" type="number">
  <prompt count="1">
    Wie viele Personen reisen nach <value expr="city" />?
  </prompt>
  <prompt count="2">
    Bitte nennen Sie mir die Anzahl der Reisenden.
  </prompt>
  <prompt count="3">
    Sie müssen die Anzahl der Reisenden nennen, wenn Sie
    einen Flug nach <value expr="city" /> buchen wollen.
  </prompt>
  <nomatch>
    <prompt>
      Bitte nennen Sie eine Zahl.
    </prompt>
    <reprompt />
  </nomatch>
</field>

Hier ist ein Beispiel, das den Wert eines Feldes prüft, nachdem es gefüllt wurde. In diesem Fall wird das dazu verwendet, um eine Warnung auszugeben, wenn die Anzahl der Reisenden in der Gruppe größer als 12 ist:

<field name="travellers" type="number">
  <prompt count="1">
    Wie viele Personen reisen nach <value expr="city" />?
  </prompt>
  <filled>
    <var name="num_travellers" expr="travellers + 0" />
    <if cond="num_travellers > 12">
      <prompt>
        Verzeihen Sie, wir nehmen nur Gruppen von bis zu 12 Personen an.
      </prompt>
      <clear namelist="travellers" />
    </if>
  </filled>
</field>

VoiceXML erlaubt es, Subdialoge zu definieren, die für häufige Aufgaben verwendet werden können. Subdialoge sind analog zu Subroutinen in Programmiersprachen. Es folgt ein Beispiel für einen Bestätigungssubdialog, in dem zur Bestätigung gefragt wird, ob eine vorherige Eingabe akzeptiert wird oder nicht:

<form id="ynconfirm">
  <var name="user_input" />
  <field name="yn" type="boolean">
    <prompt>
      Haben Sie <value expr="user_input" /> gesagt?
    </prompt>
    <filled>
      <var name="result" expr="'false'" />
      <if cond="yn">
        <assign name="result" expr="'true'" />
      </if>
      <return namelist="result" />
    </filled>
  </field>
</form>

Wenn die Spracherkennung anzeigt, dass sie nicht sicher ist, was der Benutzer gesagt hat, ermöglicht VoiceXML, den Dialog entsprechend zuzuschneiden. Im folgenden Beispiel wird der Benutzer um Bestätigung gebeten, wenn die geschätzte Erkennungsgenauigkeit kleiner als 0,7 ist, und darum, den Namen der Stadt zu wiederholen, wenn sie unter 0,3 liegt:

<field name="city">
  <prompt>
    Welche Stadt?
  </prompt>
  <!-- … -->
  <filled>
    <if cond="city$.confidence < 0.3">
      <prompt>
        Verzeihung, ich habe das nicht genau verstanden.
      </prompt>
      <clear namelist="city" />
      <elseif cond="city$.confidence < 0.7" />
      <assign name="utterance" expr="city$.utterance" />
      <goto nextitem="confirmcity" />
    </if>
  </filled>
</field>
<subdialog name="confirmcity" src="#ynconfirm" cond="false">
  <param name="user_input" expr="utterance" />
  <filled>
    <if cond="confirmcity.result=='false'">
      <clear namelist="city" />
    </if>
  </filled>
</subdialog>

Wenn die Erkennungsgenauigkeit niedriger als 0,3 ist, wird dem Benutzer ein »Verzeihung, ich habe das nicht genau verstanden« ausgegeben, und er wird daraufhin nochmal um den Namen der Stadt gebeten. Wenn sie niedriger als 0,7 ist, wird der generische Bestätigungssubdialog aufgerufen. Das subdialog-Element verhält sich wie ein Subroutinenaufruf. Das param-Element wird verwendet, um Daten in den Subdialog zu weiterzureichen.

Sie können auch Grammatiken aus separaten Dateien verwenden. Das nächste Beispiel macht Verwendung von Grammatiken aus der trade.xml:

<form name="trader">
  <field name="company">
    <prompt>
      Mit welcher Firma wollen Sie handeln?
    </prompt>
    <grammar src="trade.xml#company" type="application/grammar+xml" />
  </field>
  <field name="action">
    <prompt>
      Wollen Sie Anteile an <value expr="company" /> kaufen oder verkaufen?
    </prompt>
    <grammar src="trade.xml#action" type="application/grammar+xml" />
  </field>
</form>

Sie können das import-Element verwenden, um Grammatikregeln zu importieren, so dass Sie sich auf diese in lokal definierten Grammatiken beziehen können. Im folgenden Beispiel wird vorausgesetzt, dass die Datei politeness.xml Regeln definiert, die startPolite (zum Beispiel »Bitte«) und endPolite (zum Beispiel »Danke«) lauten:

<grammar xml:lang="de">
  <import uri="https://example.com/politeness.xml" name="polite" />
  <rule name="command" scope="public">
    <ruleref import="polite#startPolite" />
    <ruleref uri="#action" />
    <ruleref uri="#object" />
    <ruleref import="polite#endPolite" />
  </rule>
  <rule name="action" scope="public">
    <choice>
      <item tag="buy">
        Kauf
      </item>
      <item tag="sell">
        Verkauf
      </item>
    </choice>
  </rule>
  <rule name="company" scope="public">
    <choice>
      <item tag="ericsson">
        Ericsson
      </item>
      <item tag="nokia">
        Nokia
      </item>
    </choice>
  </rule>
</grammar>

In dem folgenden Beispiel einer Aktienhandelsanwendung kann der Benutzer über eine kurze Formulierung à la »Kauf Ericsson«, die sowohl die Firma als auch die Art des Handels (Kauf oder Verkauf) bestimmt, antworten. Die Grammatik für diesen Fall ist in der Datei trade.xml hinterlegt. Wenn der Benutzer nicht adäquat antwortet, bemüht sich die Anwendung um ein einfacheres Vorgehen und verlangt erst den Firmennamen und dann die Art des Handels. Die field-Elemente werden übersprungen, wenn der Wert des entsprechenden Feldes bereits ausgefüllt wurde.

<form name="trader">
  <grammar src="trade.xml#command" type="application/grammar+xml" />
  <initial name="start">
    <prompt>
      Welchen Handel wollen Sie durchführen?
    </prompt>
    <nomatch count="1">
      <prompt>
        Bitte sagen Sie etwas wie »Kauf Ericsson«.
      </prompt>
      <reprompt />
    </nomatch>
    <nomatch count="2">
      <prompt>
        Verzeihung, ich habe Ihre Anfrage nicht verstanden.
        Versuchen wir es einfacher.
      </prompt>
      <assign name="start" expr="true" />
    </nomatch>
  </initial>
  <field name="company">
    <!-- … -->
  </field>
  <field name="action">
    <!-- … -->
  </field>
</form>

Die Anwendung kann dem Benutzer die Möglichkeit geben, zu einer anderen Aufgabe zu wechseln, indem das entsprechende Kommando gesprochen wird. Die Grammatik dafür kann auf Dokumentebene oder im Anwendungshauptdokument spezifiziert werden. Hier ist ein Beispiel für ein Befehlsmenü auf Dokumentebene:

<?xml version="1.0" encoding="iso-8859-1"?>
<vxml version="2.0" xml:lang="de">
  <form name="trader">
    <!-- … -->
  </form>
  <menu name="portal-commands" scope="document">
    <choice expr="http://example.com?action=car">Autovermietung</choice>
    <choice expr="http://example.com?action=hotel">Hotelreservierung</choice>
    <choice expr="http://example.com?action=news">Nachrichten</choice>
  </menu>
  <!-- … -->
</vxml>

Um das Anwendungshauptdokument zu referenzieren, verwenden Sie das application-Attribut des vxml-Elements:

<?xml version="1.0" encoding="iso-8859-1"?>
<vxml version="2.0" xml:lang="en"
  application="https://example.com/portal?sessionID=12d4rf65hg4">
  <!-- … -->
</vxml>

Hier ist ein Beispiel für ein Hauptdokument, das einen Befehl zur Rückkehr auf die Portalstartseite zur Verfügung stellt. Das Beispiel beinhaltet auch einen Handler, um noinput-Ereignisse abzufangen, für den Fall, dass diese nicht von Handlern auf unteren Ebenen (zum Beispiel in den einzelnen Dialogen) abgefangen werden.

<form name="portal-commands" scope="document">
  <field name="action">
    <grammar src="https://example.com/portal/commands.xml"
      type="application/grammar+xml" />
  </field>
  <block>
    <submit next="https://example.com/" />
  </block>
</form>
<var name="portal-help"
  expr="Sagen Sie »Startseite« oder drücken Sie die 0, um
    auf die Portalstartseite zurückzukehren." />
<catch event="noinput">
  <prompt>
    Verzeihung, ich habe nichts gehört.
  </prompt>
</catch>

Weiterführende Literatur

Die W3C-Empfehlung VoiceXML 2.0 ist die offizielle Spezifikation von VoiceXML. Beachten Sie bitte die W3C Voice Browser Activity für weitere Informationen über das W3C Speech Interface Framework und verwandte Spezifikationen. W3C-Mitglieder können auf die jüngsten, derzeit in Entwicklung befindlichen Spezifikationen der Sprach-Browser-Arbeitsgruppe zugreifen. Weitere Anleitungen sowie eine Menge anderer nützlicher Verweise können auf der Website des VoiceXML-Forums gefunden werden.

Ich plane, weitere Abschnitte über Sprachgrammatiken und -synthese sowie Kommentare zur Arbeit des W3C an multimodalen und anderen Themengebieten zu ergänzen.

Dave Raggett <dsr@w3.org>