Kapitel 11. Interactive Voice Response Systeme (IVR)

Versionsgeschichte
Version Rechtsschreiblektorat23.12.2006

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!

1. Eine einfache IVR

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.

Unterschied zwischen Playback() und Background()

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.

Unterschied zwischen 10 und 1000

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]Tipp

Mit TIMEOUT können noch andere Timeouts definiert werden, Informationen dazu bekommen Sie im CLI mit der Eingabe show function TIMEOUT.

Den TIMEOUT kann man in Sekunden angeben und wie folgt im Dialplan setzen:

exten => 10,1,Set(TIMEOUT(digit)=3)

Falscheingaben (die i-Extension)

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()

Pausen

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()

2. Mehrstufige IVR-Systeme

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)

3. Text2Speech (TTS)

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]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]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.

Installation Cepstral Text-to-Speech

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

Beispiele und Tests

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()

Pausen in Texten

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

Das gedruckte Buch

Werbung