Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dockerimage #97

Open
geimist opened this issue Nov 12, 2024 · 69 comments
Open

Dockerimage #97

geimist opened this issue Nov 12, 2024 · 69 comments

Comments

@geimist
Copy link

geimist commented Nov 12, 2024

Wäre es nicht praktisch, ein Dockerimage zum selbshosten des ABs bereitzustellen? Ich weiß nicht, wie kompliziert eine manuelle Installation ist und wie modular die Projekte (Frontend, CardDAV-Server, AB) aufgebaut sind. Es müssten halt ein paar Umgebungsvariablen festgelegt werden können (Sip User und Kennwort könnte in dem Fall der User angeben und halt die URL zur FritzBox).
Zusätzlich müsste noch ein Sync für die Spamliste implementiert werden und als opt-in ein Rückkanal, damit PhoneBlock die Trefferquote validieren kann.

einige Vorteile, die ich sehe:

  • Diese Möglichkeit würde halt ggf. bestehende Datenschutzbedenken minimieren.
  • Mit Docker als externe Installationsmöglichkeit hätte man den Vorteil, dass die Installation in sich sehr konsistent ist (das Image läuft einfach, sofern die CPU Architektur und das OS passt).
  • Senkung der Latenz / die Wahrscheinlichkeit, dass andere Telefone klingeln wird minimiert #36 (3.)
  • Kein DDNS Trouble (Zwangstrennung, DS-Lite, nicht vertrauenswürdiges Cert der FB, ect.) #81
  • Mehrere lokale FritzBoxen sind so individuell konfigurierbar #36 (3.)
  • Der IP-Fon-Anschluss der FritzBox für den AB müsste nicht aus dem Internet erreichbar gemacht werden.

Bitte entschuldige, falls das falsch rüberkommt:
Ich möchte hier nicht fordernd auftreten. Das sind nur ein paar Gedanken und Begehrlichkeiten, die so bei einem Neueinsteiger geweckt werden 🤗

@Revan335
Copy link

Wie im anderen Thema bereits geschrieben, wäre das very nice!

@haumacher
Copy link
Owner

Lokale Installation ist auf jeden Fall zu bevorzugen, das ist keine Frage. Das ist auch jetzt schon möglich, es gibt aber noch keine vernünftige Anleitung dafür. Das Modul "phoneblock-ab" baut eine Java-Anwendung, die man "einfach" lokal starten kann, überall da wo man eine Java 17 VM zur Verfügung hat - Windows, Linux, RaspberryPI:

Das Problem bei einem Docker-Image ist die Tatsache, dass das VOIP/RTP-Protokoll, dass der AB mit der Fritz!Box sprechen muss, nicht wie HTTP eine Einwegekommunikation ist, sondern beide Beteiligten müssen sich gegenseitig "aufrufen" können. Wenn man den AB in ein Docker-Image packt, dann muss man alle Ports, die für diese Kommunikation notwendig sind. von dem Docker-Image an Host weiterleiten, was die Konfiguration noch aufwendiger und fehleranfälliger macht. Auf jeden Fall möglich, aber nicht simpel. Eine "normale" Installation als Service auf einem RaspberryPI hat aber weniger Fehlerpotential. Siehe #90.

@geimist
Copy link
Author

geimist commented Nov 13, 2024

Für den Fall kann man das Netzwerk des Containers statt im Bridge- im Host-Mode laufen lassen. Damit kann er frei sprechen und hören.
(Ich frage für mein Synology NAS, wo man grundsätzlich nicht ohne Drittanbieter eine Laufzeitumgebung wie Java installieren kann, aber Docker vorhanden ist)

Wäre es eine Möglichkeit, die kompilierte Java Anwendung in den Releases zur Verfügung zu stellen? Da müsste die nicht jeder selbst bauen, wenn sie statisch kompiliert eh für jeden gleich ist (ich hatte bisher noch keine Berührung zu Java). Das wäre vielleicht ein guter Startpunkt, oder?

@haumacher
Copy link
Owner

haumacher commented Nov 14, 2024

... Containers statt im Bridge- im Host-Mode laufen lassen...

Das kingt gut - da sieht man, dass ich mich mit Container zu wenig auskenne... :-)

...für mein Synology NAS, wo man grundsätzlich nicht ohne Drittanbieter...

Ja, das ist natürlich eine vollkommen valide Anforderung - sollten wir ausprobieren.

Wäre es eine Möglichkeit, die kompilierte Java Anwendung in den Releases zur Verfügung zu stellen?

Ja, das bereite ich vor. Angefangen habe ich schon mal das Build&Configure&Run zu beschreiben: https://github.com/haumacher/phoneblock/tree/master/phoneblock-ab aber wenn man das ganze Tooling noch nicht hat (Maven & Co) dann ist es etwas lästig, ja.

@haumacher
Copy link
Owner

haumacher commented Nov 14, 2024

Um so ein Docker-Image "vernünftig" (=massentauglich) nutzen zu können, müsste dieses auch eine Konfigurations-Weboberfläche anbieten, da man doch eine ganze Reihe Optionen ausfüllen muss und WAV-Files für die Ansagetexte zur Verfügung stellen muss. Das muss aber eigentlich alles in das Dockerimage rein.

@geimist
Copy link
Author

