Kapitel 20. Asterisk und VoiceXML

VoiceXML ist eine auf XML basierende Auszeichnungssprache für die Implementierung interaktiver Sprachdialoge.

[Tipp]Tipp

VoiceXML ist ein W3C-Standard. Aktuell ist Version 2.0 und Sie können die Spezifikation unter folgender Adresse nachlesen: http://www.w3.org/TR/voicexml20/. Auf Ken Rehors Webseite World of VoiceXML (http://www.kenrehor.com/voicexml/) sind die wichtigsten Links zum Thema VoiceXML zusammengefasst.

Die zugrunde liegende Hardware soll dabei für den Anwendungsprogrammierer verborgen bleiben (Plattformunabhängigkeit), so dass er sich voll und ganz auf das Design der eigentlichen Sprachapplikation konzentrieren kann. Um sich eine Vorstellung von der Funktionsweise von VoiceXML zu machen, ist es hilfreich, sie mit anderen Auszeichnungssprachen (markup languages) wie z.B. HTML zu vergleichen:

VoiceXML-Dokumente liegen genau wie HTML-Dokumente auf einem Webserver und werden über das HTTP-Protokoll heruntergeladen. Das Herunterladen erfolgt wie bei HTML durch einen Browser, einen sogenannten Voicebrowser. Dieser Voicebrowser ist aber im Gegensatz zu den hinlänglich bekannten Webbrowsern nicht irgendeine Software, die auf einem Gerät des Endanwenders läuft. Vielmehr handelt es sich um einen leistungsfähigen Computer, der einerseits am Telefonnetz, andererseits am Internet angeschlossen ist. Der Voicebrowser ist sozusagen das Verbindungsglied zwischen der Telefonwelt und der IP-Welt.

Wie ein konventioneller Webbrowser muss auch der Voicebrowser von einem Endanwender bedient werden. Während man aber einen Webbrowser mit den Augen betrachtet und mit Maus und Tastatur steuert, ruft man einen Voicebrowser über ein Telefon an, lauscht seinen Ansagen und steuert ihn durch Sprache bzw. das Drücken der Nummerntasten auf dem Telefon. Der Funktionsumfang eines Voicebrowsers umfasst im Wesentlichen:

  • Entgegennehmen von Anrufen

  • Herunterladen von VoiceXML-Dokumenten

  • Interpretation der VoiceXML-Dokumente

  • Sprachsynthese (TTS - Text-to-Speech)

  • Automatische Spracherkennung (ASR - Automatic speech recognition)

  • Erkennung von DTMF-Eingaben (Dual Tone Multi Frequency)

  • Navigation zu weiteren VoiceXML-Dokumenten

  • Aufnehmen von Nachrichten des Anrufers

  • Weitervermittlung des Anrufs

Bei näherer Betrachtung der Liste fällt auf, dass es sich hierbei um Funktionen handelt, für die Asterisk eigentlich prädestiniert wäre.

[Warnung]Warnung

Zur Zeit der Drucklegung dieses Buches gibt es leider noch kein fertiges VoiceXML Add-On für Asterisk. Wer sich bis dahin schon einmal mit dem Thema VoiceXML auseinandersetzen will, der sei an dieser Stelle auf das Hastenix-AGI-Skript von http://hastenix.hawhaw.de/ verwiesen.

1. Asterisk und Hastenix

Hastenix steht für Hawhaw Adapter for ASTErisk aNd voIceXml. Das HAWHAW-Toolkit hat eigentlich nichts mit Asterisk zu tun, sondern beschäftigt sich mit der Erstellung von Webapplikationen für mobile Endgeräte. Neben anderen Auszeichnungssprachen wie HTML und WML unterstützt HAWHAW auch die Ausgabe von VoiceXML. Die eigentliche Intention des Hastenix-Skripts ist es, einen Asterisk dahingehend zu erweitern, dass er als Voicebrowser für HAWHAW-Anwendungen eingesetzt werden kann.

Das Skript unterstützt nur einen kleinen Teil des gesamten VoiceXML-Sprachumfangs. Um einen ersten Einblick in die Thematik zu bekommen, ist es aber dennoch hilfreich. Alle Beispiele der folgenden Kapitel wurden mit dem Skript erfolgreich getestet und können als Basis für eigene VoiceXML-Anwendungen auf dem Asterisk dienen. Eine Anleitung zur Installation des Skripts und zur Einbindung in den Asterisk-Dialplan findet sich auf der Webseite http://hastenix.hawhaw.de/.

