1.    Was ist VoiceSPAM ?

Bei VoiceSPAM handelt es sich um die telefonische Variante der bekannten SPAM Mail.




 2.    Das Problem ...

Anfang 2005 erhielt ich die ersten Anrufe von verschiedenen Call Center. Es ging um Telefon und DSL Tarife, dann folgten Versicherungen, Toner Kassetten, Hörgeräte, Zeitungsabonnements, Immobilien … man kann es gar nicht alles aufzählen.

Alle diese Anrufe hatten folgendes gemeinsam : mir sollte irgendeine Ware oder Dienstleistung verkauft werden.

Es handelt sich hier um VoiceSPAM - um die telefonische Variante der bekannten SPAM Mail.

Am Anfang reagierte ich freundlich, dann weniger freundlich und schliesslich abweisend. Es kam der Punkt, da hab ich einfach den Hörer auf die Gabel gelegt, wenn ich am anderen Ende der Leitung die typischen Call Center Geräusche hörte.

Das es für den Call Center Agent ziemlich frustrierend ist, wenn der "Kunde" einfach auflegt und man selbst auch keine wirkliche Freude daran hat, musste eine Lösung für dieses Problem gefunden werden.




 3.    und die Lösung !

Um dem Call Center Agent einen ausgeglichenen Arbeitsalltag zu verschaffen und um eine neue Anwendungsmöglichkeit für die 'Voice over IP' Telefon Nebenstellenanlage mit Namen 'Asterisk' zu schaffen, wurde im August 2005 ein 'VoiceSPAM Human Emulator' entwickelt.

Das ganze gleicht einem erweiterteten Anrufbeantworter. Immer wenn die Software anhand der fehlenden Quell Rufnummer erkennt, dass es sich um einen potentiellen Call Center Anruf handelt, wird der Anruf angenommen und der Call Center Agent bekommt 13 Sekunden einen falschen Rufton vorgespielt. Nach diesen 13 Sekunden meldet sich meine Stimme und sagt freundlich :

'Hallo'

Nun kann der Call Center Agent sprechen. Wenn er mindestens 500 ms spricht und dann mindestens 500 ms Pause macht, antwortet meine Stimme :

'Ich sehe ja gar keine Rufnummer von Ihnen, wer ist denn da, was kann ich für Sie tun ?'

Wieder kann der Call Center Agent sprechen, nach der Sprachpausenerkennung geht es weiter mit :

'Ich denke schon das Sie hier richtig sind, aber was ist der genaue Inhalt Ihres Anrufs ?'

Nach diesen 3 fest aufeinander folgenden Texten folgen 20 Texte in zufälliger Reihenfolge. Alle Texte motivieren den Call Center Agent zu immer besseren Verkaufsargumenten. Der Start der Texte wird durch die schon beschriebene Sprachpausenerkennung gesteuert. Im Idealfall bemerkt der Call Center Agent erst nach längerer Gesprächsdauer die offensichtliche Erfolglosigkeit des Gesprächs. Das ganze Gespräch wird noch, zur späteren Verwendung, aufgezeichnet.

Die erste Version dieser Software ging Anfang September in den Wirkbetrieb. Nach einigen Anpassungen erzielte die Software ganz passable Ergebnisse. An manchen Tagen wurde die Software recht stark frequentiert, das Maximum liegt hier bei 26 VoiceSPAM Anrufen an einem Tag. Mit einer stetigen Verbesserung der Texte stieg auch die Gesprächsdauer pro Anruf, das erreichte Maximum liegt hier bei 11 Minuten.

Als Ausgangspunkt für eigene Texte habe ich hier meine Sprachfiles abgelegt.




 4.    Die Konfiguration ...

Im folgenden wird der für den 'VoiceSPAM Human Emulator' maßgebliche Teil des Konfigurationsfile 'extensions.conf' beschrieben. Es enthält den 'Asterisk' Dialplan.

[from_sip_int]

Der Context 'from_sip_int' ist gültig für ankommende Rufe der internen SIP Nebenstellen. Mit diesen Nebenstellen kann der 'VoiceSPAM Human Emulator' bedient werden.

exten => 26,1,Answer
exten => 26,2,Goto(voicespam,s,1)

Mit Wahl der Extension '26' von einer internen SIP Nebenstelle aus, kann der 'VoiceSPAM Human Emulator' lokal getestet werden. Es wird der Context 'voicespam' angesprungen.

