Verborgene Signale · Begleitseite ← Alle Aktivitäten DE·EN
Kapitel 17 · Eine gemeinsame Zeitachse · Aktivität 17.1

Drei Reiche auf einer Zeitachse

Ein einziges Pflanzensignal — und darin steckt, wer in der Nähe war: nichts, ein Mensch, ein Hund, ein Schaf. Die drei Reiche treffen sich in einer bioelektrischen Spur.

Dauer Doppelstunde Schwierigkeit hoch Gruppe zu zweit oder Projekt Voll digital S

Kurz gesagt

Was: Du nimmst das bioelektrische Signal einer Pflanze und lässt ein Modell erraten, welches Wesen gerade in ihrer Nähe war — niemand, ein Mensch, ein Hund oder ein Schaf. Es ist das grosse Finale des Buches: Pflanze, Tier und Mensch liegen nebeneinander auf einer gemeinsamen Zeitachse, gelesen mit demselben Verfahren wie alles zuvor.

Der Kern-Gedanke: Zwei Konvergenzen werden sichtbar. Erstens die der Methode — wieder Signal → Merkmale → Modell, genau wie bei Stimme, Katzenlaut und Herzschlag. Zweitens die des Ergebnisses: Die Pflanze, das stille Reich, trägt in ihrer Spannungskurve Spuren der beiden anderen Reiche.

Du brauchst: die 3-Sekunden-Aufnahmen aus der COIN-Studie (siehe unten), Python mit librosa, scikit-learn und xgboost. Ohne die Studiendaten geht es auch — mit deinem Biolingo-Sensor aus 11.1.

Worum es geht

Vier Teile lang hast du gelernt, einzelne Wesen zu lesen — Menschen, Tiere, Pflanzen, ganze Gruppen. Dieses Kapitel legt sie endlich nebeneinander und zeigt das Verblüffende: Es war immer dasselbe Verfahren, und es waren immer dieselben Signale. Hier machst du diese Konvergenz selbst greifbar — an einem einzigen Fall, in dem alle drei Reiche zusammenkommen.

In einer Studie aus dem COINs-Seminar hängten Studierende einen selbstgebauten Sensor an eine Basilikum-Pflanze und setzten ihr nacheinander verschiedene Gäste vor die Nase: mal niemanden (Baseline), mal einen Menschen, mal einen Hund (Fleischfresser), mal ein Schaf (Pflanzenfresser). Dann fragten sie: Kann man allein aus dem Pflanzensignal erraten, wer da war? Die Antwort war ein überraschend klares Ja — und genau das baust du nach.

Bevor du startest — die Daten

Die Originaldaten stammen aus der COIN-Studie von Rokicki, Stricker, Schäfer und Shi (Universität Köln, WS 2025/26): 39 Aufnahmen, in 3-Sekunden-Fenster geschnitten, vier Klassen. Frag im Seminar nach den WAV-Dateien und leg sie in vier Ordner: daten/baseline/, daten/human/, daten/dog/, daten/sheep/. Ohne die Studiendaten: Nimm mit deinem Biolingo-Sensor (11.1) selbst auf — je ein paar Minuten „niemand da“ gegen „ein Mensch sitzt daneben“, und, wenn du magst, ein Haustier. Schon zwei Klassen genügen, um das Prinzip zu zeigen.

Ein bisschen Hintergrund

Was die Pflanze verrät. Die Studie fand klare, statistisch signifikante Unterschiede (Welch-Test, p < 0,05). Mensch und Hund liessen das Signal unruhiger werden — mehr Varianz, mehr Rauschen. Das Schaf dagegen liess die Signalenergie sinken, eine Art Verstummen — vielleicht, vermuten die Autoren, eine alte Reaktion auf einen Pflanzenfresser. Ein XGBoost-Modell erreichte über alle vier Klassen rund 83 Prozent Treffer, mit F1-Werten über 90 Prozent für Mensch und Hund; das Schaf blieb am schwersten.

