FreeSWITCHs record-App zerlegt ihre Argumente an Leerzeichen
(record <pfad> <zeitlimit> <stille-schwelle> <stille-treffer>). Liegt das
Projekt unter einem Pfad mit Leerzeichen, nimmt sie den Teil bis zum ersten
Leerzeichen als Pfad und den Rest als Zahlenargumente. Die Aufnahme landet
dann ohne Endung neben dem Projekt (roh im Codec-Format, z. B. Server.PCMA),
der Eingang bleibt leer, der Watcher sieht nie etwas.
Der Fehler tarnt sich: die Ansage laeuft normal, weil playback sein Argument
am Stueck nimmt. Es sieht deshalb nach einem Watcher-Problem aus, nicht nach
einem Pfadproblem.
einrichten.sh prueft das jetzt vorab und nennt den Ausweg (Symlink ohne
Leerzeichen, Skript darueber aufrufen). Aufgetreten auf der zweiten Maschine.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013pj3mSmL397czPaCfbL27Z
pipe/server.py rief fs_cli mit fest verdrahtetem Port 8099 auf (Wert vom
Ursprungsrechner) statt den Wert aus der Config zu lesen - auf einer Maschine
mit abweichendem Event-Socket-Port (hier 8022) zeigte der Leitstand "Telefon:
unklar", obwohl der Trunk laengst registriert war. Neue FS_PORT-Variable in
pipe/config.py (Default 8021, wie starten.sh es ueber die .env erwartet).
DECK_STAPEL in .env.example war unquotiert - das Leerzeichen in "In
Bearbeitung" bricht das `source .env` in telefon/freeswitch/einrichten.sh
(bash interpretiert es als zweites Kommando). Wert jetzt in Anführungszeichen.
test/erzeuge_beispiele.sh erzeugt die im README/MITGABE referenzierten
Test-Anrufe (rezept/termin/notfall) lokal per macOS "say" - vorher liefen die
Beispielbefehle aus einem frischen Klon ins Leere, weil test/*.wav bewusst
gitignoriert ist.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PuP3zfgYqhnrwyEne2ejG7
Der Event-Socket-Port war fest auf 8099 vorgegeben - ein Wert, der nur auf dem
ersten Rechner stimmt. Auf der zweiten Maschine hoert FreeSWITCH auf 8022;
fs_cli antwortet dann nicht, starten.sh sieht den Trunk nie als registriert und
bricht ab, obwohl alles laeuft.
starten.sh uebernimmt die Werte jetzt aus der .env - wie pipe/config.py, mit
Vorrang fuer bereits gesetzte Umgebungsvariablen. FS_PORT und FS_ETC stehen
dokumentiert in .env.example.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013pj3mSmL397czPaCfbL27Z
Sammelt, was beim Aufsetzen auf einer frischen Maschine fehlt: die nicht im
Repo liegenden Teile, der kurze Weg über Stufe 1 ohne Telefonie, eine
Prüfleiter und die Fallen aus dem ersten Volltest.
Dabei drei Lücken geschlossen, die drüben zugeschlagen hätten:
- NEXTCLOUD_DECK fehlte in .env.example. DECK_STAPEL und DECK_TEILEN stehen
dort, der Hauptschalter nicht — die Pipe legt dann kein Board an, obwohl
alles richtig aussieht.
- WHISPER_MODELL/WHISPER_COMPUTE galten laut Vorlage allgemein, greifen aber
nur bei STT_BACKEND=faster. Standard ist whispercpp. Jetzt sind beide Blöcke
getrennt und STT_BACKEND, WHISPERCPP_BIN/_MODELL, WHISPER_THREADS,
NEXTCLOUD_USERID und FREESWITCH_LOG dokumentiert.
- README hatte eine doppelte Überschrift.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013pj3mSmL397czPaCfbL27Z
Die bisherigen "Voraussetzungen" reichten für eine Neuinstallation nicht: Es
fehlten FreeSWITCH, Piper samt Stimme, der Download des Whisper-Modells und
zwei Python-Pakete. Wer das Repository frisch geklont hat, wäre damit nicht
weit gekommen.
- requirements.txt: piper-tts und certifi ergänzt. certifi ist keine Kür — das
Python von python.org bringt keinen System-Zertifikatsspeicher mit, ohne das
Bundle scheitern die HTTPS-Aufrufe zu Nextcloud und der Stimmen-Download.
- README: Einrichtung in sechs Schritten, alle Befehle gegengeprüft (Formeln
vorhanden, Modell-Links erreichbar).
- Abschnitt "Stolpersteine" mit den vier Dingen, die hier Zeit gekostet haben:
FreeSWITCH liest aus dem Cellar, belegter Event-Socket-Port, rotierende
Provider-Adressen als Ursache für abbrechende Registrierungen, und der
Leitstand, der ohne Passwort nicht ins Netz geht.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017V57oXiDLi4nSsyau5qaA2
Der Screenshot zeigt das Board mit allen vier Spalten, dem Verlauf darüber und
den Dienste-Ampeln darunter. Die Anrufe darin sind erfunden — er wurde aus einem
eigens angelegten Beispieldatensatz erzeugt, nicht aus dem Betrieb, damit keine
echten Rufnummern ins Repository gelangen.
Dazu ein Hinweis in der README, dass alle Namen, Nummern und Anliegen im
Repository Platzhalter sind, "Praxis Musterhausen" eingeschlossen.
Außerdem: Der Pfad zum Log der Telefonanlage ist jetzt über FREESWITCH_LOG
konfigurierbar statt fest verdrahtet — nötig, um den Leitstand gegen einen
anderen Datenbestand laufen zu lassen.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017V57oXiDLi4nSsyau5qaA2
Nimmt Anrufe einer Hausarztpraxis entgegen, transkribiert sie lokal,
kategorisiert das Anliegen und legt es strukturiert ab. Keine Patientendaten
verlassen den Rechner: Spracherkennung, Sprachmodell und Sprachsynthese laufen
lokal, im Datenpfad steht kein Cloud-Dienst.
Aufbau:
- FreeSWITCH nimmt über einen SIP-Trunk an, spielt die Ansage und nimmt auf.
- pipe.watch erkennt fertige Aufnahmen und schiebt sie durch die Pipe.
- whisper.cpp transkribiert, ein lokales Sprachmodell (Ollama) ordnet in
Kategorie und Dringlichkeit ein — mit erzwungenem JSON-Schema.
- Ablage lokal, optional Nextcloud (WebDAV) und ein Deck-Board.
- Leitstand (pipe.server): Board mit Eingang/In Bearbeitung/Rückfragen/Erledigt,
Aufnahmen zum Anhören, Verlauf und Ampeln für alle beteiligten Dienste.
Zugangsdaten und Anrufdaten liegen außerhalb des Repositorys (.env, ablage/,
telefon/). Konfiguration siehe .env.example, Einrichtung siehe README.