haumacher / phoneblock

Der Spam-Filter für die Fritz!Box
https://phoneblock.net
GNU General Public License v3.0
161 stars 15 forks source link

Dockerimage #97

Open geimist opened 1 week ago

geimist commented 1 week ago

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:

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 🤗

hduelme commented 3 days ago

@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 commented 3 days ago

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:phoneblock@192.168.170.21: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 commented 3 days ago

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

geimist commented 3 days ago

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

hduelme commented 3 days ago

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

Ja

geimist commented 3 days ago

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 commented 3 days ago

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 commented 3 days ago

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

geimist commented 3 days ago

@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 commented 3 days ago

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

haumacher commented 3 days ago

Vielen Dank für die Analyse. Ich glaube das eigentliche Problem habe ich in der late-night-docker-build-aktion https://github.com/haumacher/mjSIP/commit/3e10ba0bc808f15ba206ce364b229fbeb555c6e2 eingebaut und jetzt hoffentlich mit https://github.com/haumacher/mjSIP/commit/9bb3532bf98063be469e521236e08855cfade2ae 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: https://github.com/haumacher/phoneblock/commit/8661f6e6054163fffcf7393bbd4e5ac98cbc112e

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

geimist commented 3 days ago

Läuft – vielen Dank 😊

sig10680 commented 3 days ago

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

haumacher commented 3 days ago

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

sig10680 commented 3 days ago

@haumacher Danke das Teste ich mal.

geimist commented 3 days ago

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 commented 2 days ago

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 commented 2 days ago

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 commented 2 days ago

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