Aktuellen Wetterbericht aus einem RSS-Feed mit Asterisk vorsprechen lassen

11. Januar 2025

Hast Du Dich jemals gefragt, wie man zum Beispiel automatisch aktuelle Wetterberichte am Telefon wiedergeben kann? In diesem Artikel zeige ich Dir als Beispiel für Unterrichtszwecke, wie ein kleines Python-Skript namens ***.py genau das als fiktives Beispiel ermöglicht. Es nutzt die Kraft von RSS-Feeds und Text-to-Speech-Diensten, um zum Beispiel einen Wetterbericht aus einer XML-Datei zu holen, in eine Audio-Datei zu verwandeln und direkt abzuspielen.

Wichtiger Hinweis zum Urheber- und Nutzungsrecht: Das hier vorgestellte Skript dient nur als Fallbeispiel für eine Programmierung mit Python und Asterisk. Das Skript greift auf den fiktiven Wetterbericht auf den ebenfalls fiktiven Link „https://www.***.**/***_rss/***.xml“ zu, dessen Urherber- und Nutzungsrechte beim ebenfalls fiktiven Anbieter liegen. Bevor Du tatsächlich dieses Skript einsetzen möchtest, solltest du dir vom Rechteinhaber sein Einverständnis geben lassen. Es dient auch als gutes Beispiel dafür, bei der Verbreitung und Verarbeitung von eventuell urheberrechtlich geschütztem Material vorsichtig zu sein.

Es gibt öffentliche und lizenzfreie RSS-Feeds (z. B. von Open-Source-Projekten), die für Tests verwendet werden können. Dies gibt eine rechtlich unbedenkliche Möglichkeit, das Skript auszuprobieren. Dieses hier vorgestellte Skript lässt sich nicht nur für Wetterdienste einsetzen. Das macht es noch vielseitiger. Das hier vorgestellte Skript kannst du zum Beispiel ChatGPT vorstellen und bitten es für lizenzfreie und öffentliche RSS-Feeds anzupassen.

Die Vorgehensweise  dieses Skripts ist für Ubuntu Mate (Linux Debian) mit Asterisk 18.10.0 und Python 3.10 geeignet. Mit anderen Versionen wird es höchstwahrscheinlich nach meiner Erfahrung funktionieren, selbst auf einem älteren Raspberry Pi 3 mit Raspbian.

Dall·e 2025 01 10 11.52.43 A Humorous Scene Of A Person Using An Old Rotary Phone To Call An Automated Weather Service During A Storm. The Setting Is Outdoors With Heavy Rain, L
Die KI von DALL-E hat noch nicht ganz verstanden wie ein Telefon funktioniert. Egal. Aber das Coding von Skripten in verschiedenen Programmiersprachen kann ChatGPT bereits sehr gut.

Was macht das Skript genau? Nachfolgend das Skript, dass ich ***.py genannt habe:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Asterisk AGI script to fetch and play the general weather report.
Ensure the script and the required asterisk2_agi.py module are in the same directory.
Make this file executable using: chmod +x ***.py

Wichtiger Hinweis zum Urheber- und Nutzungsrecht: Das hier vorgestellte Skript
dient nur als Fallbeispiel für eine Programmierung mit Python und Asterisk. 
Das Skript greift auf den fiktiven Wetterbericht auf 
"https://www.***.**/***_rss/***.xml" zu, dessen Urherber- und Nutzungsrechte
beim ebenfalls fiktiven Rechteinhaber liegen. Bevor Du tatsächlich dieses Skript einsetzen möchtest,
solltest du dir vom Rechteinhaber sein Einverständnis geben lassen. 
Es dient auch als gutes Beispiel dafür, bei der Verbreitung und Verarbeitung von eventuell
urheberrechtlich geschütztem Material vorsichtig zu sein.


