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.
Wechseln ins Verzeichnis:
und starten die Installation mit
War die Installation erfolgreich können wir zum Testen eine WAV Datei mit etwas Text erzeugen.
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.
Diesen Code speichern wir in einer Datei wetter.php und machen diese ausführbar mit dem Befehlt
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.
Die Texteile
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:
Wir speichern das Script in einer Datei weather.sh und machen es wieder ausführbar mit
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
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
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
Code:
cd Cepstral_Katrin_i386-linux_5.1.0
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
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'/>
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: