6. April 2026
Das Problem
Mein Nachbar unter mir spielt regelmäßig ein akustisches Instrument. Grundsätzlich kein Problem — aber ich wollte wissen: Wann genau und wie lange? Also habe ich mir ein kleines KI-Projekt gebaut, das das automatisch protokolliert.
Das Ganze ist auch ein Lernprojekt: Wie setzt man ein Open-Source-KI-Modell auf einem Raspberry Pi ein? Wie bringt man Echtzeit-Audio-Klassifizierung auf einen Edge-Device?
Die Idee
Ein Raspberry Pi 4 mit einem I2S-Mikrofon lauscht kontinuierlich. Sobald ein akustisches Instrument erkannt wird, protokolliert das System:
- Wann es anfängt und aufhört
- Wie lange die Session dauert
- Welches Instrument erkannt wurde
- Wie laut es war
- Wie sicher sich die KI ist (Konfidenz)
Die Daten gehen per MQTT an Home Assistant — dort kann ich mir Automationen, Dashboards und Benachrichtigungen bauen.
Hardware
| Komponente | Preis |
|---|---|
| Raspberry Pi 4 Model B (8 GB)* | vorhanden |
| INMP441 I2S MEMS Mikrofon* | ~5 EUR |
| microSD-Karte 32 GB (SanDisk Ultra)* | vorhanden |
Gesamtkosten: ~5 EUR (wenn man den Pi schon hat)
Das INMP441 ist ein digitales MEMS-Mikrofon, das über die I2S-Schnittstelle direkt an die GPIO-Pins des Pi angeschlossen wird. Kein USB, kein Treiber-Chaos — sauberes digitales Signal.
Verkabelung
INMP441 Raspberry Pi 4
───────── ──────────────
VDD → 3.3V (Pin 1)
GND → GND (Pin 6)
SCK → GPIO 18 (Pin 12)
WS → GPIO 19 (Pin 35)
SD → GPIO 20 (Pin 38)
L/R → GND (Mono)
Architektur: Zwei-Stufen-Pipeline
Das System nutzt eine Zwei-Stufen-Erkennung, um CPU und Strom zu sparen:
┌──────────┐ ┌───────────┐ ┌──────────────┐ ┌─────────────┐
│ INMP441 │───▶│ RMS │───▶│ YAMNet │───▶│ Event │
│ Mikrofon │ │ Monitor │ │ Classifier │ │ Manager │
│ (I2S) │ │ (Stufe 1)│ │ (Stufe 2) │ └──┬──┬──┬───┘
└──────────┘ └───────────┘ └──────────────┘ │ │ │
┌───▼┐┌▼──▼──┐
│MQTT││SQLite│
└──┬─┘└──────┘
┌──▼──────────┐
│Home Assistant│
└─────────────┘
Stufe 1: Lautstärke-Monitor (immer aktiv)
Ein einfacher RMS-Monitor (Root Mean Square) berechnet alle 100ms die Lautstärke des Mikrofonsignals. Solange es leise ist, passiert nichts — CPU-Last unter 1%.
Erst wenn der Pegel einen konfigurierbaren Schwellenwert überschreitet, wird Stufe 2 aktiviert. Eine Hysterese verhindert dabei, dass das System bei Grenzwert-Lautstärke ständig zwischen “an” und “aus” flackert.
class AudioMonitor:
def process_chunk(self, audio: np.ndarray) -> tuple[bool, float]:
rms = float(np.sqrt(np.mean(audio ** 2)))
if self._is_active:
# Deaktivieren nur unter Hysterese-Schwelle
if rms < self.hysteresis:
self._is_active = False
else:
# Aktivieren über Schwellenwert
if rms >= self.rms_threshold:
self._is_active = True
return self._is_active, rms
Stufe 2: YAMNet KI-Klassifizierung (on-demand)
YAMNet ist ein vortrainiertes Audio-Klassifizierungsmodell von Google. Es erkennt 521 verschiedene Geräusch-Klassen — darunter viele Musikinstrumente wie Gitarre, Violine, Klavier, Flöte etc.
Warum YAMNet und nicht ein LLM wie Gemma 4?
| Kriterium | YAMNet | Gemma 4 E2B |
|---|---|---|
| Zweck | Audio-Klassifizierung | Spracherkennung |
| Modellgröße | ~4 MB | ~1.5 GB |
| Inferenz auf Pi 4 | ~100 ms | Nicht optimiert |
| Instrument-Klassen | 521 inkl. Instrumente | Nicht vorgesehen |
YAMNet läuft als TensorFlow Lite Modell mit nur ~4 MB — perfekt für den Pi. Eine Inferenz dauert ca. 100 ms. Das Modell bekommt einen 0,975-Sekunden-Audio-Chunk und gibt die Top-5 erkannten Klassen mit Konfidenzwerten zurück.
result = classifier.classify(audio_chunk)
# result.is_instrument = True
# result.instrument_name = "Acoustic guitar"
# result.confidence = 0.82
Event Manager: Zustandsmaschine
Eine einfache Zustandsmaschine trackt die “Sessions”:
┌───────────┐ Instrument erkannt ┌──────────┐
│ IDLE │──────────────────────▶│ ACTIVE │
│ │◀──────────────────────│ │
└───────────┘ Timeout (10s ohne └──────────┘
Erkennung)
- IDLE → ACTIVE: Instrument mit Konfidenz über Schwelle erkannt → Session startet
- ACTIVE: Zählt Dauer, trackt Lautstärke/Konfidenz, sendet MQTT-Updates alle 5 Sekunden
- ACTIVE → IDLE: 10 Sekunden ohne Erkennung → Session wird in der Datenbank gespeichert
Das 10-Sekunden-Debouncing sorgt dafür, dass kurze Pausen (Umblättern, kurze Stille) die Session nicht unterbrechen.
MQTT & Home Assistant
Per MQTT mit Auto-Discovery erscheinen die Sensoren automatisch in Home Assistant:
| Sensor | Beschreibung |
|---|---|
sensor.instrument_detector_state | playing / idle |
sensor.instrument_detector_duration | Dauer in Sekunden |
sensor.instrument_detector_volume | Lautstärke in dB |
sensor.instrument_detector_confidence | Erkennungskonfidenz 0.0–1.0 |
sensor.instrument_detector_instrument | Erkanntes Instrument |
Damit lassen sich in Home Assistant beliebige Automationen bauen — z.B. eine Benachrichtigung aufs Handy, wenn der Nachbar anfängt zu spielen, oder ein Langzeit-Dashboard mit Spielzeiten pro Woche.
REST API & Fernsteuerung
Ein FastAPI-Webserver läuft auf Port 8000 und bietet:
GET /api/status → Aktueller Zustand
GET /api/sessions → Session-Historie
GET /api/stats → Tages-/Wochenstatistiken
POST /api/config → Schwellenwerte zur Laufzeit anpassen
POST /api/control/start → Erkennung starten
POST /api/control/stop → Erkennung stoppen
GET /docs → Swagger UI
Die Swagger-UI unter http://raspi:8000/docs macht das Testen und Konfigurieren besonders einfach.
Installation: Ein Kommando
Auf einem frischen Raspberry Pi OS reicht ein einziger Befehl:
curl -sSL https://raw.githubusercontent.com/ckoehler99/ai_surveillance/main/setup/setup-pi.sh | \
sudo MQTT_BROKER=192.168.1.100 bash
Das Skript erledigt alles: System-Pakete, I2S-Treiber, Python-Umgebung, YAMNet-Modell, Konfiguration und systemd-Service. Alternativ kann die SD-Karte mit Cloud-Init komplett vorkonfiguriert werden — dann richtet sich der Pi beim ersten Einschalten selbst ein.
Tech Stack
| Komponente | Technologie |
|---|---|
| Audio-Aufnahme | sounddevice (I2S/ALSA) |
| KI-Modell | YAMNet via tflite-runtime |
| MQTT | paho-mqtt mit HA Auto-Discovery |
| Webserver | FastAPI + uvicorn |
| Datenbank | SQLite3 |
| Konfiguration | PyYAML |
Was ich gelernt habe
- TFLite auf dem Pi ist überraschend schnell. 100 ms Inferenzzeit für ein Audio-Klassifizierungsmodell — das reicht locker für Echtzeit.
- Die Zwei-Stufen-Pipeline spart enorm CPU. Ohne den RMS-Vorabcheck würde der Pi ständig YAMNet-Inferenz laufen lassen — mit der Pipeline bleibt er im Idle unter 1% CPU.
- I2S ist dem USB-Audio deutlich überlegen. Kein Treiber-Theater, kein USB-Overhead, sauberes digitales Signal. Die Verkabelung sind nur 5 Drähte.
- YAMNet ist für diesen Zweck besser als ein LLM. Ein spezialisiertes, leichtgewichtiges Modell schlägt ein Allzweck-LLM bei einer fokussierten Klassifizierungsaufgabe — sowohl in Geschwindigkeit als auch in Genauigkeit.
Nächste Schritte
- Transfer Learning: YAMNet auf das spezifische Instrument meines Nachbarn finetunen — sollte die Erkennungsgenauigkeit deutlich verbessern
- Piezo-Kontaktmikrofon: Ein zweites Mikrofon direkt an der Decke für Körperschall-Erkennung. Eventuell Fusion beider Signale für höhere Konfidenz.
- Langzeit-Dashboard: Grafana-Integration für Wochen- und Monatsstatistiken
Links
- GitHub: github.com/ckoehler99/ai_surveillance
- YAMNet: TensorFlow Models — YAMNet
- INMP441 Mikrofon (amazon.de): INMP441 I2S MEMS Modul*
Die mit * gekennzeichneten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision — für dich ändert sich am Preis nichts.