HowTo: Asterisk Wettervorhersage

Hallo zusammen,

nein, ich hab mbrola noch nicht getestet. Hatte zwar gestern angefangen es zu installlieren... aber über mkdir mbrola bin ich noch nicht hinaus gekommen. :)

Ich sitze hier in Österreich (Wattens) im Hotel und das Internet ist sau langsam..... Nein, ich habe keinen Urlaub! :)

Heute Abend gehts weiter... dann werde ich berichten.

@ALL
Falls jemand andere interessante RSS Feeds oder so hat die er sich gerne vorlesen lassen würde, einfach eine Info an mich, dann werde ich mal schauen was man machen kann.

Interessant wäre doch auch die wirkliche Temperatur im Haus/Gewächshaus, Heizung, Kinderzimmer oder wo auch immer vorlesen zu lassen. Dann vielleicht so: http://lena.franken.de/hardware/temperaturmessung.html
Wobei ich das nicht testen kann, da ich den Asterisk ja auf einem VServer betreibe...
hm... wobei ich könnte die Temperaturwerte ja immer auf den VServer schieben... z.b. via ftp oder so..
Dann könnte man evtl. auch einen Anruf bei zu hoher Raumtemperatur realisieren...z.B. Feuermelder oder sowas.

Ja, ich beschäftige mich derzeit ein wenig mit dem Thema Hausautomation und da kommt man eben auf solche Spinnereien :)

Viele Grüße aus AT(hen)
Chris
 
Zuletzt bearbeitet:
Ab wann kommt denn "Bitte registrieren sie mich"? Kommt das immer an der selben Stelle, nach einem Satz? Ich habe bis jetzt nur kurze Texte ausprobiert und da kam dann nichts weiter.

Die beste TTS, die ich bis jetzt gehört habe, war die von Loquendo. Diese ist auch in den TomToms verbaut.
 
ja, es kommt immer an der gleichen Stelle. Ich glaube immer nach "Niedrigste Tagestemperatur".
Es kommt also vermutlich nur bei längeren Passagen.
Darüber ob man das rausschneiden kann brauchen wir aber bitte hier nicht zu diskutieren!
 
Hallo Gemeinde,

ich steh ja manchmal etwas auf dem Schlauch - ggf. hat hier jemand eine schlaue Endnote.

Ich habe aus Excel UmsatzZiele exportiert und in eine CSV gebracht. Nun habe ich das ganze per Skript so kürzen und aufteilen lassen das es eine feine tts ergeben kann - jedoch habe ich mich mit dem SOX Befehl in den Haaren :

- Wie kann ich SOX sagen das er eine Datei "X" auslesen und in eine Datei "Y".wav erstellen soll ?

Liebe Grüsse,

Stefan
 
- Wie kann ich SOX sagen das er eine Datei "X" auslesen und in eine Datei "Y".wav erstellen soll ?

Ist mit "Datei X auslesen" bereits eine Audiodatei gemeint? SOX ist ja eigentlich "nur" ein WAVE-Cutter um Audio Dateien zu schneiden. Deine Umsatzziele in Wavedateien verwandeln kannst du ja mit Cepstral, Festival, mbrola oder was auch immer.
Irgendwie verstehe ich die Frage nicht ganz. Sorry

CU
Chris
 
Hi Chris,

ich stand wirklich etwas auf dem Schlauch - "-f" kann natürlich eine Textdatei lesen...also GELÖST.

Um das was ich da gemacht habe mal zu beschreiben :

Per Zeitplaner lasse ich auf einem Win Server eine Excel Datei öffnen, per "Start Makro" in Excel lasse ich täglich Neue Umsätze verrechnen, danach autom. in eine CSV schreiben, Excel zu - Ende. Nun kommt Linux her und schaut nach ob die CSV existiert, wenn ja dann wird diese mit sed etwas bereinigt und danach in swift geschoben (Thema : Bitte registrieren Sie mich) und mit sox etwas gekürzt :) - dann geht das ganze als callfile an den Außendienstmitarbeiter um 8:00 Uhr - so hat jeder Betreuer seine aktuellen Umsatzstände (wo liegt Kunde X und um wieviel % verändert sich Kunde X) morgens auf dem Handy.

Ich denke mal das ist etwas was viele lieben werden...

Wenn etwas von dieser Arbeit benötigt wird stelle ich es gerne ein.

Liebe Grüsse,

Stefan
 
Hallo spaceguy,

vielen Dank für die Mühe, die Du Dir gemacht hast! Ich habe die Wettervorhersage gerade für meinen Asterisk übernommen und es läuft.

Ich habe allerdings zwei Änderungen vorgenommen:

