HowTo: Asterisk Wettervorhersage

spaceguy

Neuer User
Mitglied seit
20 Okt 2006
Beiträge
70
Punkte für Reaktionen
0
Punkte
6
Hallo zusammen,

ich habe gestern Abend mal eine Wettervorhersage für meinen Asterisk gebastelt und wollte euch daran teilhaben lassen.
Beim Anruf wird einem das aktuelle Wetter und die Vorhersage für den nächstten Tag vorgelesen.

Ich beschreibe mein Vorgehen auf einem VServer von Server4You unter Debian 4. Die Anleitung sollte sich aber auch auf anderen Servern und Betriebssystemen nachvollziehen lassen.

Zuerst habe ich die Cepstral Text-To-Speech Engine installiert. (Ohne Aktivierung wird zu Beginn der Ansage ein kurzer Hinweis ausgegeben. Sie funktioniert aber trotzdem.)

Ihr könnte das Paket einfach hier herunterladen: https://www.cepstral.com/downloads/
Dann entpacken wir das ganze z.B.
Code:
tar xvzf Cepstral_Katrin_i386-linux_5.1.0.tar.gz
Wechseln ins Verzeichnis:
Code:
cd Cepstral_Katrin_i386-linux_5.1.0
und starten die Installation mit
Code:
./install

War die Installation erfolgreich können wir zum Testen eine WAV Datei mit etwas Text erzeugen.
Code:
/opt/swift/bin/swift -o /tmp/asterisk.wav -p audio/sampling-rate=8000,audio/channels=1 "Mein Name ist Asterisk und ich spreche."

Entweder ihr hört euch dieses File jetzt via Asterisk an oder übertragt es auf euren PC und spielt es dort ab.
Wurde die Datei richtig erzeugt und ich hört den Text "Mein Name ist Asterisk und ich spreche." gesprochen in deutscher Sprache von einer Frau, dann war die Installation erfolgreich.

Im nächsten Schritt laden wir uns die Wetterinformationen vom Google Webservice und erzeugen einen Textstring der durch Cepstral verarbeitet werden kann.
Dafür verwende ich ein PHP Script. Sicher geht das auch mit Perl, aber darin bin ich nicht so gut. :)

Code:
#!/usr/bin/php
<?php
$ort = "Goeppingen";
$url = "http://www.google.com/ig/api?weather=".$ort."&hl=de";
$xml = simplexml_load_string(utf8_encode(file_get_contents($url)));
if(!($xml)) die("XML nicht geladen");
else {
$city = (string)$xml->weather->forecast_information->postal_code['data'];
$current = array("condition" => (string)$xml->weather->current_conditions->condition['data'],
"temp" => (string)$xml->weather->current_conditions->temp_c['data'],
"humidity" => (string)$xml->weather->current_conditions->humidity['data'],
"wind" => (string)$xml->weather->current_conditions->wind_condition['data'],
"icon" => "http://www.google.de".$xml->weather->current_conditions->icon['data']);
$forecast = array();
$i = 0;
foreach($xml->weather->forecast_conditions as $item) {
$forecast[$i]["dow"] = (string)$item->day_of_week['data'];
$forecast[$i]["low"] = (string)$item->low['data'];
$forecast[$i]["high"] = (string)$item->high['data'];
$forecast[$i]["icon"] = "http://www.google.de".((string)$item->icon['data']);
$forecast[$i]["condition"] = (string)$item->condition['data'];
$i++;
}
}
echo "Das Wetter in ".$ort."<break time='800ms'/>";
echo "Aktuelle Temperatur:<break time='800ms'/>";
echo $current["temp"];
echo "Grad <break time='800ms'/>";
echo "Aktuelle Wetterlage: <break time='800ms'/>";
echo sz($current["condition"]);
echo "<break time='800ms'/>";
$j = 0;
    foreach($forecast as $f) {
   If ($j==1) {
        $j++;
        echo "Vorhersage fuer morgen<break time='800ms'/>";
        echo "Niedrigste Tagestemperatur: ".$f["low"]." Grad <break time='800ms'/>";
        echo "Hoechste Tagestemperatur: ".$f["high"]." Grad <break time='800ms'/>";
        echo "Vorhersage: ".sz($f["condition"]);

   }elseif ($j==0) {
        $j++;
        //do nothing
   }else {
        break;
   }
}