geimist commented Nov 14, 2024

GUI finde ich super, aber so etwas ist für mich immer ein rotes Tuch, weil ich da 0 dazu beitragen kann.
Man sollte doch das Meiste über Umgebungsvariablen realisieren können (oder man bindet ein JSON für die Konfiguration ein, welches der User im Hostsystem modifizieren kann).

Welche Parameter (von Benutzerseite) sind denn nötig?
Mir fällt ein:

  • FritzBox-URL
  • SIP-Username
  • SIP-Password
  • und ein Mount eines WAV-Files für den Ansagetext (optional mit Fallback zur aktuellen Methode).

Die Logs sieht man entweder direkt in Docker oder du schreibst in ein Logfile, welches man mit herausmappen könnte.

@hduelme
Copy link
Contributor

hduelme commented Nov 15, 2024

Für Docker-Images ist zu beachten, dass diese nicht plattformunabhängig sind. Es müssten Images für amd64 und arm und co bereitgestellt werden.

@geimist
Copy link
Author

geimist commented Nov 15, 2024

Das stimmt. Ich sehe das auch eher als Alternative für die klassische JAVA-Installation. Ein Dockerimage würde wohl hauptsächlich Linux mit x86_64 adressieren. Im vorliegenden Fall könnte man wahrscheinlich auch ein plattformunabhängiges Image erstellen. Das müsste man dann in einem weiteren Schritt probieren.

@haumacher
Copy link
Owner

Synology NAS - was ist denn das für eine Prozessor-Architektur?

@geimist
Copy link
Author

geimist commented Nov 15, 2024

Das lässt sich nicht pauschal beantworten. Die meisten Docker fähgigen Geräte haben eine x86_64 CPU. Das sind in der Regel dann die Anwender, die ihr NAS nicht nur als Datenspeicher betrachten, sondern eher als Homeserver.
Inzwischen gibt es aber auch schon welche mit arm64 (also Docker kompatible). Darüber hinaus gibt es noch diverse ARM-CPUs (in der Regel bei Einstiegsgeräten) ohne Docker Support, deren Anwender wahrscheinlich nicht die Zielgruppe sind.

@haumacher
Copy link
Owner

Es ist soweit - hier ist ein erster Aufschlag für ein Docker-Image, mit dem man den Answerbot lokal laufen lassen kann: https://hub.docker.com/r/phoneblock/answerbot

Jetzt seid Ihr am Zug... :-)

@geimist
Copy link
Author

geimist commented Nov 15, 2024

Du bist ja schneller als die Spammer 🤣

Gleich probiert und läuft 🙂
Klasse! Vielen Dank für deine Arbeit‼️

Noch eine Frage: Wie wird die FRITZ!Box adressiert? Wenn ich das richtig sehe, dann wohl über fritz.box. Wenn man aber mehrere Geräte (in einem Netzwerk) hat, wäre es vielleicht für den einen oder anderen User günstig, hier optional die gewünschte Adresse mit übergeben zu können. #36 (3.)

Ich würde außerdem noch vorschlagen, den Docker run Befehl noch etwas anzupassen:
docker run --network=host -d --rm --name phoneblock -v $PWD/conversation:/opt/phoneblock/conversation -e "USER=phoneblock" -e "PASSWD=your-password" phoneblock/answerbot:latest

  • mit -d läuft der Container im detached mode, d.h. im Hintergrund
  • --name phoneblock ist immer praktisch, um bei Containern die Übersicht zu wahren
  • WICHTIG: Deine Imagebezeichnung ist nicht vollständig: phoneblock/answerbot:latest

Oder als Docker-compose:

version: '3.9'
services:
  phoneblock:
    image: phoneblock/answerbot:latest
    container_name: phoneblock
    network_mode: host
    environment:
      - USER=phoneblock
      - PASSWD=your-password
    volumes:
      - ./conversation:/opt/phoneblock/conversation
    restart: unless-stopped

@geimist
Copy link
Author

geimist commented Nov 17, 2024

Was mir noch aufgefallen ist:
Aufnahmen werden ja sogar auch schon mit bereitgestellt. Prima – das hatte ich mir als ein Feature in der Zukunft vorgestellt. Allerdings werden diese im Rootverzeichnis des Containers abgelegt und nicht im Verzeichnis /opt/phoneblock/recordings, weil im Konfigfile /opt/phoneblock/.phoneblock die Zeile #recodings=/opt/phoneblock/recordings auskommentiert ist. Gibt es dafür einen Grund?
(Wenn ich das richtig sehe, kann man das mit der nächsten Version eh überschreiben).

Ich hab jetzt mal im Compose-File die Konfiguration mit gemappt. So kann man bequem vom Host aus nötige Anpassungen vornehmen.

    volumes:
      - ./conversation:/opt/phoneblock/conversation
      - ./recordings:/opt/phoneblock/recordings
      - ./phoneblock_config.conf:/opt/phoneblock/.phoneblock

Allerdings sind in den Aufnahmen nur die Audiosegmente des Anrufers. Der Dialog durch den AB ist so nicht nachvollziehbar. Ist das eine Konfigurationsfrage?

@hduelme
Copy link
Contributor

hduelme commented Nov 17, 2024