exten => 27,1,Answer
exten => 27,2,Wait(2)
exten => 27,3,Record(/tmp/recording:gsm, 2, 60)
exten => 27,4,Playback(/tmp/recording)
exten => 27,5,Playback(/tmp/recording)
exten => 27,6,Hangup

Mit Wahl der Extension '27' von einer internen SIP Nebenstelle aus, wird ein Sprachfile erzeugt und 2 mal abgespielt. Das Sprachfile wird im Verzeichnis '/tmp' abgelegt und trägt den Namen 'recording'. Das erzeugte Sprachfile kann bei gefallen in das Verzeichnis '/home/emil' umkopiert werden, dort liegen die Sprachfiles für den 'VoiceSPAM Human Emulator'.

exten => 28,1,Answer
exten => 28,2,DigitTimeout(1)
exten => 28,3,ResponseTimeout(5)
exten => 28,4,Read(NEWNUMBER)
exten => 28,5,Playback(/home/emil/voicespam${NEWNUMBER})
exten => 28,6,Hangup

Mit Wahl der Extension '28' von einer internen SIP Nebenstelle aus, können einzelne Sprachfiles probegehört werden. Die 'VoiceSPAM Human Emulator' Sprachfiles liegen im Verzeichnis '/home/emil' und tragen die Namen 'voicespam1' bis 'voicespam20'. Das probezuhörende Sprachfile wird mittels DTMF ausgewählt.

exten => _0000.,1,Answer
exten => _0000.,2,Playback(/home/emil/voicespam/
voicespam-${EXTEN:4:8}-${EXTEN:12:6})
exten => _0000.,3,Hangup

Nach Wahl einer mit 4 Nullen beginnenden Extension von einer internen SIP Nebenstelle aus, wird die korrespondierende 'VoiceSPAM Human Emulator' Gesprächsaufzeichnung abgespielt. Die Gesprächsaufzeichnungen liegen im Verzeichnis '/home/emil/voicespam'. Die Namen der Files sind wie folgt aufgebaut : 'voicespam-Datum-Uhrzeit'.

[from_isdn]

Der Context 'from_isdn' ist gültig für ankommende Rufe am ISDN Anschluss.