function sz($s)
{
        $zuers = array("ö","ä", "ö", "ü", "Ä", "Ö", "Ü");
        $ersetz = array("oe","ae", "oe;", "ue", "Ae", "Oe", "Ue");
        $s = str_replace($zuers, $ersetz, $s);
        return $s;
}

?>

Diesen Code speichern wir in einer Datei wetter.php und machen diese ausführbar mit dem Befehlt
Code:
chmod a+x wetter.php
Vorher solltet ihre in der dritten Zeile den Ort anpassen für den ihr die Wettervorhersage erhalten möchtet. Am Besten einfach mal vorher ausprobieren welcher Ort funktioniert (es gibt leider nicht alle bei Google).

Wenn wir jetzt die Datei auf der Konsole starten (./wetter.php) solltet ihr etwa folgende Ausgabe sehen.
Code:
Das Wetter in Goeppingen<break time='800ms'/>Aktuelle Temperatur:<break time='800ms'/>14Grad <break time='800ms'/>Aktuelle Wetterlage: <break time='800ms'/>Regen<break time='800ms'/>Vorhersage fuer morgen<break time='800ms'/>Niedrigste Tagestemperatur: 10 Grad <break time='800ms'/>Hoechste Tagestemperatur: 18 Grad <break time='800ms'/>Vorhersage: Vereinzelt Regen

Die Texteile
Code:
<break time='800ms'/>
erzeugen eine Sprechpause von 800ms. Das ist wichtig da sonst die einzelnen Werte zu schnell gesprochen werden und die Verständlichkeit leidet.

Wichtig ist das die Ausgabe in einer Zeile erfolgt damit es durch Cepstral richtig verarbeitet werden kann.

Jetzt haben wir die Wetterinformationen in einem durch Cepstral verarbeitbaren Format und müssen noch eine passende Wavedatei erstellen.
Dafür habe ich ein Shellscript gebaut das durch die Asteriskextension beim Anruf ausgeführt wird.

Das Shellscript sieht wie folgt aus:
Code:
#!/bin/sh
#Erzeuge WAV mit Wettervorhersage
/opt/swift/bin/swift -o /tmp/weather.wav -p audio/sampling-rate=8000,audio/channels=1 $(/home/scripts/./wetter.php)

Wir speichern das Script in einer Datei weather.sh und machen es wieder ausführbar mit
Code:
chmod a+x weather.sh

Beim starten des Scripts mit ./weather.sh wird nun immer eine Datei weather.wav in /tmp erzeugt und enthält die aktuelle Wettervorhersage für den Ort eurer Wahl.

Anschließend müssen wir dem Asterisk noch beibringen diese Datei abzuspielen wenn wir ihn anrufen. Dazu erstellen wir einen neuen Eintrag in der extensions.conf
Code:
exten => 1234,1,Answer()
exten => 1234,2,System(rm -rf /tmp/weather.wav)
exten => 1234,3,System(/home/scripts/./weather.sh)
exten => 1234,4,Playback(/tmp/weather)
exten => 1234,5,Hangup()

Eine kurze Erklärung der einzelnen Zeilen:
1. Bei Anruf auf der 1234 abnehmen.
2. Den Systembefehl rm- rf zum löschen der Datei /tmp/weather.wav aufrufen um die alten Wetterdaten zu löschen.
3. Neue WAV Datei erstellen (hier müsst ihr evtl. den Pfad anpassen an dem eure weather.sh liegt).
4. WAV Datei abspielen.
5. Auflegen

Das wars auch schon.
Jetzt sollte bei jedem Anruf auf der 1234 eine Anpsage mit den Wetterdaten erfolgen.

Geplante Erweiterungen:
- Versuche mit festival als Text-To-Speech Engine
- Auswahl verschiedener Orte durch Telefontasten mit einem Sprachmenü (Drücken sie die 1 für Goeppingen, die zwei für Stuttgart, die drei für Muenchen....)
- Vorlesen von wichtigen Emails (ebenfalls mnit Sprachmenü)
- Vorlesen des aktuellen Aktienkurses

Für Anregungen und Verbesserungsvorschläge wäre ich Dankbar.

Viele Grüße
Chris
 