Aktuell wird in den Recordings nur das Ankommende Audio aufgezeichnet. Es wäre aber bestimmt möglich auch das ausgehende Audio da mit aufzunehmen.

Auch in der aktuellen Version kann der Befehlt überschrieben werden. Jedoch muss hier:
java - jar /opt/phoneblock/bin/phoneblock-ab.jar -f /opt/phoneblock/.phoneblock angegeben werden.

@geimist
Copy link
Author

geimist commented Nov 17, 2024

Auch in der aktuellen Version kann der Befehlt überschrieben werden. Jedoch muss hier:
java - jar /opt/phoneblock/bin/phoneblock-ab.jar -f /opt/phoneblock/.phoneblock angegeben werden.

Das entspricht bei mir dem Ausführungsbefehl des aktuellen Images.
Klappt also schon mit einer angepassten /opt/phoneblock/.phoneblock. 😊

@sig10680
Copy link

Hallo,
ich wollte es gerade mal auf meinen Raspberry Pi 4 im Docker starten, aber es wird kein passendes Plattform gefunden. Wäre es möglich noch für den Pi aarch 64 (platform (linux/arm64/v8) mit einzubauen? Das wäre echt toll.

Kann ich dann in der Config Datei auch statt der Fritz.box auch eine IP Hinterlegen? Sind die Audiofile sehr wichtig oder kann man diese auch zum Anfang weglassen?

MFG sig10680

@hduelme
Copy link
Contributor

hduelme commented Nov 18, 2024

@sig10680 Anstelle der Domain fritz.box kannst du auch die IP deines Routers eintragen. Du kannst die Audiodatei auch weglassen, dies führt aktuell aber dazu, dass der Anrufende in kein Gespräch verwickelt wird und es kann zu Fehlern im Log kommen.

Es wäre prinzipiell auch möglich Multiplattform Images bereitzustellen. Hier ist aber noch ein wenig Vorarbeit notwendig.

@sig10680
Copy link

@hduelme Es wäre prinzipiell auch möglich Multiplattform Images bereitzustellen. Hier ist aber noch ein wenig Vorarbeit notwendig.

Kann ich da irgendwie helfen?

@hduelme
Copy link
Contributor

hduelme commented Nov 18, 2024

@sig10680 in der Dokumentation von Docker werden 3 Möglichkeiten zum Bauen für Multiplattform beschriebe. Ich denke die für dieses Projekt nützlichste Möglichkeit ist QEMU. Ich probiere das einmal aus und würde dann in meinem Merge-Request #100 eine Anleitung hinterlegen.

Sobald das Neue Image bereitgestellt ist, könntest du einmal testen, ob es für dich funktioniert und uns Feedback geben.

@sig10680
Copy link

@hduelme Sobald das Neue Image bereitgestellt ist, könntest du einmal testen, ob es für dich funktioniert und uns Feedback geben.

Danke wenn es verfügbar ist werde ich es Testen und mich wieder melden!

Danke sig10680

@geimist
Copy link
Author

geimist commented Nov 18, 2024

Ich denke die für dieses Projekt nützlichste Möglichkeit ist QEMU

Ich wollte es gerade bei mir probieren, aber leider enthält meine Dockerinstanz kein buildx.
Wäre das nicht der einfachste Weg, oder bin ich da zu blauäugig? Das zugrunde liegende Java-Image sollte eh mulitiarchfähig sein und sonst gibt es doch keine CPU-Abhängigkeit im Dockerfile.

docker buildx create --use
docker buildx build --platform linux/amd64,linux/arm64 -t phoneblock:latest .

@hduelme
Copy link
Contributor

hduelme commented Nov 18, 2024

@geimist ich hab gerade ein Anleitung für das Nutzen von buildx in den Merge-Request hinzugefügt. Unter Ubuntu und WSL sollte das Bauen damit funktionieren.

@haumacher
Copy link
Owner

Was mir noch aufgefallen ist: Aufnahmen werden ja sogar auch schon mit bereitgestellt. Prima – das hatte ich mir als ein Feature in der Zukunft vorgestellt. Allerdings werden diese im Rootverzeichnis des Containers abgelegt...

Eigentlich ist die Aufnahme ein optionales Feature, das per-default ausgeschaltet ist. Das scheint aber in dem Image so nicht richtig zu funktionieren. Ob man das hierzulande überhaupt einschalten darf, weiß ich gar nicht. Verbrecher stehen ja unter Schutz und das Anfertigen eines Telefonmitschnitts würde ja ein Beweismittel erzeugen - das ist - wie die Videoaufnahme eines Taschendiebs - nur mit vorheriger Zustimmung des Verbrechers erlaubt - oder so ähnlich :-)

@geimist
Copy link
Author

geimist commented Nov 18, 2024

Dann weist man halt bei der Begrüßung darauf hin, sofern man das Feature aktiviert.
Aber ja: mit Dashcams ist es ja das Gleiche. 🙈

@haumacher
Copy link
Owner

Habe mit @hduelme 's Anleitung Images für linux/amd64, linux/arm/v7 und linux/arm64/v8 erzeugt und auf dockerhub gepusht: https://hub.docker.com/r/phoneblock/answerbot/tags

@sig10680
Copy link

Ich werde es morgen mal auf meinen Pi testen! DANKE für die Erstellung.