Systemvoraussetzungen für den Einsatz des Hastenix-Skripts sind:

  • Asterisk 1.2 oder höher

  • Perl 5.8 mit Thread-Support

  • Ein beliebiges TTS-System, z.B. Festival, Cepstral, MBROLA usw.

Um das Hastenix-Skript auf Ihrem Asterisk zu installieren, gehen Sie wie folgt vor:

  1. Laden Sie das Perlskript hastenix.pl von http://www.hawhaw.de/download/hastenix.pl mit wget http://www.hawhaw.de/download/hastenix.pl herunter und speichern Sie es in Ihrem AGI-Verzeichnis (/var/lib/asterisk/agi-bin/) ab.

    big-island:~# cd /var/lib/asterisk/agi-bin/
    big-island:/var/lib/asterisk/agi-bin# wget http://www.hawhaw.de/download/hastenix.pl
    --12:07:40--  http://www.hawhaw.de/download/hastenix.pl
               => `hastenix.pl'
    Resolving www.hawhaw.de... 82.165.68.110
    Connecting to www.hawhaw.de|82.165.68.110|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 23,378 (23K) [text/plain]
    
    100%[====================================>] 23,378        --.--K/s             
    
    12:07:40 (4.55 MB/s) - `hastenix.pl' saved [23378/23378]
    
    big-island:/var/lib/asterisk/agi-bin#
  2. Setzen Sie mit chmod 755 hastenix.pl die Dateirechte, um das Perlskript ausführbar zu machen:

    big-island:/var/lib/asterisk/agi-bin# chmod 755 hastenix.pl 
    big-island:/var/lib/asterisk/agi-bin# 
  3. Passen Sie den Konfigurationsteil am Anfang des Skripts Ihren Systemvoraussetzungen an. Setzen Sie die $DIALOUT-Variable auf Busy, um die Dialout-Funktionalität zu deaktivieren.

  4. Binden Sie das Skript wie folgt in Ihren Dialplan ein:

    ;
    ; Hastenix-Beispiel zur Sprachausgabe mit TTS
    ;
    exten => 4291,1,Answer
    exten => 4291,2,AGI(hastenix.pl|http://hastenix.hawhaw.de/aaw/sprachausgabe.vxml)
    exten => 4291,3,Hangup
  5. Starten Sie Ihren Asterisk im Konsolenmodus mit einem hohen Verbose-Level (mindestens 5):

    asterisk -vvvvvvc

    [Warnung]Warnung

    Wenn Sie sich mit der -r Option wieder auf einen bereits laufenden Asteriskprozess verbinden, werden aufgrund eines Asterisk-Bugs evtl. Fehlermeldungen im Konsolenfenster nicht angezeigt. Sie können aber mit set verbose 5 auch hier den Verbose-Level hochstellen.

  6. Wählen Sie die 4291, beobachten Sie die Ausgaben im Konsolenfenster und lauschen Sie am Telefonhörer.

  7. Installieren Sie evtl. fehlende Perlmodule nach, falls eine entsprechende Fehlermeldung im Konsolenfenster erscheint.

  8. Fertig! Wenn alles klappt, hören Sie einen Begrüßungstext.

2. Sprachausgabe

Beginnen wir mit einem möglichst einfachen VoiceXML-Dokument:

Beispiel 20.1. sprachausgabe.vxml

<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0">
<form>
<block><prompt>Willkommen bei der Apfelmus GmbH<break time="1000ms"/></prompt></block>
<block><prompt>Hier spricht der Asterisk.</prompt></block>
</form>
</vxml>


Die erste Zeile kommt jedem bekannt vor, der sich schon einmal mit XML beschäftigt hat. Sie hat noch nichts mit VoiceXML zu tun, sondern besagt lediglich, dass es sich um ein UTF-8-kodiertes XML-Dokument handelt.

Der zweite Zeile mit dem XML Root-Element kommt dagegen schon zum Thema: Sie sagt dem Voicebrowser, dass es sich um ein VoiceXML-Dokument der Version 2.0 handelt. Man sieht in diesem Element häufig auch diverse Namespace-Attribute. Erforderlich sind diese jedoch nicht und in den hier aufgezeigten Beispielen wollen wir der Einfachheit halber darauf verzichten.

Das <form>-Element wird den einen oder anderen an dieser Stelle vielleicht verwundern. Mit einem Formular, wie man es von HTML kennt, hat es nämlich nicht viel gemeinsam. Wie man im Beispiel sieht, erfolgt hier lediglich eine Ausgabe von Text, ohne dass irgendwelche Daten entgegengenommen oder abgeschickt würden. Wenn man die Analogie zu HTML sucht, entspricht das <form>-Element von VoiceXML eigentlich mehr einem <body>-Element in HTML.

[Tipp]Tipp

Dem interessierten Leser sei an dieser Stelle gesagt, dass es alternativ zu <form> in VoiceXML auch noch ein <menu>-Element gibt. Es handelt sich hierbei um eine Spezialform des <form>-Elements, die uns an dieser Stelle nicht weiter interessieren soll.

Die folgenden Element sind mehr oder weniger selbsterklärend: Innerhalb eines <form>-Elements können mehrere <block>-Elemente enthalten sein. In <block>-Elementen können <prompt>-Elemente stehen, die eine Sprachausgabe über das Text-to-Speech-System des Voicebrowsers bewirken. Ein Voicebrowser, der von einem Webserver das obige Dokument empfangen hat, sagt zuerst "Willkommen bei der Apfelmus GmbH", wartet dann eine Sekunde und sagt dann "Hier spricht der Asterisk".

Text-to-Speech-Systeme für den Asterisk sind mittlerweile in recht guter Qualität verfügbar. Als die am weitesten verbreiteten Produkte sind Festival, MBROLA und Cepstral zu nennen (siehe Abschnitt 3, „Text2Speech (TTS)“).

3. Abspielen von Sounddateien

Wem die Computerstimme eines Text-to-Speech-Systems zu synthetisch klingt, der kann unter Umständen auf das Abspielen vorab aufgenommener Sounddateien ausweichen. Es hängt natürlich stark von der jeweiligen Anwendung ab, ob sich die Sprachausgaben aus einer überschaubaren Anzahl von Sounddateien realisieren lassen oder ob der Einsatz von TTS unvermeidlich ist. Wenn man sich für die Variante mit den Sounddateien entscheidet, bietet VoiceXML folgendes Sprachkonstrukt an:

Beispiel 20.2. sounddatei.vxml

<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0">
<form>
<block><prompt><audio src="demo-thanks.gsm">Vielen Dank!</audio></prompt></block>
</form>
</vxml>


Im Beispiel wird eine wohlbekannte gsm-Datei aus der Asterisk-Demo abgespielt. Man beachte, dass sich sowohl die VoiceXML-Datei als auch die Sounddatei auf einem entfernten Webserver und nicht im lokalen Filesystem des Asterisk befinden. Das <audio>-Element innerhalb des <prompt>-Elements weist den Voicebrowser an, die Datei demo-thanks.gsm zu laden und abzuspielen. Falls aus technischen Problemen ein Abspielen der angegebenen Sounddatei nicht möglich sein sollte, wird der im <audio>-Element vorhandene Text per TTS ausgegeben. Solange jedoch alles klappt, ist dieser Text ohne Bedeutung.

Das Format der Sounddatei spielt aus VoiceXML-Sicht keine Rolle. Der zur Anwendung kommende Voicebrowser muss das Format allerdings unterstützen. Für eine Asterisk-basierte VoiceXML-Lösung bietet sich daher das gsm-Format an. Im einfachsten Fall wird man mit dem record-Kommando einen Text aufnehmen und die erzeugte Datei im Anschluss auf den Webserver hochladen. Wer jedoch auf ein richtig professionelles Auftreten Wert legt, sollte seine Aufnahmen in guter Qualität über ein Tonstudio anfertigen lassen.

Mit dem Hastenix-Skript können Sie dieses Beispiel anhören, wenn Sie Ihren Dialplan wie folgt erweitern und danach die 4292 wählen:

;
; Hastenix-Beispiel zum Abspielen von Sounddateien
;
exten => 4292,1,Answer
exten => 4292,2,AGI(hastenix.pl|http://hastenix.hawhaw.de/aaw/sounddatei.vxml)
exten => 4292,3,Hangup

4. DTMF-Eingabe

Ein wesentlicher Bestandteil von VoiceXML ist das Thema Spracherkennung und die Definition von Grammatiken. Eine Sprachanwendung wird natürlich erst dann interaktiv, wenn der Anrufer durch eigene Eingaben in den Ablauf eingreifen kann. Mit den bisher behandelten Funktionen ließe sich ja gerade einmal eine Ansagemaschine realisieren.

Da der Asterisk mit Bordmitteln jedoch keine Spracherkennung unterstützt , wollen wir auf dieses Thema nicht näher eingehen, sondern uns dem kleinen Bruder der Spracherkennung zuwenden: der DTMF-Erkennung.

Ein DTMF-Signal wird erzeugt, wenn der Anrufer während eines Sprachdialogs eine Taste seines Telefons drückt. In den vorherigen Kapiteln zum Thema Dialplan haben wir gesehen, dass der Asterisk hervorragend mit DTMF-Eingaben während einer Verbindung umgehen kann. Schreiben wir ein rudimentäres Sprachportal der Apfelmus GmbH einmal in VoiceXML-Schreibweise:

Beispiel 20.3. dtmf.vxml

<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0">
<form>
<block><prompt>Willkommen im Sprachportal der Apfelmus GmbH
<break time="300ms"/></prompt></block>
<block><prompt>Für eine Beschreibung unserer neuen Produkte drücken Sie bitte die eins.
  <break time="300ms"/></prompt></block>
<block><prompt>Für allgemeine Informationen über unsere Firma drücken Sie bitte die zwei.
  <break time="300ms"/></prompt></block>
<field><prompt timeout="10s"/><noinput><exit/></noinput></field>
</form>
<link next="products.vxml" dtmf="1"></link>
<link next="info.vvxml" dtmf="2"></link>
</vxml>


Die ersten Zeilen dieses Dokuments kennen Sie bereits. Nach den drei Ansageblöcken kommt aber jetzt ein <field>-Element. Dieses Element signalisiert dem Voicebrowser, dass er jetzt auf eine Eingabe des Benutzers warten soll. Bei dem <noinput>-Element handelt es sich um ein sogenanntes Event, das der Voicebrowser in bestimmten Situationen sendet. In unserem Fall sendet er es dann, wenn 10 Sekunden lang keine Eingabe erfolgte. Das <exit>-Element überträgt die Kontrolle wieder an den Interpreter, was hier nichts anderes heißt, als dass die Verbindung beendet wird.

Nach dem bisher Gesagten würde der Voicebrowser anhand dieses Dokuments 3 Ansagen spielen, 10 Sekunden warten und dann die Verbindung beenden. Wenn da nicht noch die <link>-Elemente am Ende des Dokuments wären! Hier wird nämlich dem Voicebrowser mitgeteilt, was er tun soll, wenn er im Verlauf der Verbindung das Drücken der Taste 1 bzw. 2 erkennt: Er soll in diesem Fall das aktuelle VoiceXML-Dokument verlassen und ein neues VoiceXML-Dokument laden und ausführen.

Erwähnenswert ist noch die Position der <link>-Elemente im Dokument. Je nachdem, wo diese Elemente positioniert sind, entscheidet der Voicebrowser, ob die Erkennung eines DTMF-Tones berücksichtigt werden soll oder nicht. In unserem Beispiel stehen die Links im Context des gesamten Dokuments. Somit muss der Voicebrowser während der gesamten Verbindung ein Ohr darauf haben, ob der Anrufer eine der Tasten 1 bzw. 2 gedrückt hat.

Mit dem Hastenix-Skript können Sie dieses Beispiel interaktiv testen, wenn Sie Ihren Dialplan erneut erweitern und danach die 4293 wählen:

;
; Hastenix-Beispiel zur DTMF-Eingabe
;
exten => 4293,1,Answer
exten => 4293,2,AGI(hastenix.pl|http://hastenix.hawhaw.de/aaw/dtmf.vxml)
exten => 4293,3,Hangup

5. Sprachaufnahme

Im Laufe eines Sprachdialogs möchte man manchmal dem Anrufer die Gelegenheit geben, eine Nachricht zu hinterlassen. Während die Voicemailfunktion des Asterisk aufgenommene Nachrichten im lokalen Filesystem speichert, hat man mit VoiceXML die Möglichkeit, die aufgenommene Spracheingabe auf den Webserver hochzuladen und dort zu verarbeiten.

Erstellen wir also eine Beispielanwendung, bei der der Anrufer aufgefordert wird, eine Nachricht zu hinterlassen und spielen wir ihm danach seine Worte noch einmal vor.

Upload von Sprachaufnahmen zum Webserver

Die Durchführung der Aufnahme und das anschließende Hochladen auf einen entfernten Webserver kann mit folgendem Dokument realisiert werden:

Beispiel 20.4. aufnahme-1.vxml

<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0">
<form>
<record name="aufnahme" beep="true">
<prompt>Bitte hinterlassen Sie Ihre Nachricht nach dem Piepton.</prompt>
<filled>
<submit next="aufnahme-2-vxml.php" enctype="multipart/form-data" method="post" namelist="aufnahme"/>
</filled>
<catch event="connection.disconnect.hangup">
<submit next="aufnahme-2-vxml.php" enctype="multipart/form-data" method="post" namelist="aufnahme"/>
</catch>
</record>
</form>
</vxml>


Das <record>-Element ist wie das <field>-Element ein Eingabeelement innerhalb eines <form>-Elements. Die Angabe eines Namens ist hier notwendig, um die Aufnahme später zum Webserver abschicken zu können und um die empfangenen Daten dort weiterverarbeiten zu können. Darüber hinaus verdienen die folgenden optionalen Attribute Erwähnung:

  • beep (true/false): Wenn dieses Attribut auf "true" gesetzt wird, erzeugt der Voicebrowser einen kurzen Piepton, bevor die Aufnahme beginnt.

  • maxtime: Die Aufnahme endet, wenn der im maxtime-Attribut angegebene Zeitwert überschritten wurde. Zeitwerte müssen in VoiceXML prinzipiell immer mit der richtigen Maßeinheit angegeben werden, z.B. "60s" oder "600ms".

  • finalsilence: Hier kann man angeben, nach wie viel Sekunden Stille die Aufnahme als beendet betrachtet werden soll. Dabei gilt es, einen vernünftigen Mittelwert zu finden. Zu kleine Werte beenden die Aufnahme vielleicht vorzeitig, weil der Anrufer nur mal Luft geholt oder kurz nachgedacht hat. Zu lange Werte spannen die Geduld des Anrufers unnötig auf die Probe, da er nach dem Ende seiner Ansprache keinen Fortschritt wahrnimmt. Die Voicebrowser haben normalerweise einen guten Mittelwert als Defaultwert fest voreingestellt, so dass man dieses Attribut nicht unbedingt setzen muss.[146]

Für das Absenden der Aufnahmedaten werden im obigen Dokument zwei Kriterien definiert:

  1. Der Anrufer sagt nichts mehr oder drückt eine Taste seines Telefons. In diesem Fall kommt das <filled>-Element zum Zug und sendet die aufgenommenen Sprachdaten zum im <submit>-Element angegebenen PHP-Skript.

  2. Der Anrufer legt nach seiner Ansprache auf. Auch in diesem Fall soll die Aufnahme nicht verloren gehen, sondern per <submit> zum Webserver übertragen werden. Man erreicht dies, indem man in einem <catch>-Element das Event "connection.disconnect.hangup" abfängt, welches die VoiceXML-Plattform aussendet, sobald sie das Auflegen des Anrufers erkannt hat.

Man sieht, dass die <submit>-Anweisung für beide Fälle völlig identisch ist. Im next-Attribut wird das empfangende Skript angegeben. Die Sendemethode sollte bei Aufnahmen immer "post", der encoding type immer "multipart/form-data" lauten. Im namelist-Atttribut ist genau der Name einzutragen, der innerhalb des <record>-Elements im name-Attribut angegeben wurde.

Verarbeitung von Sprachaufnahmen auf dem Webserver

Wir haben im letzten Kapitel gesehen, dass die Sprachaufnahme mit der HTTP-Post-Methode an ein Skript namens aufnahme-2-vxml.php gesendet wird. Dieses Vorgehen ist vergleichbar mit dem Hochladen einer Datei vom Webbrowser aus. In beiden Fällen muss der Webserver Aktionen einleiten, um die empfangenen Daten zu verarbeiten. Dies kann auf unterschiedlichste Arten geschehen, je nachdem, welche serverseitige Technologie zum Einsatz kommt. In unserem Beispiel verwenden wir ein kleines PHP-Skript:

Beispiel 20.5. aufnahme-2-vxml.php

<?php
  echo '<?xml version="1.0" encoding="UTF-8"?>';

  $filename = $_FILES['aufnahme']['name'];
  move_uploaded_file($_FILES['aufnahme']['tmp_name'],
                     "./aufnahmen/" . $filename);
?>

<vxml version="2.0">
<form>
<block><prompt>Ihre Nachricht war:<break time="300ms"/></prompt></block>
<block><prompt>
<audio src="./aufnahmen/<?php echo $filename; ?>"></audio>
<break time="300ms"/>
</prompt></block>
</form>
</vxml>


Das Beispielskript speichert die empfangene Sounddatei im Pfad aufnahmen ab. Alternativ könnte man die Aufnahme natürlich auch in einer Datenbank abspeichern oder als E-Mail versenden. Bei der obigen Variante sollte man allerdings darauf achten, dass der Webserver die erforderlichen Zugriffsrechte hat, um in das aufnahmen-Verzeichnis zu schreiben.

Damit der Anrufer seine aufgenommenen Worte hören kann, sendet der Webserver ein passendes VoiceXML-Dokument zurück. Der Aufbau dieses Dokuments mit dem <audio>-Element wurde schon im Kapitel "Abspielen von Sounddateien" behandelt.

Mit dem Hastenix-Skript können Sie dieses Beispiel interaktiv testen, indem Sie Ihren Dialplan einmal mehr erweitern und die 4294 wählen:

;
; Hastenix-Beispiel zur Sprachaufnahme
;
exten => 4294,1,Answer
exten => 4294,2,AGI(hastenix.pl|http://hastenix.hawhaw.de/aaw/aufnahme-1.vxml)
exten => 4294,3,Hangup
[Anmerkung]Anmerkung

Bevor Sie während des Tests eventuell unüberlegte Äußerungen machen: Seien Sie sich bewusst, dass Ihre Worte auf den HAWHAW-Server übertragen und dort wie oben beschrieben abgespeichert werden!

6. Anrufweiterleitung

Erinnern wir uns an das Kapitel zum Voicemailsystem des Asterisk und an die Einrichtung der verschiedenen Mailboxen für die Familie Meier. Nehmen wir einmal an, der Asterisk der Familie Meier wäre nur über eine Nummer von außen erreichbar, und die Mitglieder der Familie Meier würden ein interaktives Anrufverteilsystem einsetzen wollen. Das folgende Beispiel zeigt, wie so etwas mit VoiceXML realisiert werden könnte:

Beispiel 20.6. weiterleitung.vxml

<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0">
<form>
<block><prompt>Hier ist der Telefonanschluss der Familie Meier.<break time="300ms"/></prompt></block>
<block><prompt>Druecken Sie die 1, um mit Horst Meier verbunden zu werden.<break time="300ms"/></prompt></block>
<block><prompt>Druecken Sie die 2, um mit Eva Meier verbunden zu werden.<break time="300ms"/></prompt></block>
<block><prompt>Druecken Sie die 3, um mit Peter Meier verbunden zu werden.<break time="300ms"/></prompt></block>
<block><prompt>Oder druecken Sie die 4, um mit Lisa Meier verbunden zu werden.<break time="300ms"/></prompt></block>
<field><prompt timeout="10s"/><noinput><exit/></noinput></field>
</form>
<link next="#transfer1" dtmf="1"></link>
<form id="transfer1">Man 
<transfer dest="tel:200" bridge="false" />
</form>
<link next="#transfer2" dtmf="2"></link>
<form id="transfer2">
<transfer dest="tel:201" bridge="false" />
</form>
<link next="#transfer3" dtmf="3"></link>
<form id="transfer3">
<transfer dest="tel:202" bridge="false" />
</form>
<link next="#transfer4" dtmf="4"></link>
<form id="transfer4">
<transfer dest="tel:203" bridge="false" />
</form>
</vxml>


Am Anfang des Dokuments gibt der Voicebrowser Instruktionen an den Anrufer, was dieser zu tun hat, um seinen gewünschten Gesprächspartner zu erreichen. Das <field>-Element, das nach 10 Sekunden Untätigkeit die Verbindung beendet, kennen wir bereits aus dem Kapitel zur DTMF-Eingabe.

Auch das <link>-Element haben wir dort kennengelernt. Allerdings ist hier die Syntax nun ein klein wenig anders. Der Unterschied liegt im #-Zeichen. Ein next-Attribut ohne # bewirkt das Laden eines neuen VoiceXML-Dokuments, während bei einem next-Attribut mit # ein anderer Dialogabschnitt innerhalb desselben Dokuments angesprungen wird. Kommt Ihnen das irgendwie bekannt vor? Bei HTML-Dokumenten gibt es beim <a>-Element eine ähnliche Logik!

Wie man in diesem Beispiel sieht, können durchaus mehrere <form>-Elemente in einem VoiceXML-Dokument existieren. Sie werden durch eine eindeutige ID unterschieden und über die DTMF-getriggerten <link>-Elemente angesprungen. Die genaue Position der <link>-Elemente im Dokument ist nur insofern von Bedeutung, als dass sie im Context des <vxml>-Elements stehen und damit permanent aktiv sind. Man hätte die <link>-Elemente aber auch zu einem Linkblock zusammenfassen können, ohne etwas an der Funktionalität zu ändern.

Wenn nun durch das Erkennen eines DTMF-Tons eines der unteren <form>-Elemente erreicht wurde, leitet der Voicebrowser den Anruf an die angegebene Destination weiter. Das dest-Attribut muss gemäß RFC 2806 (URLs for Telephone Calls) http://www.ietf.org/rfc/rfc2806.txt angegeben werden.

Das Attribut bridge="false" bedeutet, dass sich der Voicebrowser nicht weiter um diese Verbindung kümmert, sondern mit der Weiterleitung des Anrufs an die angegebene Nummer seine Schuldigkeit getan hat.

Mit dem Hastenix-Skript können Sie auch dieses Beispiel interaktiv testen. Sie werden aber nur dann erfolgreich weitervermittelt werden, wenn Sie auf Ihrem Asterisk entsprechende interne Teilnehmer mit den Rufnummern 200 bis 203 eingerichtet haben und die $DIALOUT Konfigurationsvariable so gesetzt haben, dass die Ausführung des Dial-Kommandos erlaubt ist.

;
; Hastenix-Beispiel zur Weitervermittlung
;
exten => 4295,1,Answer
exten => 4295,2,AGI(hastenix.pl|http://hastenix.hawhaw.de/aaw/weiterleitung.vxml)
exten => 4295,3,Hangup
[Warnung]Warnung

Beachten Sie, dass es sich bei einem Anruf-Transfer um ein mächtiges, damit aber auch problematisches Feature handelt, das bei sorgloser Anwendung zu großen Unannehmlichkeiten führen kann! Halten Sie sich bitte stets vor Augen, dass mit dem <transfer>-Element ein entfernter Webserver die Kontrolle darüber hat, welche abgehenden Verbindungen ein Voicebrowser aufbaut. Im Hastenix-Skript können Sie jegliche Nutzung des <transfer>-Elements dadurch unterbinden, dass Sie die $DIALOUT-Variable im Konfigurationsteil mit dem Befehl Busy vorbelegen.

7. Fazit

VoiceXML hat das Potential, die Programmierung von Sprachdialogen auf dem Asterisk künftig wesentlich zu vereinfachen. An die Stelle komplizierter und asterisk-proprietärer Dialplansequenzen in der /etc/asterisk/extensions.conf treten standardisierte XML-Dokumente, die auf beliebigen Webservern verteilt werden können.

Komplexe Sprachanwendungen, die sich über viele VoiceXML-Dokumente erstrecken, können leicht von einer Plattform auf eine andere portiert werden, ohne dafür umprogrammiert werden zu müssen.

Das Thema VoiceXML ist recht komplex und erfordert eine intensive Einarbeitung in die zugrunde liegenden Standards. Wer sich unabhängig von einer Asterisk-Implementierung einmal näher mit dem Thema beschäftigen will, der sei auf die umfangreichen Entwicklerprogramme der diversen VoiceXML-Provider verwiesen. Mehrere Firmen bieten kostenlose Developer Accounts zum Testen eigener VoiceXML-Anwendungen an. Namentlich erwähnt seien hier die Firmen Voxeo und Tellme.



[146] Der Anrufer kann die Aufnahme auch durch das Senden eines DTMF-Tons beenden, nur sollte man ihm dies vorher mitteilen.


Version 1.2, November 2002

Neue Version verfügbar

Sie betrachten gerade die alte Version des Buches (Version 1.0). Wir empfehlen Ihnen für Asterisk 1.4 und 1.6 die neue Version des Buches.

Asterisk-Tag 2008

Lernen Sie Mark Spencer (den Erfinder von Asterisk) kennen! Viele Vorträge, Case-Studies und Workshops rund um das Thema VoIP. Asterisk-Tag.org

Das gedruckte Buch

Werbung