Zuletzt bearbeitet:
Hallo spaceguy,

sehr schönes HOWTO, Danke. Es lief hier direkt problemlos, einziger Wehrmutstropfen ist halt die Aktivierung - besonders lustig ist die Einblendung "Bitte registrieren Sie mich" :) Achja - und Matthias hört sich deutlich gesünder an, hat auch noch einen interessanten Dialekt.

Aber im Grunde ist es klasse, die Erweiterung um festival wäre natürlich super.

Wenn ich hier etwas dazubeitragen kann werde ich es mit einbringen.

Das Ziel eines interaktiven Menüs mit Vorhersagen, ggf. Stauinfos usw. finde ich auch gut.

EDIT:

Anregung zur Stauinfo :

Auf "verkehrsinformationen.de" kann man sich mit einem Query die angeforderten Infos anhand von Zahleneingaben holen, so könnte man locker für Reisende eine Info bauen, zB :

Der Suchstring lautet :

Code:
http://www.verkehrsinformation.de/index.php?tmp=search&WA_ta=1&road=[B]%25[/B]&region=[B]%25[/B]

%25 heisst alles
zB road=1 zeigt die A1
zB region=10 zeigt NRW

Die Ausgabe ist textbasiert, wenn auch sehr umfassend..

LG Stefan
 
Zuletzt bearbeitet:
Endlich mal wieder ein schönes Projekt. Ich habs gerade installiert und es lief auf Anhieb. Den Tipp von Hobbystern Matthias zu verwenden, probiere ich gerade aus.
Da mir 29,99$ die Spielerei (und die Singsangqualität von Cepstral auch) nicht wert sind, wärs natürlich schön, das ganze auf festival umstellen zu können.
 
Zuletzt bearbeitet:
Die beiden positiven Kommentare veranlassen mich nun auch, damit mal "rumzuspielen". Mir scheint das ein gutes Mittel zu sein, um "Kreisverkehre" in der Anlage zu verhindern.

Problem: gelegentlich schaffen meine Kollegen es, untereinander im Kreis umzuleiten (z.B. A -> B -> C -> A). Ich schreibe gerade an einem Skript, dass diese Kreise aufspürt, denn die Umleitungsziele sind in der AstDB gespeichert. Es ist relativ leicht möglich, mittels eines Skripts die entspr. Textdatei zu erzeugen, wenn die gerade zu speichernde Umleitung einen Kreis schließt.

Diese Textdatei, das wäre doch prima, könnte man per callfile dann direkt dem "Bösewicht" vorspielen. (nächster Puzzlestein: ein callfile, dass praktisch Intercom-Funktionalitäten aufweist: s. AddSipHeader(Alert-Info)). Die Umleitung dürfte dann natürlich nicht mehr gespeichert werden: weder in der Datenbank noch im Telefon.
 
Hallo zusammen,

und ich dachte schon es interessiert keinen. :)
Festival habe ich zwischenzeitlich auch getestet. Leider ist die Qulität im Vergleich zu Cepstral unbrauchbar.

Den Hinweis mit den Verkehrsinformationen finde ich sehr gut. Das werde ich mal probieren.
Man fährt auf der Autobahn und ruft den Asterisk an der einem dann die aktuellen Verkehrsinfos vorliest. Netter Gedanke.... ja, ich weiß... es gibt Verkehrsfunk und TMC aber das beinhaltet nicht immer alle Strasse/Regionen die ich gerne hätte.

Falls jemand eine andere "kostenlose" Text to Speech Engine kennt, immer her damit. Das Microsoft Teil funktioniet in etwas mit gleicher Qualität wie Cepstral ist aber leider nur für Windows... wobei... da fällt mir ein... ich habe Mono auf meinem vserver installiert.
Das wäre doch mal ein Ansatz... aber vermutlich braucht man dazu noch weitere DLLs usw.

CU
Chris
 
Für Festival gibts irgendwo auch deutsche Sprachdateien, sogar einige mit Dialekt, hast du die verwendet?
Vor Jahren habe ich damit mal rumgespielt, so übel fand ich die gar nicht.
 
Hi Alle,


schön schön, hier lebt die Bude :)