@haumacher
Copy link
Owner

Ich habe die Umgebungvariablen USER und PASSWD noch zu SIP_USER und SIP_PASSWD angepasst, um ein Clash mit der Standard-Umgebungsvariable "USER" zu vermeiden. Die Besschreibung auf https://hub.docker.com/repository/docker/phoneblock/answerbot/general ist entsprechend angepasst und ein Link zu einem Docker-Compose-Script ist hinzugefügt, mit dem man eine Vielzahl der Optionen setzen kann.

Wenn ich allerdings mehr als einen Bot auf derselben Maschine laufen lassen wollte, dann müsste ich für jeden Bot unterschiedliche Ports vergeben. In der Konfiguration kann man das anpassen, aber das EXPOSE-Kommando in dem Dockerfile kann man ja nicht mehr anpassen. Es reicht auch nicht, einfach extern die Ports umzumappen, da die Ports in die SIP-Kommunikation eingebaut werden müssen - da ist wohl noch ein offener Punkt.

@geimist
Copy link
Author

geimist commented Nov 18, 2024

Prima - läuft 👌
Was mir aufgefallen ist: in dem Composefile ist die Zeile 16 ein Duplikat von Zeile 10.

@sig10680
Copy link

Hallo,
ich habe es auf meinen Raspberry getest und auf den ersten Blick läuft alles! Ausser wenn ich den Bot Intern Anrufe kommt folgende Fehlermeldung!

`[org.mjsip.ua.registration.RegistrationClient]: Registration of sip:[email protected]:50060 timed out.

[2024-11-19 09:02:34] INFO: [org.mjsip.ua.registration.RegistrationLogger]: Registration of 'sip:[email protected]:50060' failed: Timeout

[2024-11-19 09:02:34] INFO: [org.mjsip.ua.registration.RegistrationClient]: Waiting 60s for next registration of sip:[email protected]:50060.`

Das ist meine config:
version: '3.9' services: phoneblock: image: phoneblock/answerbot:latest container_name: phoneblock network_mode: host environment: - VIA_ADDR=192.168.0.86 - VIA_ADDR_V6=fe80::b814:5374:32c8:8e38 - HOST_PORT=50060 - REGISTRAR=192.168.0.200 - ROUTE=192.168.0.200;lr - REALM=192.168.0.200 - SIP_USER=phoneblock - SIP_PASSWD=123456 - PHONEBLOCK_USERNAME=123456 - PHONEBLOCK_PASSWORD=123456 - MEDIA=audio 4080 RTP/AVP { 8 PCMA 8000 160 } - MIN_SILENCE_TIME = 1500 - PADDING_TIME = 500 - SILENCE_DB = -35 - MEDIA_PORT=50100 - PORT_COUNT=10 - RECODINGS=none - CONVERSATION=/opt/phoneblock/conversation - TZ=Europe/Berlin volumes: - /home/pi/docker/phoneblock_ab/conversation:/opt/phoneblock/conversation - /home/pi/docker/phoneblock_ab/recordings:/opt/phoneblock/recordings restart: unless-stopped

Vielleicht habt ihr eine Idee!

@geimist
Copy link
Author

geimist commented Nov 22, 2024

Irgendetwas scheint mit dem aktuellen Image noch nicht zu passen. Ich hatte es nicht gleich gemerkt, weil im Log keine Fehlermeldungen zu sehen sind und ein Testanruf auch Ansagen bringt. Allerdings keine Ansagen aus dem Pool "question". Auch werden keine (aktivierten) Aufnahmen abgelegt. Das Konfigfile habe ich testweise mit "-f none" auch deaktiviert. Ich gehe davon aus, dass der AB den Anrufer gar nicht hört (keine Reaktion auf den Anrufen / keine Aufnahme).

Zum Test bin ich jetzt mal wieder auf das 1. Image zurückgewechselt (inkl. angepasstem Composefile – ich hatte mir das Image zum Glück gesichert) und da funktioniert es wieder.

@hduelme
Copy link
Contributor

hduelme commented Nov 22, 2024

@geimist die Änderung im Neuen Docker-File ist, dass der Nutzer nicht mehr Root sondern phoneblock 999 ist. Wohin mountest du die Verzeichnisse? Und darf der Nutzer 999 darauf schreiben und lesen?
Wenn du die Zeile:

user: 0:0

in deine Compose-File hinzufügst, läuft der wieder als Root

@geimist
Copy link
Author

geimist commented Nov 22, 2024

Das Verzeichnis hat Schreibrechte für everyone (777).
Dass der AB offensichtlich nichts hört, merkt man aber auch am Gespräch.

EDIT:
Ich habe mal zum Test den Mount entfernt. Das Recordingsverzeichnis im Container bleibt auch da leer.

@sig10680
Copy link

@hduelme hier mein log und mit realm=fritz.box