1. In der php-Datei habe ich die Wörter "Tagestemperatur" in "Tages-Temperatur" geändert. Mit Matthias klingt das einfach besser.

2. Ich habe mich gefragt, wozu Du eine separate Datei weather.sh erstellst. Ich habe den Befehl zum erstellen der .wav-Datei in die extensions.conf mit eingebaut:
...
exten => 1234,n,System(/opt/swift/bin/swift -o /tmp/wetter.wav -p audio/sampling-rate=8000,audio/channels=1 $(/usr/src/wetter.php))
...
Oder hat Deine Methode irgendwelche Vorteile?

Edit:
3. Ich habe noch etwas an der php-Datei geändert: Am Ende wird das ö in oe umgewandelt. Dort hat sich ein Semikolon eingeschlichen. Deshalb kling "bewölkt" etwas komisch. Ich habe das Semikolon in meiner php entfernt.

...
$ersetz = array("oe","ae", "oe;", "ue", "Ae", "Oe", "Ue");
...
 
Zuletzt bearbeitet:
Hallo Linksys-User,

habe nach der Anleitung versucht eine Wettervorhersage zu erstellen mit Asterisk. Habe mir die wetter.php in das Verzeichnis /scripts/wetter.php mit chmod 777 wetter.php erstellt inkl. ausführungs Rechte.

Dann habe ich in der extensions.conf folgendes eingetragen:
exten => 1234,1,Answer()
exten => 1234,2,System(rm -rf /tmp/weather.wav)
exten => 1234,3,System(/opt/swift/bin/swift -o /tmp/wetter.wav -p audio/sampling-rate=8000,audio/channels=1 $(/scripts/wetter.php))
exten => 1234,4,Playback(/tmp/weather.wav)
exten => 1234,5,Hangup()

Wenn ich nun auf meinen Sip Telefon die 1234 wähle bekomme ich folgenden Fehler siehe Anhang und mit folgender wetter.php:

[Edit foschi: code-Tags erhöhen die Lesbarkeit ganz enorm!]

Code:
#!/usr/bin/php5
<?php
$ort = "Hamburg";
$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;
}

?>
Vieleicht hast du eine Idee wo ich den Fehler finden kann.

Mfg

Habunus
 

Anhänge

  • Unbenannt.png
    Unbenannt.png
    18.3 KB · Aufrufe: 33
Hi Habunus,

hast du schonmal versucht den folgenden Befehl von der Linux Kommandozeile aus zu starten?
./swift -o /tmp/wetter.wav -p audio/sampling-rate=8000,audio/channels=1 $(/scripts/wetter.php)

Deine Fehlermeldung zeit irgendwie ein | statt einem , zwischen sampling-rate=8000 und autio/channels=1
Hast du hier vielleicht einen Tippfehler?

Viele Grüße
Chris
 
@Habanus

Schau doch bitte mal in Dein angehangenes Bild, ohne viel zu prüfen ist die erste Zeile welche mir ins Auge fällt "Datei nicht gefunden".

Nett wären "CODE" Tags hier im Forum, das ganze oben ist sehr schwer lesbar.

Code:
ich bin ein code

ich bin ein quote

Hilfe geben hier alle gerne, es sollte nur "einfach" sein zu helfen.

LG Stefan
 
Das ist was ich gemeint habe. Durch das Pipe Zeichen statt einem Komma versucht er eine Datei "channel" im Ordner "audio" zu starten und die gibt es nicht.
Ich vermute wie gesagt einen Tippfehler.

Viele Grüße
Chris
 
Jepp, sehe ich auch so.

Warten wir es ab.
 
Habe es hinbekommen. Es läuft nun

Habunus
 
Und hier die Lösung wie es im * funktioniert:

System('/opt/swift/bin/swift -o /tmp/test.wav -p audio/sampling-rate=8000,audio/channels=1' "Verbindung wird hergestellt. Bitte warten")
 
[Edit foschi: Fullqoute entfernt - bitte Forenregeln beachten!]

Hallo HobbyStern,

ich wäre sehr an deiner Lösung mit den automatischen Anrufen interessiert. Ich soll sowas ähnliches in meiner Firma machen: ein LKW-Fahrer soll tel. informiert werden, wenn sein Auflieger beladen ist. Dafür stelle ich mit vor, ich erstelle ein Call-File und in diesem wird mit Swift ein nur für diese Fahrer individueller Text gesprochen. Wie geht das?

Gruß
Ronald
 
Klar geht das...
Wie Wave Dateien erzeugt werden steht ja bereits oben und wie das Call-File aussehen muss findest du hier. http://www.voip-info.org/tiki-index.php?page=Asterisk+auto-dial+out

