Akustische Instrumentenerkennung mit Raspberry Pi und YAMNet

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

KomponentePreis
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?

KriteriumYAMNetGemma 4 E2B
ZweckAudio-KlassifizierungSpracherkennung
Modellgröße~4 MB~1.5 GB
Inferenz auf Pi 4~100 msNicht optimiert
Instrument-Klassen521 inkl. InstrumenteNicht 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:

SensorBeschreibung
sensor.instrument_detector_stateplaying / idle
sensor.instrument_detector_durationDauer in Sekunden
sensor.instrument_detector_volumeLautstärke in dB
sensor.instrument_detector_confidenceErkennungskonfidenz 0.0–1.0
sensor.instrument_detector_instrumentErkanntes 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

KomponenteTechnologie
Audio-Aufnahmesounddevice (I2S/ALSA)
KI-ModellYAMNet via tflite-runtime
MQTTpaho-mqtt mit HA Auto-Discovery
WebserverFastAPI + uvicorn
DatenbankSQLite3
KonfigurationPyYAML

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

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.