exten => s,1,Answer
exten => s,2,GotoIf($["${CALLERIDNUM}" = ""]?3:4)
exten => s,3,Goto(voicespam,s,1)
exten => s,4,Dial(SIP/cisco7960&CAPI/**20:b**12,180,gr)
exten => s,5,Playtones(congestion)
exten => s,6,Congestion
exten => s,105,Playtones(busy)
exten => s,106,Busy

Das ist das Standardscript zur Verarbeitung ankommender ISDN Anrufe. Mit Priority '2' wird der Inhalt der Variable 'CALLERIDNUM' geprüft. Ist diese leer wird der Context 'voicespam' angesprungen.

[voicespam]

Der Context 'voicespam' enthält das eigentliche 'VoiceSPAM Human Emulator' Script. Zur Aktivierung des 'VoiceSPAM Human Emulator' wird dieser Context angesprungen.

exten => s,1,Answer
exten => s,2,SetVar(MonitorName=voicespam-${TIMESTAMP})
exten => s,3,SetVar(MonitorNum=0000${MonitorName:10:8}
${MonitorName:19:6})
exten => s,4,Monitor(wav,/home/emil/voicespam/${MonitorName},m)
exten => s,5,Ringing
exten => s,6,Wait(13)
exten => s,7,Playback(/home/emil/voicespama)
exten => s,8,BackGroundDetect(silence/5, 520, 520, 100000)
exten => s,9,Playback(/home/emil/voicespamb)
exten => s,10,BackGroundDetect(silence/10, 520, 520, 100000)
exten => s,11,Playback(/home/emil/voicespamc)
exten => s,12,BackGroundDetect(silence/30, 520, 520, 100000)
exten => s,13,Macro(Random10)
exten => s,14,SetVar(SoundFile=${Random10})
exten => s,15,Playback(/home/emil/voicespam${SoundFile})
exten => s,16,BackGroundDetect(silence/30, 520, 520, 100000)
exten => s,17,SetVar(SoundFile=$[${SoundFile} + 1])
exten => s,18,GotoIf($["${SoundFile}" = "21"]?19:20)
exten => s,19,SetVar(SoundFile=1)
exten => s,20,Goto(15)

Dies ist das eigentliche 'VoiceSPAM Human Emulator' Script. Die einzelnen Zeilen haben die folgende Funktion :

[Priority 1]   Der ankommende Ruf wird angenommen.

[Priority 2]   Der Inhalt der Variable 'MonitorName' wird gebildet. Dies ist der Filename der 'VoiceSPAM Human Emulator' Gesprächsaufzeichnung. Der Name des Files ist wie folgt aufgebaut : 'voicespam-Datum-Uhrzeit'.

[Priority 3]   Der Inhalt der Variable 'MonitorNum' wird gebildet. Dies ist die Rufnummer welche mit der 'VoiceSPAM Human Emulator' Gesprächsaufzeichnung korrespondiert. Die Rufnummer ist wie folgt aufgebaut : '0000DatumUhrzeit'.

[Priority 4]   Die Gesprächsaufzeichnung wird gestartet. Das File wird im Verzeichnis '/home/emil/voicespam' abgelegt.

[Priority 5]   Dem Anrufenden wird ein Rufton vorgespielt.

[Priority 6]   Es wird 13 Sekunden gewartet.

[Priority 7]   Das Sprachfile '/home/emil/voicespama' wird abgespielt.

[Priority 8]   Es wird maximal 5 Sekunden auf eine Sprachpause gewartet. Es muss mindestens 520 ms gesprochen werden. Die Sprachpause muss mindestens 520 ms lang sein.

[Priority 9]   Das Sprachfile '/home/emil/voicespamb' wird abgespielt.

[Priority 10]   Es wird maximal 10 Sekunden auf eine Sprachpause gewartet.

[Priority 11]   Das Sprachfile '/home/emil/voicespamc' wird abgespielt.

[Priority 12]   Es wird maximal 30 Sekunden auf eine Sprachpause gewartet.

[Priority 13]   Das Macro 'Random10' wird aufgerufen. Das Macro gibt eine Zufallszahl zwischen '1' und '20' in der Variable 'Random10' zurück.

[Priority 14]   Der Inhalt der Variable 'SoundFile' wird auf den Inhalt der Variable 'Random10' gesetzt.

[Priority 15]   Das Sprachfile mit der Nummer aus dem Inhalt der Variable 'SoundFile' wird abgespielt.

[Priority 16]   Es wird maximal 30 Sekunden auf eine Sprachpause gewartet.

[Priority 17]   Der Inhalt der Variable 'SoundFile' wird um 1 erhöht.

[Priority 18]   Wenn der Inhalt der Variable 'SoundFile' = '21' ist, geht es mit Priority '19' weiter. Wenn nicht wird zur Priority '20' gesprungen.

[Priority 19]   Der Inhalt der Variable 'SoundFile' wird auf '1' gesetzt.

[Priority 20]   Es geht weiter mit Priority '15'. (Bis der Call Center Agent auflegt.)

exten => h,1,SetCIDNum(${MonitorNum})
exten => h,2,SetCIDName(VoiceSPAM)
exten => h,3,Dial(SIP/cisco7960,1,g)                          
exten => h,4,Hangup

Diese Zeilen werden angesprungen wenn der Call Center Agent auflegt. Es wird ein kurzer, ankommender Ruf an einer internen SIP Nebenstelle signalisiert. Die Quellrufnummer korrespondiert mit dem Filenamen der 'VoiceSPAM Human Emulator' Gesprächsaufzeichnung. Wenn diese Rufnummer zurückgerufen wird, kann die Gesprächsaufzeichnung angehört werden.

[macro-Random10]

Dieser Context enthält das Macro zur Erzeugung einer Zufallszahl.

exten => s,1,Random(95:4)
exten => s,2,SetVar(Random10=1)
exten => s,3,Goto(60)
exten => s,4,Random(95:7)
exten => s,5,SetVar(Random10=2)
exten => s,6,Goto(60)
exten => s,7,Random(95:10)
exten => s,8,SetVar(Random10=3)
exten => s,9,Goto(60)
exten => s,10,Random(95:13)
exten => s,11,SetVar(Random10=4)
exten => s,12,Goto(60)
exten => s,13,Random(95:16)
exten => s,14,SetVar(Random10=5)
exten => s,15,Goto(60)
exten => s,16,Random(95:19)
exten => s,17,SetVar(Random10=6)
exten => s,18,Goto(60)
exten => s,19,Random(95:22)
exten => s,20,SetVar(Random10=7)
exten => s,21,Goto(60)
exten => s,22,Random(95:25)
exten => s,23,SetVar(Random10=8)
exten => s,24,Goto(60)
exten => s,25,Random(95:28)
exten => s,26,SetVar(Random10=9)
exten => s,27,Goto(60)
exten => s,28,Random(95:31)
exten => s,29,SetVar(Random10=10)
exten => s,30,Goto(60)  
exten => s,31,Random(95:34) 
exten => s,32,SetVar(Random10=11)
exten => s,33,Goto(60)  
exten => s,34,Random(95:37) 
exten => s,35,SetVar(Random10=12)
exten => s,36,Goto(60)  
exten => s,37,Random(95:40) 
exten => s,38,SetVar(Random10=13)
exten => s,39,Goto(60)  
exten => s,40,Random(95:43) 
exten => s,41,SetVar(Random10=14)
exten => s,42,Goto(60)  
exten => s,43,Random(95:46) 
exten => s,44,SetVar(Random10=15)
exten => s,45,Goto(60)  
exten => s,46,Random(95:49) 
exten => s,47,SetVar(Random10=16)
exten => s,48,Goto(60)  
exten => s,49,Random(95:52) 
exten => s,50,SetVar(Random10=17)
exten => s,51,Goto(60)  
exten => s,52,Random(95:55) 
exten => s,53,SetVar(Random10=18)
exten => s,54,Goto(60)  
exten => s,55,Random(95:58) 
exten => s,56,SetVar(Random10=19)
exten => s,57,Goto(60)  
exten => s,58,Random(95:1) 
exten => s,59,SetVar(Random10=20)
exten => s,60,Noop

Dieses Macro erzeugt eine Zufallszahl zwischen '1' und '20'.

Damit der Rufnummernplan funktioniert wird noch ein zusätzliches Soundfile im Verzeichnis '/usr/share/asterisk/sounds/silence' benötigt. Dieses Soundfile hat den Namen '30.gsm' und enthält 30 Sekunden Stille. Hier findet sich das Soundfile.




 5.    mit Einschränkungen !

Leider hat der 'VoiceSPAM Human Emulator' noch 4 Einschränkungen für welche ich noch keine Lösung gefunden habe. Wenn jemand eine Idee hat - teilt mir diese bitte mit !

[1]   Störgeräusche beeinträchtigen die Sprachpausenerkennung. Insbesondere die typischen Call Center Geräusche (überlagernde Stimmen von vielen Call Center Agents) verhindern eine Sprachpausenerkennung. Wenn man die Parameter des 'BackGroundDetect' Statements anpasst (längere Mindestsprechdauer und kürzere Mindestpause) wird das Verhalten besser. Ist dann aber nicht mehr geeignet für einen Betrieb ohne Störgeräusche.

[2]   Da wegen [1] eine eher längere Mindestsprechdauer gewählt wurde, ist keine Reaktion auf die typische 'Hallo ?' Frage mehr möglich.

[3]   Die Rückgabewerte des 'BackGroundDetect' Statements lassen keine Unterscheidung zwischen einem Dauersprecher und Dauerstille zu. So ist es nicht möglich an den passenden Stellen ein 'Ja?' - 'Aha!' oder 'Hmm' (bei einem Dauersprecher) beziehungsweise ein 'Hallo, ist da noch jemand ?' bei Dauerstille einzuspielen.

[4]   Die Call Center Erkennung ist allein abhängig vom Inhalt der Variable 'CALLERIDNUM'. Ein Call Center unterdrückt normalerweise die Quellrufnummer, so das die Variable in diesem Fall keinen Inhalt hat und der 'VoiceSPAM Human Emulator' gestartet wird. Leider ist die Variable auch ohne Inhalt wenn Oma Friesemann anruft. In diesem Fall wird die Quellrufnummer, da Oma Friesemann einen analogen Anschluss ohne Rufnummernübermittlung verwendet, nicht signalisiert. Das Script kann diese beiden Fälle nicht unterscheiden.




 6.    VoiceSPAM Human Emulator jetzt Live ausprobieren !

Sicher möchte der eine oder andere den VoiceSPAM Human Emulator sofort mal ausprobieren. Dies ist durch die Verwendung des Webprojekts 'WEB IAX Phone' möglich. Das 'Web IAX Phone' ist ein webbasiertes VoIP Softphone und ermöglicht VoIP Verbindungen mit dem IAX Protokoll.

Das 'Web IAX Phone' setzt die Benutzung des 'Internet Explorer ab Version 6' voraus. Um den 'VoiceSPAM Human Emulator' richtig ausprobieren zu können, ist der Anschluss eines Mikrofons notwendig.

Der nachfolgende Link startet das 'Web IAX Phone' und verbindet automatisch mit dem 'VoiceSPAM Human Emulator'. Ich wünsche gute Unterhaltung ...

>>> VoiceSPAM Human Emulator <<<