Amooma TTS-Engine im Asterisk

asterisk

Kostenfreie TTS-Engines gibt es inzwischen wie Sand am Meer – leider kaum brauchbare in deutscher Sprache. Eine Ausname bildet die Engine des Unternehmens Amooma GmbH aus Neuwied. Textbausteine werden über ein Webform erzeugt und befristet als GSM-Datei zur Verfügung gestellt.
Auf deren Internetpräsenz heißt es:

Sprachbausteine die Sie über unsere web-basierte TTS-Engine generieren können völlig frei und ohne Einschränkungen verwendet werden.

Also los:
Meine Arbeit bestand aus zwei Perl Scripts. Das erste Script generiert HTTP-POST Pakete und schickt diese an den Webserver der Firma Amooma GmbH. Die Antwort wird geparsed und die entstandene GSM-Sprachdatei wird direkt auf der Console ausgegeben. Aufgerufen wird das Script (tts.pl) zum Beispiel wie folgt:


perl tts.pl "Test" > test.gsm




Das zweite Script (tts_cache.pl) stellt die Schnittstelle zum Asterisk dar. Die Besonderheit an diesem Script ist, dass es bereits erstellte Textbausteine nicht noch einmal generiert, sondern wiederverwendet. So wird der Traffic- und Leistungsbedarf gerade bei Zahlen und sich wiederholenden Ansagen drastisch reduziert.
Aufgerufen wird das Script im Asterisk folgendermaßen:


;Test
exten => 1337,1,Answer
exten => 1337,n,Wait(2)
exten => 1337,n,AGI(tts-cache.pl,"Sie haben eine neue Email.")
exten => 1337,n,Hangup

Im Umgang mit Anglizismen ist ein bisschen rumprobieren gefragt. Weiterhin ist zu beachten, dass der auszugebende Text maximal 500 Zeichen lang sein darf.

Diese beiden Scripts habe ich nun ein halbes Jahr lang getestet und für praktibel befunden. Sie haben mir nie Ärger bereitet.

Bitte beachten Sie ausserdem, dass die massive Verwendung des tts-Generators als Denial of System Angriff gewertet werden kann. Es ist daher ratsam Amooma im Falle einer automatisierte Verwendung darauf aufmerksam zu machen (info@amooma.de) und sich zu bedanken, dass sie eine solch qualitativ hochwertige Dienstleistung kostenfrei zur Verfügung stellen.

