Robbenradio

Webprojekte von Steffen Schultz

SeWiRa: Mein eigenes WLAN-Radio

11.03.2025 von Steffen

Ein nostalgisches Holzradio im Vintage-Stil. Auf der Vorderseite befinden sich zwei große Lautsprecher, einer links und einer rechts. Zwischen den Lautsprechern befindet sich links ein Lautstärkeregler und rechts ein Computer-Ziffernblock. In der Mitte zwischen diesen Bedienelementen befindet sich ein kleiner LCD-Bildschirm, der eine Textoberfläche im Terminal-Stil anzeigt. Im oberen Bereich der Frontplatte ist der Schriftzug „SEWIRA“ in einem dekorativen, verschnörkelten Logo elegant eingraviert. (Bild erstellt mittels ChatGPT/DALL·E)

Ja, auch ich konsumiere inzwischen viel Musik, Hörbücher und Podcasts on demand. Trotzdem mag ich nach wie vor gut gemachtes Radio, sei es moderiert oder als gut sortierte Festplatten-Jukebox. Unter meinen zahlreichen Retro-Empfängern befindet sich auch ein halbwegs zeitgemäßes WLAN-Radio, mit dem ich aber nie ganz zufrieden war und deshalb schon lange von einer besseren Alternative geträumt habe.

Moderne Weltempfänger mit Einschränkungen

Die Implementierung der meisten WLAN-Radios basiert auf einem Anbieterportal, das alle Sender zur Verfügung stellt. Am Gerät selbst gibt es nur ein Menü, in dem man seine Lieblingssender auswählen oder ganz neue Sender entdecken kann. Je nach Hersteller lassen sich die Favoriten auch etwas komfortabler mit einer begleitenden App oder mit persönlichem Login auf der Portalseite verwalten, wo oft auch eigene Streams hinterlegt werden können. Für die meisten Anwendungsfälle ist das wahrscheinlich die komfortabelste Lösung, aber ich hatte schon immer eine bessere Umsetzung im Kopf. Warum sollte es nicht möglich sein, alle Sender lokal auf dem Gerät zu verwalten, z. B. über ein kleines Webinterface? Mit Radio-Browser.info steht eine frei zugängliche Senderdatenbank zur Verfügung, die dank Datenbank-Dump bei einem Serverausfall auch offline genutzt werden könnte. Die Informationen benötigen nicht viel Speicherplatz, so dass es eigentlich ein Leichtes wäre, auch preisgünstige Empfänger mit entsprechender Software auszustatten.

Ein weiteres Problem heutiger Digitalradios betrifft die Gruppe der blinden und sehbehinderten Nutzer, zu denen auch ich gehöre. Früher schaltete man ein Radio ein und suchte seinen Lieblingssender per Drehknopf, Suchlauf, Speichertaste oder sogar durch direkte Frequenzeingabe. In Zeiten von DAB+ und Internetradio ist das zwar je nach Radio zum Teil noch möglich, aber vor allem bei WLAN-Radios ist erst einmal ein Einrichtungsprozess nötig, der meist nicht barrierefrei zu bewältigen ist. Ohne Display ist heute kaum ein Gerät vollständig bedienbar. Zwar gibt es auch für uns mit Smartphone, Tablet oder dem guten alten Rechenknecht auf dem Schreibtisch genügend Ausweichmöglichkeiten für barrierefreies Radiohören, aber ich war in bestimmten Fällen schon immer ein Freund des Ein-Ding-Prinzips, also von Geräten und Anwendungen, die für eine Sache gemacht sind und diese gut und zuverlässig erledigen. Es war also höchste Zeit für ein eigenes WLAN-Radio. Zumindest mein Bedienkomfort sollte endlich wieder stimmen.

Mit Himbeerkuchen zum Erfolg