`-----End-of-message-----

[2024-11-22 12:21:44] INFO: [org.mjsip.sip.provider.SipProvider]: Sent message to: 192.168.0.200:5060/udp (477 bytes).

-----Begin-of-message-----

REGISTER sip:192.168.0.200 SIP/2.0

Via: SIP/2.0/UDP 192.168.0.86:5060;branch=z9hG4bK754740c5

Route: sip:192.168.0.200;lr

Max-Forwards: 70

To: sip:[email protected]

From: sip:[email protected];tag=585142730710

Call-ID: [email protected]

CSeq: 1 REGISTER

Contact: sip:[email protected]

Expires: 3600

User-Agent: mjsip 1.9.0-SNAPSHOT

Content-Length: 0

-----End-of-message-----

[2024-11-22 12:21:44] INFO: [org.mjsip.ua.registration.RegistrationClient]: Registration of sip:[email protected] timed out.

[2024-11-22 12:21:44] INFO: [org.mjsip.ua.registration.RegistrationLogger]: Registration of 'sip:[email protected]' failed: Timeout

[2024-11-22 12:21:44] INFO: [org.mjsip.ua.registration.RegistrationClient]: Waiting 60s for next registration of sip:[email protected].`

@hduelme
Copy link
Contributor

hduelme commented Nov 22, 2024

@sig10680 die Fritzbox antwortet dir nicht.
Normalerweise sollte eine Bestätigung ankommen

phoneblock    | [2024-11-22 12:56:46] INFO: [org.mjsip.sip.provider.SipProvider]: Received message from: 192.168.2.1:5060/udp (357 bytes).
phoneblock    | -----Begin-of-message-----
phoneblock    | SIP/2.0 401 Unauthorized
phoneblock    | Via: SIP/2.0/UDP 192.168.2.32:55060;branch=...
phoneblock    | From: <sip:[email protected]>;tag=...
phoneblock    | To: <sip:[email protected]>;tag=3775650DC56F84B1
phoneblock    | Call-ID: [email protected]
phoneblock    | CSeq: 1 REGISTER
phoneblock    | WWW-Authenticate: Digest realm="fritz.box", nonce=".."
phoneblock    | User-Agent: FRITZ!OS
phoneblock    | Content-Length: 0
phoneblock    | 

Woraufhin es mit Username + Passwort versucht wird.
Wird auf dem Port zugehört? netstat -lntu

@hduelme
Copy link
Contributor

hduelme commented Nov 22, 2024

@geimist bei mir funktioniert es auch mit dem neuen Image. Wie sieht deine yaml aus?

@sig10680
Copy link

@hduelme Wird auf dem Port zugehört? netstat -lntu

Ja

@geimist
Copy link
Author

geimist commented Nov 22, 2024

Ziemlich unverändert, meine ich:

version: '3.9'

services:
  phoneblock:
    image: phoneblock/answerbot:latest
    container_name: phoneblock
#  command: "-f none"
#  user: 0:0
    network_mode: host
    environment:
      # description: https://github.com/haumacher/phoneblock/blob/master/phoneblock-ab/.phoneblock.template
      - SIP_USER=phoneblock
      - SIP_PASSWD=xxx
      - PHONEBLOCK_USERNAME=xxx
      - PHONEBLOCK_PASSWORD=xxx
      - VIA_ADDR=auto-configuration
      - VIA_ADDR_V6=auto-configuration
      - HOST_PORT=50760
      - REGISTRAR=fritz.box
      - ROUTE=fritz.box;lr
      - REALM=fritz.box
      - MEDIA=audio 4080 RTP/AVP { 8 PCMA 8000 160 }
      - MIN_SILENCE_TIME=1500
      - PADDING_TIME=500
      - SILENCE_DB=-35
      - MEDIA_PORT=50100
      - PORT_COUNT=10
      - RECORDINGS=/opt/phoneblock/recordings
      - CONVERSATION=/opt/phoneblock/conversation
    volumes:
      - ./conversation:/opt/phoneblock/conversation
#      - ./recordings:/opt/phoneblock/recordings
    restart: on-failure:5

@hduelme
Copy link
Contributor

hduelme commented Nov 22, 2024

@geimist RECODINGS wir haben wohl einen @Option(name = "--recodings", usage = "Directory where to store recordings to, 'none' to disable recording.") deine Option passt nicht.
Versuch mal RECORDINGS mit RECODINGS zu ersetzen.

@geimist
Copy link
Author

geimist commented Nov 22, 2024

Leider keine Änderung.
Du kannst auch an den abgespielten Ansagen sehen, dass der AB nicht auf den Anrufer reagiert:

