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.
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
- Welche zwei Klassen trennt das Modell am sichersten, welche verwechselt es am ehesten? Warum ausgerechnet diese?
- 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.
- 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?
- Es ist nur eine Basilikum-Pflanze. Nenne zwei Gründe, warum das Ergebnis damit spannend, aber noch nicht beweisend ist.
- „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
| Problem | Wahrscheinliche Ursache & Lösung |
|---|---|
xgboost lässt sich nicht importieren | Erst installieren: pip install xgboost. Alternativ tut es auch RandomForestClassifier aus sklearn — die Studie nutzte ihn als Vergleich. |
gelesen: 0 Fenster | Ordnerstruktur stimmt nicht. Lege die WAVs in daten/<klasse>/ und passe KLASSEN an die tatsächlich vorhandenen Ordner an. |
| Alles wird als „baseline“ erkannt | Klassen stark unausgewogen. Ungefähr gleich viele Fenster je Klasse nehmen oder class_weight/Sampling verwenden. |
| Sehr niedrige Treffer bei eigenen Aufnahmen | Zu wenige Daten oder zu viel Störung. Länger aufnehmen, Kabel fixieren, ruhige Umgebung — und ehrlich bei zwei klar getrennten Klassen bleiben. |
| Sehr langsam | Merkmale einmal berechnen und in X behalten; nicht bei jedem Durchlauf neu aus den WAVs lesen. |
Zum Nachdenken
- Sieh genau hin: Es war stets derselbe Griff. Eine Stimme, ein Katzenlaut, ein Herzschlag, ein Pflanzensignal — mit jedem hast du dasselbe getan: aufgezeichnet, in ein Bild verwandelt, von derselben Maschinerie lesen lassen. Ein einziges Verfahren, von der Tomate bis zur Börse.
- Und tiefer: Quer durch alle Reiche tauchen dieselben ehrlichen Signale auf — Rhythmus, das Auf und Ab von Anspannung und Ruhe, die Wiederkehr fester Muster. Auf einer gemeinsamen Zeitachse rücken Mensch, Tier und Pflanze überraschend nah zusammen: nicht, weil sie gleich wären, sondern weil sie verwandt sind in der Art, wie sie auf ihre Welt antworten.
- Halte auch hier die Grenze: Gemessen ist eine Korrelation zwischen Nähe und Signalform — kein Beweis, dass die Pflanze „weiss“, wer da ist. Das Erstaunliche braucht die Nüchternheit nicht zu fürchten; es hält ihr stand.
Erweiterung
- Eigene Reiche. Nimm mit dem Biolingo-Sensor deine eigene Vier-Klassen-Reihe auf: niemand, du, dein Haustier, ein zweiter Mensch. Erreichst du auch nur annähernd die Trennschärfe der Studie?
- Zeitliche Form statt Mittelwerte. Die Studie probierte ein LSTM, das die rohe Zeitreihe statt gemittelter Merkmale liest — mit hoher Trefferquote fürs Schaf. Ersetze die MFCC-Mittelwerte durch die rohe Fensterfolge und vergleiche.
- Konfusionsmatrix. Zeichne mit
sklearn.metrics.confusion_matrix, welche Reiche am häufigsten verwechselt werden. Fällt das Schaf, wie in der Studie, am ehesten in die Baseline?