Installation:

  • Die “tts.pl” zum Beispiel nach /root kopieren.
  • Die “tts-cache.pl” nach /var/lib/asterisk/agi-bin kopieren
  • In der “tts-cache.pl” den Standort der “tts.pl” angeben. Zum Beispiel:
  • 
    my $ttsdir = "perl /root/tts.pl";
    
    

    Appendix:

    Download: tts.pl
    Download: tts-cache.pl
    Amooma Text to Speech Engine

    Nachrichten im Asterisk

    asterisk

    Hier eine Möglichkeit Nachrichten im Asterisk auszugeben zu lassen:

    httpv://www.youtube.com/watch?v=O1qy5QQcOaQ

    
    ;Aktuelle Nachrichten:
    exten => 256,1,Answer
    exten => 256,n,Wait(2)
    exten => 256,n,System(/usr/bin/wget http://ondemand.wdr.de/radio/einslive/nachrichten/nachrichten.mp3 -O /tmp/nachrichten_${EVAL(${UNIQUEID})}.mp3)
    exten => 256,n,Wait(1)
    exten => 256,n,MP3Player(/tmp/nachrichten_${EVAL(${UNIQUEID})}.mp3)
    exten => 256,n,HangUp
    exten => h,1,System(rm -f /tmp/nachrichten_${EVAL(${UNIQUEID})}.mp3)
    
    

    Oder wahlweise eine andere Quelle:

    
    ;Nachrichten 2:
    exten => 255,1,Answer
    exten => 255,n,Wait(2)
    exten => 255,n,System(/usr/bin/wget http://ondemand-mp3.dradio.de/file/dradio/nachrichten/nachrichten.mp3 -O /tmp/nachrichten_${EVAL(${UNIQUEID})}.mp3)
    exten => 255,n,Wait(1)
    exten => 255,n,MP3Player(/tmp/nachrichten_${EVAL(${UNIQUEID})}.mp3)
    exten => 255,n,HangUp
    exten => h,1,System(rm -f /tmp/nachrichten_${EVAL(${UNIQUEID})}.mp3)
    
    

    Diese beiden Extensions führen auf systemebene das Tool “wget” aus und downloaden bei Aufruf jeweils einen vom Herausgeber stündlich aktualisierten Nachrichtencast. Der im Asterisk integrierte “MP3Player” gibt die Audiodatei wieder.
    Obwohl mir dieses Script noch nie Ärger gemacht hat, gibt es hier einen Kritikpunkt an meiner Arbeit: die “h”-Extension ist suboptimal, da sie grundsätzlich bei jedem Hangup aufgerufen wird und nicht nur innerhalb des Channels. Leider ist mir bisher keine bessere Lösung des Problems eingefallen, da der User jederzeit den Stream durch ein Hangup unterbrechen kann – die restlichen Extensions werden dann nicht bearbeitet und es sammelt sich Datenmüll im “/tmp”-Verzeichnis des Betriebssystems.
    Zudem reicht es, die “h”-Extension nur einmal in der extension.conf aufzuführen – sie wird nach meinem Wissen auch nur einmal ausgeführt. Da der Dateiname der temporären Audiodatei immer jeweils der UNIQUEID entspricht, ist allerdings nicht zu befürchten dass ein Stream durch gleichzeitiges ausführen des Scripts unbeabsichtigt gelöscht wird. Das waren zunächst meine Befürchtungen, aber die UNIQUEID ist wirklich unique ;)

    Dieses Script darf privat und kommerziell verwendet werden. Bitte beachten Sie jedoch gerade bei einer kommerzieller Verwendung, dass bei der Ausführung des Scripts das verwendete Telefon den gesetzlichen Anforderungen eines “neuartigen Rundfunkgerätes” entspricht und somit Rundfunkgebührenpflichtig ist. Weiterhin ist darauf hin zuweisen, dass die oben aufgeführten Radioaufzeichnungen restriktiven Nutzungsbedingungen durch deren Urheber und Distributor unterliegen können.

    Asterisk und Fritz!Box 7270

    Ein Feature das an der aktuellen Fritz!Box 7270 groß bei mir punkten konnte ist das gut funktionierende Callthrough. Bis vor kurzem bestand mein Equipment aus einer betagteren ISDN-Telefonanlage, einem flashed Speedport W500V als ATA und einer Auerswald “ABox” für das Calltrough zwischen VoIP und Festnetz.

    Im folgenden HowTo möchte ich erläutern wie ich die Fritzbox und den Asterisk-Server vereinen konnte.
    Zuallererst sollte man sich auf dem Asterisk einen neuen SIP-Account für die Fritz!Box anlegen. Meiner Fritz!Box habe ich die MSN 6666 gegeben.

    Einstellen der Callthrough-Parameter: PIN eingeben & merken! Optional kann hier auch eingestellt werden, dass nur Anrufe von bestimmten Anrufern entgegengenommen werden sollen. Da ich einen Festnetzinbound auf mehreren VoIP-Nummern klingeln lassen ist der Haken bei mir unabdinglich, da sonst die Fritz!Box ALLE (auch externe!) Anrufe entgegennimmt.

    Fritz!Box 7270 Callthrough Settings
    Fritz!Box 7270 Callthrough Settings

    Jetzt können die Einstellungen getestet werden: dazu muss mit einem beliebigen SIP-Client die Nummer der Fritz!Box angerufen werden. Es ertönen 4 Töne -> PIN eingeben -> Bestätigungston. Sollte dies nicht auf anhieb funktionieren, sollten folgende Einstellungen überprüft werden: DTMF (am VoIP-Client und an den Settings der Fritz!Box), Callthrough-Sicherheitseinstellungen und “Nur Rufe von folgenden Rufnummern annehmen”.

    Da ich es als sehr lästig empfand immer die PIN einzugeben, habe ich diesen Vorgang vom Asterisk-Server automatisieren lassen. Dazu muss folgende Extension in die extension.conf eingetragen werden:

    ;Fritzbox \w callthrough-outbound:
    exten => 6666,0,NoCDR()
    exten => 6666,1,Dial(SIP/6666,2,D(w1234))

    Erklärung: Es ist möglich dem Dial-Befehl ein Makro zu übergeben. In diesem Fall soll er nach Entgegennehmen des Anrufes 0,5 Sekunden warten (w) und nacheinander die PIN “1234” als DTMF-Ton übermitteln. Trägt man dies ein, sollte man kurze Zeit nach dem Wählen der “6666” den Quittungston der Fritz!Box hören. Über eine vorgewählte “0” kann man sich nun Amt holen und über seinen Festnetzanschluß telefonieren.

    Natürlich sind auch weitere “Spielereien” mit solchen Makros möglich. Folgende zusätzliche Wahlregel erlaubt es mir nach wählen der “6669” über VoIP mit dem DECT-Telefon verbunden zu werden das an der Fritz!Box angemeldet ist:

    ;Fritzbox \w calltrough-DECT:
    exten => 6669,0,NoCDR()
    exten => 6669,1,Dial(SIP/6666,2,D(w1234ww610))

    Erklärung: Wie oben bereits erklärt wird der PIN “1234” übermittelt, eine Sekunde gewartet (ww) und anschließend der interne Teilnehmer “610” (=DECT) angerufen. Natürlich sind auch Weiterleitungen und Konferenzen damit möglich.

    Viel Spaß beim Rumexperimentieren!