Ich habe damit auch mal angefangen... aber habs vorerst mal beiseite gelegt... wollte mich über meine Alarmanlage informieren lassen.

Falls du was gebastelt hast, lass uns daran teilhaben. :p

Viele Grüße
Chris
 
Hallo Ihr Zwei,

ich lasse mittlerweile einiges per Telefonnachricht, oder auch SMS abgeben.

Eine Art "LKW ist voll, wir haben ihn mit 10 Tonnen Bratwurst beladen" :) geht natürlich auch.

Die erste Frage die Du Dir stellen musst ist :

- Welche Informationen will ich vertexten und vorallem, woher kommen die Daten (kann Asterisk diese direkt abholen, liegen Sie in Text vor oder hole ich Sie aus einer Datenbank?)

- Wer solls vorlesen (welche TTS)
- Willst Du anrufen (dann geht es leicht dynamisch) oder soll jemand anrufen (dann brauchst Du eine interakt. Menü oder eine Anrufernummernerkennung (die ja mit * und einer bekannten Rufnummer kein Akt ist)

- [...mhmm...] ich meine das war schon alles an Überlegung.

Wenn Du es semi-profi-mäßig machen willst, dann gibst Du 20 USD aus für Cepstral, man merkt noch deutlich das es synthetisch ist - es ist aber nach 2 - 3 mal angerufen werden okay, Du kannst die STimme dynamisch verändern, husten, räuspern etc. einsetzen - ich finde es ganz gut.

Wenn Du es absolut kostenlos willst, dann kannst Du es über mbrola machen, ich hatte das ganze mal als HOWTO eingesetzt - beachte jedoch, hierbei hört man wirklich das es eine TTS ist :) Ist aber kostenlos.

Und dann gibt es noch die Profi Lösung, ich komme gerade nicht drauf wie das Ding heisst, dort zahlst Du einzelne Kanäle und kannst auch nicht direkt an die Software ran, jedoch hört man stellenweise keinen Unterschied mehr zu einer echten Stimme. Sehr gut. Kanalpreis ~3-30tsd USD.

Wenn Du diese Fragen oben für Dich beantwortest hast kann ich Dir auch gerne einmal eine meiner Callfiles geben inkl. Skript und Asterisk Code-Snippet. Es ist aber wirklich nicht schwer.

EDIT - Anbei gefragt - wie bist Du aufgestellt, ist die Spedition groß (Was passiert wenn der 100te LKW auf einen Schlag keinen Anruf mehr bekommt weil Asterisk gerade das Callfile statt einem MV mit einem CP verschoben hat? :) ) und wie stabil muss das ganze sein. Ist Asterisk unternehmenskritisch?

LG Stefan
 
Zuletzt bearbeitet:
Hallo,

also ich möchte das TTS mit Cepstral (die Kaufversion) erledigen. Tests auf dem Server laufen auch schon. Die Daten für das TTS sollen dynamisch durch mich erzeugt werden. Vorgestellt habe ich mir das so:
1. Daten aus DB lesen
2. Callfile mit dem TTS-Text erzeugen
3. Callfile auf den Asterisk-Server kopieren
4. Person wird angerufen und bekommt seinen Text vorlesen

Im Moment sind wir ja noch in der Testphase. Da hab ich einen PC mit ISDN-Karte drin. Wenn alles läuft, wird es ein Leistungsstarker Server mit 1 ISDN-Karte sein. Zuverlässig sollte das mit den Anrufen natürlich schon funktionieren! Ich denke Asterisk ruft nacheinander die call-files ab. Dabei sollte es doch nciht zu Problemen kommen, oder? Siehst du da ein Problem?

Ich habe mit den Callfiles im Moment noch die Probleme, dass es ssml nicht richtig interpretiert. So macht er z.B. keine Pausen.
Kennst du da eine Lösung?

Mal ein Beispiel:

[read_info]
exten => s,1,SWIFT("Guten Tag! <break strength=x-weak /> ${TEXT_VAR}")
exten => i,2,Hangup

Wenn ich angerufen werde, wird nur bis "Guten Tag!" vorgelesen, dann bricht der Anruf mit dieser Meldung im CLI ab:

*CLI> -- Attempting call on CAPI/ISDN1/4904 for s@read_info:1 (Retry 1)
== ISDN1#02: Setting up DTMF detector (PLCI=0x901, flag=1)
> Channel CAPI/ISDN1#02/4904-0 was answered.
-- Executing [s@read_info:1] Swift("CAPI/ISDN1#02/4904-0", ""Guten Tag! <break strength=x-weak /> Der Auflieger mit dem Kennzeichen XXX steht an Rampe 10 zur Abholung bereit! Auf Wiedersehen."") in new stack
ssml: unexpected EOF
== Auto fallthrough, channel 'CAPI/ISDN1#02/4904-0' status is 'UNKNOWN'
== ISDN1#02: CAPI Hangingup for PLCI=0x901 in state 2