Da ich kein Elektroniker bin und daher fertige Komponenten verwenden muss, bot sich ein Einplatinencomputer an. Seit vor über 10 Jahren der erste Raspberry Pi auf den Markt kam, faszinieren mich diese scheckkartengroßen Platinen, von denen sich im Laufe der Zeit mehrere Generationen in meinem Schrank angesammelt haben. Die Hardware zusammenzustellen war also einfach, denn im Grunde brauchte ich nur den Computer, eine halbwegs passable Soundkarte und ein paar aktive Lautsprecher. Dinge also, die wahrscheinlich jeder schon zu Hause hat. Da ich auch eine blinde Bedienung am Gerät selbst im Sinn hatte, entschied ich mich für einen Nummernblock, den ich ebenfalls irgendwo in meinem Elektronikchaos fand. Natürlich könnte man das Ganze auch in ein großes Gehäuse packen, ein ausgemustertes Röhrenradio zum Beispiel. Da ich damit aber keinen Schönheitswettbewerb gewinnen wollte, reichte mir die lose Anordnung der Komponenten vorerst. Der Raspberry Pi ist derzeit an den Audioeingang eines Technisat-Digitalradios angeschlossen und dahinter kaum zu sehen, so dass der Eindruck entsteht, die Internetradiowiedergabe sei Teil des Radios.

Spannender war die Implementierung der Software. Ich beschloss, klein anzufangen und arbeitete mich in die fortgeschrittene Programmierung von Shell-Skripten ein. Mein Ziel war es, ein Verzeichnis mit M3U-Dateien anzulegen, von denen jede genau einen Radiostream enthielt. Neue Streams sollten dann per SSH-Zugriff hochgeladen werden. Mit Hilfe eines Scripts sollte aus diesem Verzeichnis ein Menü erzeugt werden, das bei Eingabe einer Nummer den jeweiligen Sender startet. Das Menü sollte immer geöffnet bleiben, um auf weitere Eingaben zu warten. Ähnlich wie bei der Eingabe einer Kurzwellenfrequenz in einem alten Weltempfänger. Eine direkte Steuerung des Players während des Abspielens hatte ich bewusst nicht vorgesehen, da die Lautstärke ohnehin am Ausgabegerät geregelt werden würde. Da ich natürlich keinen eigenen Player für die Wiedergabe programmieren konnte, habe ich mich für eine Software entschieden, die sich einfach in das System installieren lässt. Meine Wahl fiel auf MPV, da dieser Player auch ohne grafische Oberfläche funktioniert. Als Bonus habe ich noch eine Ansage eingebaut, die beim Senderwechsel den Namen vorliest. In einigen Detailfragen ließ ich mich von ChatGPT beraten, aber am Ende hatte ich mein erstes eigenes Shell-Skript zur Steuerung des Radios, das ich auf den Namen SeWiRa (Selfmade WiFi Radio) taufte. Marktreif war diese Lösung natürlich nicht, zumal es keine Datenbankanbindung zum Auffinden neuer Sender gab. Da ich damit aber ohnehin nur meine Lieblingssender hören wollte, war das zunächst auch nebensächlich.

Was kann die KI damit anfangen?

Nachdem ich nun die Grundidee umgesetzt hatte, war ich neugierig, was man mit sogenannter künstlicher Intelligenz noch herausholen kann. Programmieren mit diesen generativen Sprachmodellen fühlt sich auf den ersten Blick so an, als würde man in der Schule die Hausaufgaben vom Banknachbarn abschreiben, und so ist es wohl auch. Man profitiert durch die Trainingsdaten solcher Systeme von der Arbeit anderer, aber das gilt im Grunde auch für den eigenen Verstand, wenn man alles selbst lernen müsste. Dennoch sind es nach wie vor die Ideen, die über den Erfolg eines Projektes entscheiden, und hier hat der Mensch vorerst noch das erste und letzte Wort. Einfach zu sagen, dass man gerne ein paar Fehlerkorrekturen und Verbesserungsvorschläge für das vorliegende Skript hätte, bringt wenig bis gar nichts. Im schlimmsten Fall funktioniert am Ende die Software nicht mehr und man hat alle Mühe, den eigenen Code überhaupt noch zu verstehen. Also fing ich noch einmal von vorn an und stellte dem Sprachmodell meinen Plan vor, zusammen mit der Frage, in welcher Programmiersprache ich die Funktionen umsetzen sollte. Die Wahl fiel auf Python, obwohl meine Kenntnisse darin kaum erwähnenswert sind. Aber ich habe mich darauf eingelassen, weil ich bisher am besten mit nützlichen Codebeispielen gelernt habe.