Wieder ein Bild aus dem Signal. Das Verfahren ist dir vertraut: Der Sensor (ein OPA2134-Verstärker an einem ESP32, 380 Hz) schneidet das Signal in 3-Sekunden-Stücke. Aus jedem Stück ziehen wir dieselben Klang-Merkmale wie bei der Katze in 12.1 — MFCC, spektraler Schwerpunkt, Nulldurchgangsrate, Energie und ihre Änderungsraten. Kurz: Wir hören der Pflanze zu, als wäre ihr Signal ein Laut.

Merkmale ziehen und das Modell trainieren

Erst die Merkmale je 3-Sekunden-Fenster, dann XGBoost — das Siegermodell der Studie. Der vollständige Code liegt auf GitHub.

import librosa, numpy as np, glob, os
from xgboost import XGBClassifier
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

def merkmale(datei):
    y, sr = librosa.load(datei)                     # 3-Sekunden-Fenster laden
    mfcc  = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13)
    delta = librosa.feature.delta(mfcc)             # Aenderungsrate
    zentroid = librosa.feature.spectral_centroid(y=y, sr=sr)[0]
    nulldg   = librosa.feature.zero_crossing_rate(y)[0]
    energie  = librosa.feature.rms(y=y)[0]
    return np.concatenate([
        mfcc.mean(axis=1), mfcc.std(axis=1),        # Form + Volatilitaet
        delta.mean(axis=1),                         # wie schnell sich das Signal wandelt
        [zentroid.mean(), zentroid.std(),           # Frequenz-Schwerpunkt
         nulldg.mean(),   nulldg.std(),             # Rauigkeit
         energie.mean(),  energie.std()],           # Intensitaet
    ])

KLASSEN = ["baseline", "human", "dog", "sheep"]
X, y = [], []
for k in KLASSEN:
    for datei in glob.glob(f"daten/{k}/*.wav"):
        X.append(merkmale(datei)); y.append(k)
X = np.array(X)
print("gelesen:", len(X), "Fenster")

kod = LabelEncoder().fit(y)
Xtr, Xte, ytr, yte = train_test_split(X, kod.transform(y), test_size=0.2,
                                      random_state=0, stratify=y)
modell = XGBClassifier(objective="multi:softprob", num_class=len(kod.classes_),
                       eval_metric="mlogloss")
modell.fit(Xtr, ytr)

print("Treffer gesamt:", round(modell.score(Xte, yte), 2))
print(classification_report(yte, modell.predict(Xte), target_names=kod.classes_))

Was du sehen solltest

Mensch und Hund erkennt das Modell fast sicher (hohe F1-Werte) — ihre Unruhe im Signal ist unverkennbar. Das Schaf ist der schwierige Fall und wird am ehesten mit der Baseline verwechselt, weil sein „Verstummen“ dem ruhigen Nichts ähnelt. Über alle vier Klassen landest du in der Nähe der 83 Prozent der Studie. Mit deinen eigenen Biolingo-Aufnahmen (nur zwei Klassen) wird es einfacher — dafür ist es deine Pflanze, die den Menschen von der Leere unterscheidet.

Die gemeinsame Zeitachse

Jetzt das Bild, das dem Kapitel den Namen gibt. Zeichne die Signalenergie Fenster für Fenster über die Zeit und färbe sie nach dem, wer gerade da war. Du siehst die Reiche nebeneinander — die ruhige Baseline, das unruhige Auf und Ab bei Mensch und Hund, das Absinken beim Schaf.

import matplotlib.pyplot as plt

farbe = {"baseline":"#9db3a3", "human":"#6B7A8F", "dog":"#E0A82E", "sheep":"#B5524C"}
plt.figure(figsize=(10, 3.5))
i = 0
for k in KLASSEN:
    for datei in sorted(glob.glob(f"daten/{k}/*.wav")):
        y, sr = librosa.load(datei)
        plt.scatter(i, librosa.feature.rms(y=y)[0].mean(), color=farbe[k], s=12)
        i += 1