Wie sieht meine Extension aus, wenn der Angerufene eine bestimmte Taste drücken soll, ansonsten wird er wieder angerufen? Kann man das mit call-files/extensions abbilden?
Ich hab mal aus dem internet diese Beispiel gefunden:

[menu]
exten => s,1,SWIFT("This text is going to get spoken by the Swift engine to the caller|1000|1")
exten => s,2,SWIFT("You can press buttons on your keypad at any time|5000|1")
exten => 1,1,SWIFT("Diane^You've pressed 1") ; speak with us english female voice
exten => 5,1,SWIFT("Matthias^Sie haben die 5 gedrückt") ; speak with german male voice
exten => t,1,SWIFT("Anybody there? Doesn't matter, I'm going to ignore anything you dial now")
exten => i,1,SWIFT("goodbye")
exten => i,2,Hangup

Wenn ich diese in dem callfile so aufrufe:

Channel: CAPI/ISDN1/4904
MaxRetries: 5 ;number of retries before failing, not including the initial attempt. Default = 0 e.g. don't retry if fails.
RetryTime: 3600 ;how many seconds to wait before retry. The default is 300 (5 minutes).
WaitTime: 20 ; how many seconds to wait for an answer before the call fails (ring cycle). Default 45 seconds.
Context: menu
Extension: s
Priority: 1

dann klappt der Anruf, aber Swift ließt nur alles schnell vor, auch die 1000, 5000 usw., ohne auf eine Eingabe zu warten!
Mach ich was falsch?

Danke und Gruß
Ronald
 
Zuletzt bearbeitet:
Hallo Roland,

ich bin eben nur kurz über den Text geflogen - genauer antworte ich Dir hier später per EDIT..

Ich denke Asterisk ruft nacheinander die call-files ab. Dabei sollte es doch nciht zu Problemen kommen, oder? Siehst du da ein Problem?

Ich denke Du solltest folgende Erfahrungswerte beherzigen - lass Dir den Asterisk von einer Firma aufbauen, da gibt es mittlerweile reichhaltige am Markt (dann hast Du einen Hals den Du umdrehen kannst wenn Samstag Abend alles baden geht :) und es ist nicht Deiner)

Probleme?! Naja. Ich schreibe mal etwas das man mir mal geschrieben hat - "Keine Panik - Solange der Stromversorger Strom liefert und root weiss was er tut gibt es keinen Grund zur Panik. Und wenn doch, naja - dafür stehe ich ja auf Abruf."

:D

Spaß beiseite, hast Du jemanden der die Anlage später betreuen wird - der auch dann springen kann wenn der Flieger in die Karibik schon bereit steht - dann ist alles gut :) Ansonsten lass uns dieses Thema später nochmals aufgreifen.

Zum eigentlichen. Ich arbeite hier seit einigen Wochen an einer ähnlichen Anforderung - asu DB lesen, Vergleichszahlen hin und her senden und dann dynamische Texte ausgeben, gerne kann ich Dir da mithelfen - vielleicht helfen wir uns ja beide ? ;)

Code:
[read_info] 
exten => s,1,SWIFT("Guten Tag! <break strength=x-weak /> ${TEXT_VAR}")  
exten => i,2,Hangup

Besser ist es so .. :

Code:
exten => 99,1,Answer()
exten => 99,n,System(rm -rf /tmp/test.wav)
exten => 99,n,System(/opt/swift/bin/swift -o /tmp/test.wav -p audio/sampling-rate=8000,audio/channels=1 "LKW mit Bratwurst ist bereit.")
exten => 99,n,Playback(/tmp/test)
exten => 1222,5,Hangup()

Das kann man dann natürlich noch durch zahlreiche Features erweitern, zbsp. die Files im "Background" abspielen und Benutzereingabnen möglich machen usw usf.

Soweit..

LG Stefan
 
Hi,

den Server soll eigentlich unsere Technikabteilung betreuen.

Ich habe die Extention so geändert, wie du vorgeschlagen hast. Mit dem übergebenen Text kann ich auch endlich Pausen usw. einfügen.

Wie mache ich es aber, dass der Angerufene eine bestimmte Taste drücken muss, sonst wird er wieder angerufen?

Gruß
Ronald
 

Statistik des Forums

Themen
245,072
Beiträge
2,223,858
Mitglieder
371,891
Neuestes Mitglied
petermurphy5510
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.