Auch ohne Sprachkenntnisse hatte ich bald eine von Grund auf neu erstellte Python-Implementation, die funktional fast auf dem gleichen Stand war wie das Bash-Skript. Nur die Ansage der Stationsnamen ließ sich nicht so einfach integrieren, da ich das Python-Skript plattformübergreifend machen wollte und es dafür zunächst keine einfache Lösung gab. Da ich gerade dabei war, integrierte ich gleich noch die Unterstützung für automatisches Abspielen beim Programmstart, machte die Oberfläche mehrsprachig und gab dem Skript eine Konfigurationsdatei für individuelle Benutzereinstellungen mit, die sogar als Kommandozeilenoptionen übergeben werden konnten. Die restliche und wohl zeitaufwendigste Arbeit bestand in der Fehlersuche und dem Hadern mit den Eigenheiten der Betriebssysteme (nein, eigentlich nur die blöden Eigenheiten eines ganz bestimmten Betriebssystems). Aus den ursprünglich ca. 80 Zeilen Bash-Code sind mittlerweile stolze 300 Zeilen Python-Code geworden, deren Inhalt ich aber immer noch so gut verstehe, dass ich sie ruhigen Gewissens auf die Menschheit loslassen kann, auch wenn außer mir wohl niemand ein solches Retro-Tool benutzen wird.

Interessant war übrigens auch das Verhalten der von mir verwendeten KI's bei der Umsetzung meiner Anweisungen. Zuerst versuchte ich es mit ChatGPT. Das Ergebnis funktionierte erst nach mehreren Anläufen zufriedenstellend und ich verbrachte Stunden damit, Missverständnisse während der Konversation zu korrigieren. Dann gab ich Claude AI den Code, den ich zuvor mit ChatGPT erstellt hatte, und bat das System, in Erwartung der üblichen Halluzinationen, um ein allgemeines Debugging. Umso erstaunter war ich, als Claude mir stattdessen einen scheinbar komplett neu geschriebenen Code ausspuckte, der sogar auf Anhieb funktionierte. Während ChatGPT den Code nur grob strukturierte, lieferte mir Claude eine komplette Klasse mit Funktionen. Ein wenig schien mir der Code unnötig aufgebläht, da sich einige Programmanweisungen wiederholten. Aber auch das ließ sich schnell optimieren. Auch im Gespräch zeigte sich, dass Claudes Sprachmodell besser auf die Bedürfnisse von Programmierern abgestimmt zu sein scheint. Manchmal kam ich mir sogar wie ein dummer Schüler vor, wenn Claude einen Code erstellte, den ich natürlich prompt falsch in das Programm einfügte. Nach der entsprechenden Rückmeldung des Fehlers hatte ich den Eindruck, dass mir die KI eine subtile Rüge für meine Unwissenheit erteilte. Am Ende war ich aber mit dem Ergebnis mehr als zufrieden und hätte es selbst kaum so gut hinbekommen.

Fazit

Über Sinn und Unsinn von künstlicher Intelligenz lässt sich an anderer Stelle trefflich streiten. Für mich war sie eine große Hilfe bei der Umsetzung meiner Ideen, und darauf kommt es schließlich an. Meinem Ziel eines eigenen WLAN-Radios bin ich ein großes Stück näher gekommen. Natürlich gäbe es noch einiges zu optimieren, aber allein für den Spaß, per Zifferneingabe blitzschnell durch meine gespeicherten Sender zu zappen, hat sich die Arbeit auf jeden Fall gelohnt. Während andere Radios nur wenige Stationstasten haben, kann ich per Direktwahl auf beliebig viele Sender zugreifen. Vielleicht beschäftige ich mich irgendwann noch einmal mit der Hardware und besorge mir das Gehäuse eines alten Röhrenradios, damit der Retro-Charme perfekt wird.

Wer sich für dieses und andere kleine Softwareprojekte interessiert, findet alle weiteren Informationen sowie Links zu den Code-Repositorys auf einer eigens dafür eingerichteten Unterseite meiner Website. Unter anderem habe ich in ähnlicher Weise ein Bash-Skript zur Steuerung mehrerer Serverinstanzen der Sprach- und Videokonferenzsoftware TeamTalk erstellt.

Kommentare: 0