plt.xlabel("Fenster (der Reihe nach)"); plt.ylabel("Signalenergie")
plt.title("Drei Reiche, eine Pflanze, eine Zeitachse"); plt.tight_layout(); plt.show()

Arbeitsblatt

Was die Reiche verbindet

  1. Welche zwei Klassen trennt das Modell am sichersten, welche verwechselt es am ehesten? Warum ausgerechnet diese?
  2. Mensch und Hund erhöhen die Varianz, das Schaf senkt die Energie. Formuliere eine Vermutung, warum eine Pflanze auf einen Pflanzenfresser anders reagieren könnte als auf einen Menschen.
  3. Zähle die Schritte auf, die du hier gegangen bist (Signal → … → Vorhersage). Wo hast du genau dieselben Schritte schon einmal gemacht — bei der Katze, beim Herzschlag, bei der Stimme?
  4. Es ist nur eine Basilikum-Pflanze. Nenne zwei Gründe, warum das Ergebnis damit spannend, aber noch nicht beweisend ist.
  5. „Die Pflanze liest Mensch und Tier.“ Was an dieser Aussage ist durch das Experiment gedeckt — und wo beginnt die Überinterpretation?
Lösung anzeigen

1. Am sichersten trennt es Mensch und Hund (starke Unruhe im Signal); am ehesten verwechselt es Schaf und Baseline, weil das „Verstummen“ beim Schaf dem ruhigen Nichts ähnelt — beide sind energiearm.

2. Individuell. Eine plausible Idee: Ein Pflanzenfresser ist die eigentliche Gefahr für eine Pflanze; ein „Herunterfahren“ könnte Ressourcen sparen oder eine chemische Abwehr vorbereiten, während Mensch und Hund eher eine allgemeine Störung sind (mehr Unruhe). Wichtig ist die Formulierung als Vermutung, nicht als Tatsache.

3. Signal aufnehmen → in Fenster schneiden → Merkmale/Spektrogramm bilden → Modell entscheiden lassen. Genau diese Kette lief bei der Katze (12.1), beim Herzschlag (5.1) und bei der Stimme (10.1) — ein einziges Verfahren über alle Reiche. Das ist die Konvergenz der Methode.

4. Nur eine Pflanze (keine Aussage über andere Exemplare/Arten); kein sauberer Kontrollaufbau, und die Messungen fanden teils an verschiedenen Orten statt (mögliche Störfaktoren). Ein Muster in einer Pflanze ist ein Anfang, kein Beweis.

5. Gedeckt ist: Aus dem Pflanzensignal lässt sich statistisch erraten, welche Kategorie von Wesen nahe war — besser als Zufall. Überinterpretation beginnt bei „die Pflanze weiss/ fühlt/erkennt“ — gemessen ist eine Korrelation zwischen Nähe und Signalform, kein Bewusstsein.

Wenn's klemmt

ProblemWahrscheinliche Ursache & Lösung
xgboost lässt sich nicht importierenErst installieren: pip install xgboost. Alternativ tut es auch RandomForestClassifier aus sklearn — die Studie nutzte ihn als Vergleich.
gelesen: 0 FensterOrdnerstruktur stimmt nicht. Lege die WAVs in daten/<klasse>/ und passe KLASSEN an die tatsächlich vorhandenen Ordner an.
Alles wird als „baseline“ erkanntKlassen stark unausgewogen. Ungefähr gleich viele Fenster je Klasse nehmen oder class_weight/Sampling verwenden.
Sehr niedrige Treffer bei eigenen AufnahmenZu wenige Daten oder zu viel Störung. Länger aufnehmen, Kabel fixieren, ruhige Umgebung — und ehrlich bei zwei klar getrennten Klassen bleiben.
Sehr langsamMerkmale einmal berechnen und in X behalten; nicht bei jedem Durchlauf neu aus den WAVs lesen.

Zum Nachdenken

Erweiterung

← 16.2 Mein digitaler Zwilling 19.1 KI-Mündigkeit →