Auf Interactive Voice Response Systeme (IVR) trifft man heute bei vielen Einrichtungen. IVRs sind automatisierte Dialogsysteme, die einem Anrufer bestimmte Informationsangebote oder andere Leistungen in Dialogform anbieten. Das grundlegende Prinzip ist bei fast allen Systemen gleich, dem Anrufer wird ein Menü vorgelesen, aus dem er dann durch bestimmte Aktionen (meist das Drücken einer Taste auf dem Telefon) einzelne auswählen kann. So kann man über solche Systeme die aktuellen Börsenkurse oder auch Abfahrtzeiten von Zügen der Deutschen Bahn abfragen. Es gibt sogar Systeme, die Buchungen von Veranstaltungstickets ermöglichen. Die Dialogsysteme unterscheiden sich hierbei in dem Grad der Automation. Voll automatisierte Systeme generieren die Sprachansagen (Text2Speech) und verfügen über eine maschinelle Spracherkennung, um die Benutzereingaben zu erkennen. Solche Systeme bieten einen sehr hohen Komfort, sind jedoch technisch derart anspruchsvoll, dass sie selten zum Einsatz kommen. Die einfachste Variante ist zugleich die verbreitetste. Vorher aufgenommene Textnachrichten (Soundfiles) werden abgespielt und die Nutzereingaben erfolgen durch Drücken der Telefontasten, deren charakteristische Frequenz einfach und robust erkannt werden kann. Diese Form des Dialogsystems bietet Asterisk standardmäßig an, mit ein wenig Aufwand können sogar die Ansagen per Sprachsynthesemodule erzeugt werden. Die Meinungen über IVRs gehen zum Teil deutlich auseinander, die einen empfinden sie als nützliche Hilfe, andere wiederum ärgern sich darüber. Oft bieten sie dabei immer wieder Stoff für reichlich Lacher. Meistens liegt das an ungeschickten Menüführungen oder bei Systemen mit einer maschinellen Spracherkennung an einer schlechten Erkennungsrate. Eine gut funktionierende IVR kann dem Kunden eine echte Hilfe sein, aber eine schlecht umgesetzte kann einen Kunden auch abschrecken. Deshalb sollte man dieses Mittel mit Bedacht einsetzen und sich Zeit für eine sorgfältig geplante und sauber integrierte Lösung nehmen. Häufiges Überprüfen der Zahl der vorzeitigen Abbrüche durch Auflegen sollte dabei zu den Routineaufgaben gehören. Und -- IVRs sind weder ein Selbstzweck noch ein Allheilmittel -- denken Sie an Ihre Kunden!
Bei den Standardsprachbausteinen gibt es eine Datei
marryme.gsm
, die den Text "Will you marry me? Press 1
for yes or 2 for no."[111] enthält. Um hiermit eine Heiratsantrags-IVR zu realisieren,
reicht folgender Dialplan.[112]
exten => 10,1,Answer() exten => 10,2,Background(marryme) exten => 10,3,Hangup() exten => 1,1,Playback(thank-you-cooperation) exten => 1,2,Hangup() exten => 2,1,Playback(sorry) exten => 2,2,Hangup()
Wird die 10 angerufen, hebt Asterisk
ab und spielt das Soundfile marryme.gsm
ab. Während
der Ansage kann jederzeit vom Benutzer eine Eingabe gemacht werden. Diese
Eingabe wird als weitere Extension gewertet und abgerufen. Wer also die 1
drückt, bekommt die Ansage "Thank you for your cooperation." abgespielt.
Danach legt Asterisk auf.
Mit der Applikation Playback() können Soundfiles nur abgespielt werden, jegliche Eingabe während des Abspielens wird nicht beachtet. Background() hingegen spielt die Datei ab und wartet während des Abspielens auf eine Eingabe. Diese wird dann als Extension interpretiert.
Damit Asterisk zwischen den Eingaben 2, 22 und 2200 unterschieden
kann, wartet Background() nach jeder Eingabe
eine bestimmte Zeit. Ist diese Zeit (TIMEOUT
)
abgelaufen, so gilt die Eingabe als beendet.
Tipp | |
---|---|
Mit |
Den TIMEOUT
kann man in Sekunden angeben
und wie folgt im Dialplan setzen:
exten => 10,1,Set(TIMEOUT(digit)=3)
Eine Falscheingabe (also eine nicht im Dialplan definierte
Eingabe) kann mit der i
-Extension (i wie invalid)
abgefangen werden. Das einfache Beispiel würde folgendermaßen
aussehen:
exten => 10,1,Answer() exten => 10,2,Background(marryme) exten => 10,3,Hangup() exten => 1,1,Playback(thank-you-cooperation) exten => 1,2,Hangup() exten => 2,1,Playback(sorry) exten => 2,2,Hangup() ; Bei allen anderen Eingaben wird diese ; i-Extension aufgerufen. exten => i,1,Background(sorry) exten => i,2,Hangup()
Die einfachste Möglichkeit, kurze Pausen für die Eingabe zu
realisieren, ist das Abspielen von Soundfiles ohne Inhalt. Im
Verzeichnis /var/lib/asterisk/sounds/silence/
gibt
es 1 bis 9 Sekunden lange Dateien, die nur Stille abspielen. Soll in
unserem Heiratsantragsbeispiel noch 5 Sekunden auf eine Antwort gewartet
werden, so kann man das wie folgt erreichen:
exten => 10,1,Answer() exten => 10,2,Background(marryme) exten => 10,3,Background(silence/5) exten => 10,4,Hangup() exten => 1,1,Playback(thank-you-cooperation) exten => 1,2,Hangup() exten => 2,1,Playback(sorry) exten => 2,2,Hangup() exten => i,1,Background(marryme) exten => i,2,Hangup()
Das Problem bei mehrstufigen IVRs ist, dass der Benutzer je nach
Menüstruktur mehrmals eine einstellige Zahl (evtl. sogar die gleiche)
drücken soll, aber jeweils ein anderes Ergebnis erhält oder eine andere
Aktion erfolgt. Da innerhalb eines Contextes eine Zahl aber nur einmal
vergeben werden kann, bliebe der Anrufer immer auf dieser Menüebene
hängen. Sollen mehrere Menüs hintereinander geschaltet werden und in jedem
Menü gleiche Eingaben andere Ergebnisse bringen, so muss man diese
Untermenüs in andere Contexte (in unserem Beispiel [kantine]
)
legen. Der Sprung zwischen den einzelnen Positionen erfolgt mit
Goto(). Nehmen wir an, Sie haben folgende
Soundfiles im Verzeichnis /var/lib/asterisk/sounds/
abgespeichert:
grundmenue.gsm
Bitte drücken Sie die 1 für den Verkauf, die 2 für den Hausmeister und die 3 für die Kantine.
kantine.gsm
Drücken Sie die 1 für den Essensplan dieser Woche und die 2 für den Essensplan der nächsten Woche.
essensplan-diese-woche.gsm
Montag gibt es Nudeln mit Tomatensoße, Dienstag gibt es Jägerschnitzel, ...
essensplan-naechste-woche.gsm
Montag gibt es Eintopf, Dienstag gibt es Jägerschnitzel, ...
Wenn der Verkauf unter der Extension 100 und der Hausmeister unter der Extension 150 erreichbar ist, sieht der Dialplan für diese IVR folgendermaßen aus:
[beispiel-ivr] ; Das Menue wird staendig wiederholt. ; exten => 30,1,Answer() exten => 30,2,Background(grundmenue) exten => 30,3,Background(silence/3) exten => 30,4,Goto(2) exten => 1,1,Dial(SIP/100) exten => 2,1,Dial(SIP/150) ; Goto() springt in einen anderen ; Context ([kantine]) ; exten => 3,1,Goto(kantine,100,1) exten => i,1,Goto(30,2) [kantine] exten => 100,1,Background(kantine) exten => 100,2,Background(silence/3) exten => 100,3,Goto(1) exten => 1,1,Playback(essensplan-diese-woche) exten => 1,2,Wait(2) exten => 1,3,Goto(1) exten => 2,1,Playback(essensplan-naechste-woche) exten => 2,2,Wait(2) exten => 2,3,Goto(1) ; Bei einer Falscheingabe wird ; wieder in das Start-Menue ; gesprungen. ; exten => i,1,Goto(beispiel-ivr,30,2)
Text2Speech beschreibt die Umwandlung von geschriebenem Text in gesprochenen Text (Sprachsynthese) auf Computersystemen. Auf unserem Asterisk-System bedeutet das, dass ein Programm anhand einer Textdatei (meist in ASCII) eine entsprechende Audiodatei (Soundfile) erzeugt. Diese kann wie jede andere Multimediadatei abgespielt werden und man hört den Text dann gesprochen. Wie bei vielen Software-Projekten wird die englische Sprache meist besser unterstützt als die deutsche.
Darüber hinaus gibt es große Qualitätsunterschiede zwischen den offenen und freien (meist GPL) Engines und entsprechenden kommerziellen Lösungen.
Tipp | |
---|---|
Einen kostenlosen Test einer qualitativ sehr guten Engine kann man online bei IBM unter http://www.ibm.com/software/pervasive/tech/demos/tts.shtml machen. |
Das Speech Synthesis System Festival (http://www.cstr.ed.ac.uk/projects/festival/) eignet sich gerade noch so für englischen Text, aber spätestens bei deutschen Texten lässt die Qualität sehr zu wünschen übrig. Als guten Kompromiss kann man die Software der amerikanischen Firma Cepstral (http://www.cepstral.com/) nehmen. Es gibt dort eine kostenlose Probeversion und eine recht günstige Vollversion. [113]Die hier vorgestellte Lösung baut auf der Cepstral Engine auf.[114]
Warnung | |
---|---|
Cepstral und Festival sind beides keine qualitativ hochwertigen Text-to-Speech-Engines! Leider gibt es in diesem Feld nur im Hochpreissegment wirklich gute Lösungen. |
Auf der Webseite http://www.cepstral.com/downloads/
kann man die deutsche Sprach-Engine herunterladen (evtl. auf den Link
''Additional Voices'' klicken). Die entsprechende Datei (hier
beispielhaft immer als
Cepstral_Matthias_i386-linux_4.1.2.tar.gz
bezeichnet) wird wie folgt installiert:
tar xvzf Cepstral_Matthias_i386-linux_4.1.2.tar.gz cd Cepstral_Matthias_i386-linux_4.1.2 ./install
Falls bei der Installation nicht anders angegeben, wird die Engine
als /opt/swift/bin/swift
installiert. Testen kann
man dies mit folgender Eingabe auf der Linux-Kommandozeile:
/opt/swift/bin/swift -o /tmp/test.wav -p audio/sampling-rate=8000,audio/channels=1 "Dies ist ein Test."
Das
Ergebnis kann man sich entweder mit einem Audioplayer oder mit Asterisk
anhören. Dazu einfach in der extensions.conf
folgenden Eintrag hinzufügen:
exten => 1234,1,Answer() exten => 1234,2,Playback(/tmp/test) exten => 1234,3,Hangup()
Um einen beliebigen Text ausgeben zu lassen, benutzen wir die System()-Applikation im Dialplan. Hier ein Beispiel:
exten => 1222,1,Answer() exten => 1222,2,System(rm -rf /tmp/test.wav) exten => 1222,3,System(/opt/swift/bin/swift -o /tmp/test.wav -p audio/sampling-rate=8000,audio/channels=1 "Noch ein Test.") exten => 1222,4,Playback(/tmp/test) exten => 1222,5,Hangup()
Cepstral benutzt SSML (Speech Synthesis Markup Language) innerhalb der Engine. So kann eine Pause im obigen Beispiel wie folgt eingefügt werden:
exten => 1222,1,Answer() exten => 1222,2,System(rm -rf /tmp/test.wav) exten => 1222,3,System(/opt/swift/bin/swift -o /tmp/test.wav -p audio/sampling-rate=8000,audio/channels=1 "Noch ein Test. <break time='2500ms'/> Ende!") exten => 1222,4,Playback(/tmp/test.wav) exten => 1222,5,Hangup()
Information zu SSML findet man beim W3C unter http://www.w3.org/TR/speech-synthesis/.
[111] Übersetzung: Möchtest Du mich heiraten? Drücke 1 für ja und 2 für nein.
[112] Es sollte auch dem größten Geek unter den Lesern klar sein, dass eine solche IVR nur als Beispiel und niemals als reale Möglichkeit eines Heiratsantrages in Betracht gezogen werden sollte! ;-)
[113] Auch hier gibt es eine Online-Testversion unter http://www.cepstral.com/demos/.
[114] Wer sich ein wenig mit Festival beschäftigt, kann die hier gezeigten Beispiele leicht auf Festival übertragen. Dies gilt in gleicher Weise auch für jede andere Text-to-Speech-Engine.
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