phoneblock
date,stream,content
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [de.haumacher.phoneblock.answerbot.AnswerBot]: AnswerBot 1.5.0-SNAPSHOT
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [org.mjsip.config.OptionParser]: Using '--via-addr' from environment: VIA_ADDR=auto-configuration
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [org.mjsip.config.OptionParser]: Using '--via-addr-v6' from environment: VIA_ADDR_V6=auto-configuration
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [org.mjsip.config.OptionParser]: Using '--host-port' from environment: HOST_PORT=50760
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [org.mjsip.config.OptionParser]: Using '--media' from environment: MEDIA=audio 4080 RTP/AVP { 8 PCMA 8000 160 }
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [org.mjsip.config.OptionParser]: Using '--conversation' from environment: CONVERSATION=/opt/phoneblock/conversation
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [org.mjsip.config.OptionParser]: Using '--min-silence-time' from environment: MIN_SILENCE_TIME=1500
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [org.mjsip.config.OptionParser]: Using '--padding-time' from environment: PADDING_TIME=500
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [org.mjsip.config.OptionParser]: Using '--silence-db' from environment: SILENCE_DB=-35
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [org.mjsip.config.OptionParser]: Using '--phoneblock-username' from environment: PHONEBLOCK_USERNAME=xxx
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [org.mjsip.config.OptionParser]: Using '--phoneblock-password' from environment: PHONEBLOCK_PASSWORD=xxx
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [org.mjsip.config.OptionParser]: Using '--registrar' from environment: REGISTRAR=fritz.box
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [org.mjsip.config.OptionParser]: Using '--route' from environment: ROUTE=fritz.box;lr
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [org.mjsip.config.OptionParser]: Using '--sip-user' from environment: SIP_USER=phoneblock
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [org.mjsip.config.OptionParser]: Using '--sip-passwd' from environment: SIP_PASSWD=xxx
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [org.mjsip.config.OptionParser]: Using '--realm' from environment: REALM=fritz.box
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [org.mjsip.config.OptionParser]: Using '--media-port' from environment: MEDIA_PORT=50100
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [org.mjsip.config.OptionParser]: Using '--port-count' from environment: PORT_COUNT=10
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [org.mjsip.sip.provider.SipProvider]: SipStack: mjsip 1.9.0-SNAPSHOT
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [org.mjsip.sip.provider.SipProvider]: SipProvider: 50060
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [org.mjsip.sip.provider.SipProvider]: udp is up at port 50060
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [org.mjsip.sip.provider.SipProvider]: tcp is up at port 50060
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [de.haumacher.phoneblock.answerbot.AnswerBot]: Supported media: audio 4080 RTP/AVP { 8 PCMA 8000 160 1 }
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [de.haumacher.phoneblock.answerbot.AnswerBot]: Supported media: audio 4080 RTP/AVP { 8 PCMA 8000 160 1 }
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [de.haumacher.phoneblock.answerbot.AnswerBot]: Found 6 audio fragment for dialogue state hello and format 'PCMA'.
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [de.haumacher.phoneblock.answerbot.AnswerBot]: Found 1 audio fragment for dialogue state waiting and format 'PCMA'.
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [de.haumacher.phoneblock.answerbot.AnswerBot]: Found 6 audio fragment for dialogue state who-is-calling and format 'PCMA'.
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [de.haumacher.phoneblock.answerbot.AnswerBot]: Found 8 audio fragment for dialogue state still-there and format 'PCMA'.
2024/11/22 14:22:21,stdout,[2024-11-22 13:22:21] INFO: [de.haumacher.phoneblock.answerbot.AnswerBot]: Found 16 audio fragment for dialogue state question and format 'PCMA'.
2024/11/22 14:22:21,stdout,"[2024-11-22 13:22:21] INFO: [org.mjsip.ua.registration.RegistrationLogger]: Registration of '<sip:[email protected]:50060>' 200 OK, expires in 300s, renewing in 300s."
2024/11/22 14:22:27,stdout,[2024-11-22 13:22:27] INFO: [de.haumacher.phoneblock.answerbot.AnswerBot]: Incomming call from: **611
2024/11/22 14:22:27,stdout,[2024-11-22 13:22:27] INFO: [org.mjsip.sip.transaction.AckTransactionServer]: new transaction-id: 18F612B3FD0BD4EE@192.168.170.1-30-INVITE-server-z9hG4bK53495341A2405C80
2024/11/22 14:22:27,stdout,[2024-11-22 13:22:27] INFO: [de.haumacher.phoneblock.answerbot.DialogueFactory]: Starting dialogue with audio type: PCMA
2024/11/22 14:22:27,stdout,[2024-11-22 13:22:27] INFO: [de.haumacher.phoneblock.answerbot.SpeechDispatcher]: Playing: /opt/phoneblock/conversation/hello/PCMA/hello_5.wav
2024/11/22 14:22:27,stdout,"[2024-11-22 13:22:27] INFO: [org.mjsip.media.AudioStreamer]: Base format: PCM_SIGNED 8000.0 Hz, 16 bit, mono, 2 bytes/frame, little-endian"
2024/11/22 14:22:27,stdout,"[2024-11-22 13:22:27] INFO: [org.mjsip.media.AudioStreamer]: Supported codecs: ULAW, PCM_UNSIGNED, PCM_SIGNED, PCM_SIGNED, PCM_UNSIGNED, PCM_FLOAT, ALAW"
2024/11/22 14:22:27,stdout,"[2024-11-22 13:22:27] INFO: [org.mjsip.media.AudioStreamer]: Target format: ALAW 8000.0 Hz, 8 bit, mono, 1 bytes/frame"
2024/11/22 14:22:27,stdout,[2024-11-22 13:22:27] INFO: [org.mjsip.media.RtpStreamSender]: Created RTP stream sender: UDP:null:50100 --> 192.168.170.1:7084
2024/11/22 14:22:27,stdout,[2024-11-22 13:22:27] INFO: [org.mjsip.media.AudioStreamer]: starting java audio
2024/11/22 14:22:28,stdout,[2024-11-22 13:22:28] INFO: [de.haumacher.phoneblock.answerbot.SpeechDispatcher]: Playing: /opt/phoneblock/conversation/waiting/PCMA/waiting_1.wav
2024/11/22 14:22:35,stdout,[2024-11-22 13:22:35] INFO: [de.haumacher.phoneblock.answerbot.SpeechDispatcher]: Playing: /opt/phoneblock/conversation/who-is-calling/PCMA/who-is-calling_2.wav
2024/11/22 14:22:37,stdout,[2024-11-22 13:22:37] INFO: [de.haumacher.phoneblock.answerbot.SpeechDispatcher]: Playing: /opt/phoneblock/conversation/waiting/PCMA/waiting_1.wav
2024/11/22 14:22:44,stdout,[2024-11-22 13:22:44] INFO: [de.haumacher.phoneblock.answerbot.SpeechDispatcher]: Playing: /opt/phoneblock/conversation/who-is-calling/PCMA/who-is-calling_5.wav
2024/11/22 14:22:46,stdout,[2024-11-22 13:22:46] INFO: [de.haumacher.phoneblock.answerbot.SpeechDispatcher]: Playing: /opt/phoneblock/conversation/waiting/PCMA/waiting_1.wav
2024/11/22 14:22:53,stdout,[2024-11-22 13:22:53] INFO: [de.haumacher.phoneblock.answerbot.SpeechDispatcher]: Playing: /opt/phoneblock/conversation/who-is-calling/PCMA/who-is-calling_6.wav
2024/11/22 14:22:56,stdout,[2024-11-22 13:22:56] INFO: [de.haumacher.phoneblock.answerbot.SpeechDispatcher]: Playing: /opt/phoneblock/conversation/waiting/PCMA/waiting_1.wav
2024/11/22 14:23:02,stdout,[2024-11-22 13:23:02] INFO: [de.haumacher.phoneblock.answerbot.SpeechDispatcher]: Playing: /opt/phoneblock/conversation/who-is-calling/PCMA/who-is-calling_6.wav
2024/11/22 14:23:05,stdout,[2024-11-22 13:23:05] INFO: [de.haumacher.phoneblock.answerbot.SpeechDispatcher]: Playing: /opt/phoneblock/conversation/waiting/PCMA/waiting_1.wav
2024/11/22 14:23:12,stdout,[2024-11-22 13:23:12] INFO: [de.haumacher.phoneblock.answerbot.SpeechDispatcher]: Playing: /opt/phoneblock/conversation/who-is-calling/PCMA/who-is-calling_6.wav
2024/11/22 14:23:14,stdout,[2024-11-22 13:23:14] INFO: [de.haumacher.phoneblock.answerbot.SpeechDispatcher]: Playing: /opt/phoneblock/conversation/waiting/PCMA/waiting_1.wav
2024/11/22 14:23:21,stdout,[2024-11-22 13:23:21] INFO: [de.haumacher.phoneblock.answerbot.SpeechDispatcher]: Playing: /opt/phoneblock/conversation/who-is-calling/PCMA/who-is-calling_4.wav
2024/11/22 14:23:23,stdout,[2024-11-22 13:23:23] INFO: [de.haumacher.phoneblock.answerbot.SpeechDispatcher]: Playing: /opt/phoneblock/conversation/waiting/PCMA/waiting_1.wav
2024/11/22 14:23:27,stdout,[2024-11-22 13:23:27] INFO: [org.mjsip.media.AudioStreamer]: stopping java audio
2024/11/22 14:23:27,stdout,[2024-11-22 13:23:27] INFO: [de.haumacher.phoneblock.answerbot.AnswerBot]: Completed SPAM call for 'phoneblock' with '**611' started Fri Nov 22 13:22:27 UTC 2024 talked for 60.843 seconds.  