Die Idee mit der Verkehrsinfo fande ich auch super (kam ja auch von mir) :) Im Ernst, ich habe auch TMC und Stauumfahrung im Auto - aber die doofe Tante braucht immer so 5-10 Minuten um mir dann in Sichtweite des Staus zu sagen das ich ihn umfahren soll :-( Aber nebenbei, die VKInfo kann ja auch Prognosen erstellen (30 Minuten, 60 Minuten) - ist schon mehr als cool die Idee.

In der Theorie kann man ja alles vorlesen, Schlagzeilen, Staus, Unfälle, Vollsperrungen, Unwetter, Emails, Fehler im Syslog, Die Kündigung der Firma :rolleyes: oder auch die Scheidungspapiere - die endlich beim Anwalt ankamen :)

Leider ist die Qulität im Vergleich zu Cepstral unbrauchbar.

Kann ich leider nur bestätigen, festival hört sich furchtbar nach Blech an, man könnte nun mit sed vorfiltern, damit die Stimme nicht noch irgendwelche Sonderzeichen abbekommt, aber sie hört sich wirklich grausig an.

Festival in deutsch

Habe ich auch vor Jahren gehabt, ich habe es hier abgeschafft weil es einfach nicht kundentauglich war, man hat sich ja geschämt sowas abzuspielen. Cepstral und Matthias sind da deutlich weiter.

Also : TTS Systeme sind hier gerne gesehen, Linux und Free bzw. GNU vorausgesetzt.

LG Stefan
 
Die Cepstral-Stimme hab ich mir auch gleich mal installiert und es funktionierte auf anhieb. Ich habe es noch nicht ausprobiert und auch noch nicht ergoogelt, aber kann man nicht so etwas wie einen WAV-Cutter miteinfließen lassen, der bei der WAV-Datei den Anfang wegschneidet (falls man die Lizenz nicht kaufen möchte)?
 
Aber das wäre doch illegal das man in der Playfile angabe einige Sekunden des Anfangs nicht abspielen lassen würde !

:-Ö
 
Funktionieren würde das vermutlich schon. Aber es bleibt trotzdem noch der Hinweis "Bitte registrieren sie mich" in der Mitte der Wiedergabe.
Ich hätte allerdings die gleichen Bedenken wie HobbyStern.

Die Cepstral-Stimme hab ich mir auch gleich mal installiert und es funktionierte auf anhieb. Ich habe es noch nicht ausprobiert und auch noch nicht ergoogelt, aber kann man nicht so etwas wie einen WAV-Cutter miteinfließen lassen, der bei der WAV-Datei den Anfang wegschneidet (falls man die Lizenz nicht kaufen möchte)?

Ich hätte allerdings auch eine Frage... Ich hatte wie im HowTo geschrieben die Frauenstimme installiert welche ich eigentlich ganz gut fand. Anschließend habe ich zum Testen auf dem gleichen Wege die Männerstimme installiert. Diese finde ich nicht so gut und würde gerne die Stimme wieder umstellen. Weiß jemand wie das geht? Erneute Installation hat nichts geholfen.

CU
Chris
P.S. Die Verkehrsinfo ist in der Mache. Ich möchte die Verkehrsinfos in eine Datenbank schreiben und anschließen kann man dann per DTMF Menü wählen welche Strasse man anhören möchte. z.B. 7 für A7 bzw. B7 usw.
 
... aber kann man nicht so etwas wie einen WAV-Cutter miteinfließen lassen, der bei der WAV-Datei den Anfang wegschneidet (falls man die Lizenz nicht kaufen möchte)?

Abgesehen davon, dass es, wie HobbyStern schon sagte, mit hoher Wahrscheinlichkeit illegal ist, finde ich, dass die ca. 30 US-Dollar kein wirklich hoher Preis sind, vor allem, wenn man das Ding als Firma betreibt - und selbst privat sind auch die Kosten eines besseren Abendessens höher.

Was mich eher beunruhigt: die letzte Version 5.1 stammt vom Juni 2008, ist also ein gutes Jahr alt. Davor gab es regelmäßige Weiterentwicklungen (so unter /opt/swift/doc zu finden). Gibt es die Firma noch? Oder würde ich 30 US-Dollar einfach aus dem Fenster schmeißen? Weiß da jemand etwas Genaueres?
 