"""

import sys
from asterisk2_agi import init_env, play_text_as_audio
import feedparser


def fetch_weather_from_rss(url):
    """
    Fetches and parses weather data from the given RSS feed URL.
    - Returns a list of (title, description) tuples.
    """
    try:
        feed = feedparser.parse(url)
        weather_items = []
        for item in feed.entries:
            title = item.title
            description = item.description.strip() if hasattr(item, 'description') else "Keine Beschreibung verfügbar."
            weather_items.append((title, description))
        return weather_items
    except Exception as e:
        sys.stderr.write(f"RSS-Fehler: {e}\n")
        sys.stderr.flush()
        return []


def main():
    # Initialize the AGI environment
    init_env()

    # URL of the weather RSS feed (fiktives Beispiel)
    rss_url = "https://www.***.**/***_rss/***.xml"

    # Fetch weather data
    weather_data = fetch_weather_from_rss(rss_url)

    # Extract the "Allgemeine Wetterlage"
    general_weather = next((desc for title, desc in weather_data if "Allgemeine Wetterlage" in title), None)

    if general_weather:
        sys.stderr.write(f"General Weather: {general_weather}\n")
        sys.stderr.flush()

        # Convert the general weather report to audio and play it
        play_text_as_audio(general_weather, output_file="general_weather")
    else:
        sys.stderr.write("No 'Allgemeine Wetterlage' found in the RSS feed.\n")
        sys.stderr.flush()
        play_text_as_audio("Leider konnten keine Wetterdaten abgerufen werden.", output_file="error_weather")


if __name__ == "__main__":
    main()

Das Skript wird als AGI-Skript in Asterisk verwendet, was bedeutet, dass es direkt in Dein Telefonsystem eingebunden werden kann. Es verwendet das Modul asterisk2_agi.py, das sehr viel Programmierarbeit erspart. Hier ist es genau erklärt. Bitte lese dir die Anleitung genau durch:

Asteriskpythonagi Gtts150px
So illustriert DALL-E die Begeisterung für Python und Asterisk
Text-to-Speech für Asterisk: Texte mit Google gTTS in Sprache umwandeln – 10. Januar 2025: Eine neue Ansage für deine Asterisk-Telefonanlage wird gebraucht, und schon beginnt die Suche nach der passenden Datei – oder noch schlimmer, du musst sie selbst aufnehmen. Das geht viel einfacher! Mit Google Text-to-Speech (gTTS) und ein bisschen Python kannst du Texte in natürlich klingende Sprachansagen umwandeln und direkt in Asterisk nutzen. – weiter

Sobald ein Anruf getätigt wird, startet das Skript ***.py und arbeitet wie folgt:

Erstmal die Vorbereitung: Zunächst wird die Asterisk-Umgebung initialisiert, damit das Skript mit Deinem Telefonsystem kommunizieren kann. Diese Initialisierung erfolgt durch das Modul asterisk2_agi, das sicherstellt, dass alles korrekt verläuft.

Wetterdaten aus dem RSS-Feed holen: Das Skript greift auf einen RSS-Feed von wetter.com zu, um aktuelle Wetterdaten abzurufen. Es verwendet das Python-Modul feedparser, um die XML-Daten zu analysieren. Dabei werden alle Einträge im Feed durchlaufen, und Titel sowie Beschreibung der Wetterberichte werden gesammelt. Der Fokus liegt auf dem Eintrag „Allgemeine Wetterlage“, der die zentrale Wetterzusammenfassung enthält.

Text zu Sprache umwandeln: Wenn die allgemeine Wetterlage gefunden wurde, wird diese mithilfe der Funktion play_text_as_audio in eine Audiodatei umgewandelt. Dazu wird der Text an einen Dienst wie Google Text-to-Speech (gTTS) gesendet, der eine MP3-Datei zurückliefert. Diese Datei wird in das WAV-Format konvertiert, um sie schließlich direkt über Dein Telefonsystem abzuspielen. Falls kein passender Wetterbericht gefunden wird, informiert Dich das Skript ebenfalls freundlich darüber.

Was musst Du vorher installieren? Damit das Skript reibungslos funktioniert, ist eine Vorbereitungen. Du musst nur das Modul feedparser installieren, damit das Skript die XML-Datei lesen kann:

pip install feedparser

Vorausgesetzt die asterisk2_agi.py funktioniert bereits, müsste das Skript funktionieren und den Wetterbericht für Deutschland mit eine weiblichen Stimme von Google aufsagen.

So rufst du das Skript in der extensions.conf von Asterisk auf: Wähle laut Beispiel die 555 und das Skript sagt den aktuellen Wetterbericht auf.

exten => 555,1,Noop(Anruf erfolgt von: "${CALLERID(name)}" <${CALLERID(num)}>) 
 same => n,Noop(***.** AKTUELLES WETTER ANSAGEN, Sprache: DEUTSCH)
 same => n,Set(CHANNEL(language)=de) ; Deutsche Voice Prompts verwenden
 same => n,Answer()    
 same => n,AGI(***.py)
 same => n,Hangup()