Ich hab auch mal alle Umgebungsvariablen bis auf SIP_USER und SIP_PASSWD herausgenommen. Keine Änderung.

@hduelme
Copy link
Contributor

hduelme commented Nov 22, 2024

@geimist du hast recht ist ein Fehler aus eeb3adb
Wird behoben

@geimist
Copy link
Author

geimist commented Nov 22, 2024

Aber müsste es nicht gehen, wenn ich RECODINGS setze?

@hduelme
Copy link
Contributor

hduelme commented Nov 22, 2024

Aber müsste es nicht gehen, wenn ich RECODINGS setze?

Ja

@geimist
Copy link
Author

geimist commented Nov 22, 2024

Aber tut es ja auch nicht 🤷‍♂️
Wie gesagt: mit dem alten Image geht's.
Ich hab gerade auch keine Idee, wie ich das noch etwas besser debuggen kann.

@geimist
Copy link
Author

geimist commented Nov 22, 2024

Wenn ich das Konfigfile mounte, funktioniert es:

version: '3.9'

services:
  phoneblock:
    image: phoneblock/answerbot:latest
    container_name: phoneblock
    network_mode: host
    environment:
      - SIP_USER=phoneblock
      - SIP_PASSWD=xxx
    volumes:
      - ./conversation:/opt/phoneblock/conversation
      - ./phoneblock_config.conf:/opt/phoneblock/.phoneblock
    restart: on-failure:5

phoneblock_config.conf:

host-port=50060
registrar=fritz.box
route=fritz.box;lr
realm=fritz.box
media=audio 4080 RTP/AVP { 8 PCMA 8000 160 }
min-silence-time = 1500
padding-time = 500
silence-db = -35
media_port=50100
port-count=10
recodings=/opt/phoneblock/recordings
conversation=/opt/phoneblock/conversation