Kann ich leider nur bestätigen, festival hört sich furchtbar nach Blech an, man könnte nun mit sed vorfiltern, damit die Stimme nicht noch irgendwelche Sonderzeichen abbekommt, aber sie hört sich wirklich grausig an.

Naja, wer wie ich mit SAM/Reciter auf dem C64 angefangen hat gruselt sich vor nichts mehr :)

Das hier hört sich auch ganz gut an:
http://www.linguatec.net/onlineservices/voice_reader/site
Leider nicht für Linux verfügbar, kein OpenSource und damit aus dem Rennen.
 
Das Thema Legalität dürfte klar sein.

Stimmenwechsel. Weiß jemand wie das geht?

Ich habe es hier so gehalten das ich ANNEHME das Cepstral schlichtweg alphabetisch die Stimmen annimmt, also einfach den einen Ordner ?Kathrin? nach Zb ZKathrin umbenennen, dann gehts hier bei mir.

die letzte Version 5.1 stammt vom Juni 2008

Sehe ich auch etwas kritisch an. Alles in allem wäre der Idealweg über Festival in deutscher Fassung.

Ich werde mich daran mal machen und das hierzu beisteuern.

@Spaceguy

Ich baue gerade mit dem Reverse AGI eine kleine Dokumentenablage, gerne bist Du eingeladen Deine Neuigkeiten dort auch zu hinterlegen, mein alter vServer steht Dir zur vollen Verfügung, Zugangsdaten auf Anfrage.

http://www.traumlinux.de/mydms

Liebe Grüsse, Stefan
 
P.S. Die Verkehrsinfo ist in der Mache. Ich möchte die Verkehrsinfos in eine Datenbank schreiben und anschließen kann man dann per DTMF Menü wählen welche Strasse man anhören möchte. z.B. 7 für A7 bzw. B7 usw.

Mal als Anregung, für NRW gibts die Verkehrsinfos unter:
0221 1680 3050
 
Mal als Anregung, für NRW gibts die Verkehrsinfos unter:
0221 1680 3050
Ich habe das gar nicht gelesen!

:-Ö

Ist es nicht schöner "selber" soetwas anzubieten ? ;-)

EDIT : Hier ist meine Arbeit an diesem Teil : Mbrola TTS für Asterisk
 
Zuletzt bearbeitet:
[cepstral bitte mal wegschauen]
Wer böse ist, schummelt ein "sox original-filename.wav new-filename.wav trim 7.5" in sein Sckript.
[/cepstral bitte mal wegschauen]
 
Ich schau besser auch weg :)

Es bleibt aber ein "Bitte registriere mich" mitten im Text :)
 
Ist es nicht schöner "selber" soetwas anzubieten ? ;-)

EDIT : Hier ist meine Arbeit an diesem Teil : Mbrola TTS für Asterisk

Sicher! Vor allem hört die WDR-Nummer ja auch jenseits der Landesgrenzen auf. Und bei den heutigen Spritpreisen kann man ja doch mal woanders hin fahren.

Mbrola ist doch aber festival, dachte das kann hier keiner richtig leiden :)
Oder ist das wieder was anderes?
Update: Jetzt habe ichs mir mal angesehen, scheint doch was unterschiedliches zu sein. Weiß auch nicht wieso ich das in einen Topf geworden habe. Wahrscheinlich meinte ich mbrola, das habe ich vor Jahren schonmal verwendet, allerdings für ganz was anderes.
 
Es bleibt dabei, nichts geht über Cepstral - jedoch ist die deutsche Version von Mbrola "okay" und für jedermann umsonst aufzuspielen.

Daher diese Variante.

Ich muss ehrlich sagen das ich es eine Bereicherung finden würde wenn wir eine "Plugin" fähige Schnittstelle errichten könnten in welche man Datenreihe "x" einfügt und diese dann auf Zuruf abspielen lassen kann, was dann wirklich vorgespielt wird ist ja eigentlich Schnurz.

Dank Chris´s Schritt 1 - der Wetterinfo hat die Sache ja recht schnell Züge angenommen, das klappt hier bei mir super und ich lasse mich aktuell jeden morgen kurz anrufen und mir die Vorausschau für heute erzählen, nette Idee wie ich finde.

@spaceguy - Chris - kannst Du mit Mbrola etwas anfangen?

LG Stefan
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.