@sig10680
Copy link

@hduelme ich teste mal mit einer anderen Fritzbox und melde mich wieder.

@geimist
Copy link
Author

geimist commented Nov 22, 2024

@hduelme

Edit 2:

wenn ich command: "-f none" setze, funktioniert der Spracheingang / Aufnahme zum AB auch (sorry, hatte eigentlich gemeint, es schon versucht zu haben). Demnach würde ich vermuten, das die Umgebungsvariablen die Werte der Standardkonfiguration des internen Konfigfiles nicht korrekt überschreiben. Das deckt sich ja auch mit der Änderung des Dockerimages welche zu dem Break bei mir führten.

@hduelme
Copy link
Contributor

hduelme commented Nov 22, 2024

@geimist genau das ist auch meine Vermutung. Daher habe ich etwas mehr Diagnose im 2. verlinkten Merge-Request eingebaut.

@haumacher
Copy link
Owner

haumacher commented Nov 22, 2024

Vielen Dank für die Analyse. Ich glaube das eigentliche Problem habe ich in der late-night-docker-build-aktion haumacher/mjSIP@3e10ba0 eingebaut und jetzt hoffentlich mit haumacher/mjSIP@9bb3532 behoben. Das Problem war, dass immer dann, wenn ein Konfigurationsfile angegeben wurde, die Umgebungsvariablen ignoriert (bzw. durch das Konfigurationsfile überschrieben) wurden.

Das andere Problem, dass der AB nicht richtig zuhört, wenn er nicht auch aufzeichnet ist hiermit behoben: 8661f6e

Ich habe das Docker-Image aktualisiert - wer noch nicht müde ist vom Testen, der kann es nochmal probieren :-)

@geimist
Copy link
Author

geimist commented Nov 22, 2024

Läuft – vielen Dank 😊

@sig10680
Copy link

Bei mir geht es jetzt auch. Sehr fein! Danke für die Unterstützung!
Wie erstellt ihr eigentlich die wav Dateien?

@haumacher
Copy link
Owner

Audacity kann das ganz gut: https://www.audacityteam.org/

@sig10680
Copy link

@haumacher Danke das Teste ich mal.

@geimist
Copy link
Author

geimist commented Nov 22, 2024

Wie erstellt ihr eigentlich die wav Dateien?

Mein Weg ging über eine Aufnahme mit allen Sätzen einer Gruppe in OcenAudio.
Anschließend AuswählenStilleAuswahl umkehrenAuswahlen speichern

Konvertierung der Schnipsel ins passende Format dann mit ffmpeg:
Kurzform:
ffmpeg -i input_file -c:a pcm_alaw -ar 8000 -ac 1 output_file

Langform (als Bash)
Ganze Ordner werden als Parameter an das Skript übergeben.

#!/bin/bash

# Prüfen, ob ein Ordner als Parameter übergeben wurde
if [ -z "$1" ]; then
    echo "Bitte einen Ordner als Parameter angeben."
    exit 1
fi

INPUT_DIR="$1"

# Prüfen, ob der angegebene Ordner existiert
if [ ! -d "$INPUT_DIR" ]; then
    echo "Der Ordner '$INPUT_DIR' existiert nicht."
    exit 1
fi

# Funktion, um eindeutigen Dateinamen zu erstellen
generate_unique_filename() {
    local dir="$1"
    local base_name="$2"
    local extension="$3"
    local counter=1
    local new_name="${base_name}.${extension}"

    while [ -e "$dir/$new_name" ]; do
        new_name="${base_name}_$counter.${extension}"
        ((counter++))
    done

    echo "$new_name"
}

# Schleife durch alle Audiodateien im Ordner
for file in "$INPUT_DIR"/*.{mp3,flac,wav,m4a,ogg}; do
    # Prüfen, ob Datei existiert
    [ -e "$file" ] || continue

    # Extrahiere Dateinamen ohne Erweiterung
    base_name=$(basename "$file" | sed 's/\.[^.]*$//')
    output_file=$(generate_unique_filename "$INPUT_DIR" "$base_name" "wav")

    echo "Konvertiere: $file -> $INPUT_DIR/$output_file"

    # Konvertierung mit ffmpeg
    ffmpeg -i "$file" -c:a pcm_alaw -ar 8000 -ac 1 "$INPUT_DIR/$output_file"
done

echo "Konvertierung abgeschlossen."

@sig10680
Copy link

So habe jetzt ein paar wav Dateien erstellt. Er spielt aber nur immer die hallo wav ab. Mehr nicht. Habe aber auch eine Fehlermeldung im log. INFO: [org.mjsip.media.AudioStreamer]: Exception.: java.io.IOException: cannot read a single byte if frame size > 1

@haumacher
Copy link
Owner

Du musst die WAVs in Verzeichnisse einsortieren, wie hier beschrieben: https://github.com/haumacher/phoneblock/tree/master/phoneblock-ab/conversation

Er nimmt immer zufällig eine Datei aus dem Verzeichnis, das zu seinem "Gesprächszustand" passt.

@sig10680
Copy link

@haumacher ich habe in jeden Verzeichnis mehrere Audio files aber er nimmt nur immer die hello danach kommt nur Stille oder das rauschen file

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants