Verborgene Signale · Begleitseite ← Alle Aktivitäten DE·EN
Kapitel 10 · Die Stimme als Unterschrift · Aktivität 10.1

Die Stimme als Unterschrift

Derselbe Satz, dreimal gesprochen: fröhlich, müde, wütend. Die Wörter bleiben gleich — aber Tonhöhe, Lautstärke und Tempo verraten, was die Wörter verschweigen. Du machst das messbar.

Dauer 90 Min Schwierigkeit mittel Gruppe allein, Bonus als Klasse Rein digital S

Kurz gesagt

Was: Du nimmst denselben kurzen Satz in drei Stimmungen auf und lässt Python die Klangmerkmale herausrechnen: mittlere Tonhöhe, wie stark sie schwankt, die Lautstärke und das Sprechtempo. Du siehst schwarz auf weiss, dass „wie“ etwas gesagt wird eine eigene Botschaft trägt.

Erweiterung: Whisper verwandelt die Aufnahme in Text — und trennt so das Was vom Wie. Bonus: Als Klasse baut ihr einen Türöffner, der an der Stimme erkennt, wer spricht.

Du brauchst: ein Mikrofon und Python mit librosa (Klanganalyse) und numpy. Für die Erweiterung openai-whisper.

Worum es geht

Sag den Satz „Mir geht es gut“ auf drei Arten: fröhlich, müde, wütend. Die Worte bleiben gleich — und doch versteht jeder sofort drei verschiedene Dinge. Was den Unterschied trägt, sind nicht die Worte, sondern der Klang: die Tonhöhe, das Tempo, die kleinen Brüche und Pausen. In diesem Klang steckt eine zweite Botschaft, oft ehrlicher als die erste.

Und der Klang wird auf dieselbe Weise lesbar wie alles in diesem Buch: Man verwandelt ihn in ein Bild. Ein Spektrogramm zeigt die Frequenzen der Stimme über die Zeit — und schon greift dieselbe Bilderkennung, die sonst Katzen von Hunden unterscheidet. In dieser Aktivität bleiben wir aber bewusst bei den durchschaubaren Merkmalen: Tonhöhe, Lautstärke, Tempo. Du wählst die Merkmale selbst — das leichte, erklärbare Ende des Werkzeugkastens.

Ein bisschen Hintergrund

Was wir messen. Drei einfache, aussagekräftige Grössen: die Grundtonhöhe (wie hoch die Stimme im Mittel liegt) und wie stark sie schwankt (Monotonie vs. Melodie); die Lautstärke und ihre Schwankung (energisch vs. matt); und das Sprechtempo, grob als Anteil klingender zu stillen Abschnitten. Aus diesen wenigen Zahlen wird der emotionale Fingerabdruck eines Satzes.

So einzigartig wie ein Fingerabdruck. Die Stimme trägt zweierlei zugleich: was du sagst und wer du bist. Ihre feinen Eigenheiten erlauben es, Sprecher zu erkennen — die Grundlage davon, dass dein Telefon auf deine Stimme hört. Genau diese Einzigartigkeit nutzt der Bonus am Ende.

Die ehrliche Grenze: gefälschte Stimmen

Hier gerät der Leitgedanke des Buches ins Wanken. Ehrliche Signale galten als ehrlich, weil man sie nicht fälschen kann. Bei der Stimme stimmt das nicht mehr ganz: Aus wenigen Sekunden Aufnahme erzeugen heutige Modelle eine täuschend echte Kopie deiner Stimme, die Sätze sagt, die du nie gesprochen hast. Ein Signal ist nur so ehrlich, wie es schwer zu fälschen ist — und Technik kann diese Schwelle verschieben. Wer Stimmen liest, muss von nun an auch fragen, ob eine Stimme überhaupt echt ist. Deshalb sollte keine ernsthafte Sicherung allein auf der Stimme ruhen — auch nicht euer Bonus-Türöffner.

Aufnehmen

  1. Pakete installieren. pip install librosa numpy soundfile. (Für die Erweiterung zusätzlich pip install openai-whisper.)
  2. Denselben Satz dreimal sprechen. Wähle einen kurzen, neutralen Satz — etwa „Mir geht es gut“ oder „Heute ist Montag“. Nimm ihn dreimal auf: einmal fröhlich, einmal müde, einmal wütend. Gleicher Text, gleiche Nähe zum Mikrofon.
  3. Als WAV speichern. froehlich.wav, muede.wav, wuetend.wav. Ruhiger Raum, kein Hall, nah genug am Mikrofon.
  4. Auswerten. Skript unten über alle drei laufen lassen und die Zahlen vergleichen.

Auswerten mit librosa

Rund zwanzig Zeilen. Der Code zieht aus jeder Aufnahme die vier Merkmale und stellt sie nebeneinander. Vollständiger Code auf GitHub.

import librosa
import numpy as np

def merkmale(datei):
    y, sr = librosa.load(datei)                  # Audio laden
    dauer = librosa.get_duration(y=y, sr=sr)

    # Tonhoehe (Grundfrequenz) nur dort, wo wirklich Stimme klingt
    f0, stimmhaft, _ = librosa.pyin(
        y, fmin=70, fmax=400, sr=sr)
    tonhoehe = np.nanmean(f0)                     # mittlere Tonhoehe in Hz
    melodie  = np.nanstd(f0)                      # Schwankung = Melodie

    # Lautstaerke (Energie) im Zeitverlauf
    energie = librosa.feature.rms(y=y)[0]
    laut    = float(np.mean(energie))

    # Sprechtempo grob: Anteil klingender an allen Abschnitten
    anteil_klang = float(np.mean(stimmhaft))

    return dict(dauer=dauer, tonhoehe=tonhoehe, melodie=melodie,
                laut=laut, klanganteil=anteil_klang)

for name in ["froehlich", "muede", "wuetend"]:
    m = merkmale(f"{name}.wav")
    print(f"{name:9s}  Tonhoehe {m['tonhoehe']:5.0f} Hz   "
          f"Melodie {m['melodie']:5.0f}   Laut {m['laut']:.3f}   "
          f"Klanganteil {m['klanganteil']:.2f}")

Was du sehen solltest

Meist zeichnet sich ein klares Muster ab: fröhlich — höhere Tonhöhe, viel Melodie (grosse Schwankung), energisch; müde — tiefer, monoton (wenig Melodie), leise, langsam mit vielen Pausen; wütend — laut, oft tiefer und gepresst, hartes Tempo. Die Wörter waren identisch — die Zahlen sind es nicht. Genau das ist die zweite Botschaft der Stimme.

Das Spektrogramm sehen

Willst du den Klang als Bild sehen, zeichne mit librosa.display.specshow(librosa.amplitude_to_db(np.abs(librosa.stft(y)))) das Spektrogramm. Dieselbe Darstellung, aus der später eine Maschine ein Katzen-Miau oder den Klick einer durstigen Tomate liest — Stimme, Tier und Pflanze, ein Format.

Arbeitsblatt

Was der Klang verrät

  1. Trage für alle drei Aufnahmen Tonhöhe, Melodie, Lautstärke und Klanganteil ein. Welches Merkmal trennt „fröhlich“ und „müde“ am deutlichsten?
  2. Die Wörter waren in allen drei Aufnahmen identisch. Warum versteht ein Mensch trotzdem sofort drei verschiedene Dinge? Was trägt die Bedeutung?
  3. Erkläre in einem Satz, wie aus dem Klang ein Bild (Spektrogramm) wird — und warum das so praktisch ist.
  4. Die Stimme trägt zweierlei zugleich. Nenne beide — und je ein Beispiel, wofür man das eine und das andere benutzt.
  5. Warum ist die Stimme das eindrücklichste Beispiel für die „ehrliche Grenze“? Was macht sie neuerdings fälschbar, und welche Konsequenz zieht das nach sich?
Lösung anzeigen

1. Individuell; häufig trennt die Melodie (Schwankung der Tonhöhe) und die Lautstärke am klarsten: fröhlich ist melodisch und energisch, müde monoton und leise.

2. Weil die Bedeutung nicht nur in den Wörtern steckt, sondern im Klang darüber — Tonhöhe, Tempo, Pausen, Brüche. Dieser Klang ist eine zweite Botschaft, oft ehrlicher als die Wörter selbst.

3. Man legt kurze Zeitfenster über das Signal und rechnet für jedes aus, welche Frequenzen darin liegen (Fourier); trägt man das über die Zeit auf, entsteht ein Bild. Praktisch ist das, weil dann dieselbe Bilderkennung greift, die auch Fotos liest — man braucht keine eigene „Klang-KI“.

4. Erstens was du sagst (der Inhalt — z. B. für die Transkription mit Whisper) und zweitens wer du bist (die individuelle Klangsignatur — z. B. damit das Telefon seinen Besitzer erkennt).

5. Weil ehrliche Signale nur ehrlich sind, solange sie schwer zu fälschen sind — und moderne Modelle aus wenigen Sekunden eine täuschend echte Stimmkopie erzeugen. Folge: Wer Stimmen liest, muss künftig auch prüfen, ob eine Stimme echt ist; Sicherheit darf nie allein auf der Stimme beruhen.

Wenn's klemmt

ProblemWahrscheinliche Ursache & Lösung
librosa.load findet die Datei nichtFalscher Pfad oder Format. Als WAV speichern; Skript im selben Ordner starten oder vollen Pfad angeben.
Tonhöhe ist nanZu leise oder zu verrauscht — pyin findet keine Stimme. Näher ans Mikrofon, ruhiger Raum, fmin/fmax an deine Stimmlage anpassen.
Alle drei Aufnahmen sehen gleich ausZu zurückhaltend gesprochen. Die Stimmungen deutlich übertreiben — der Kontrast soll sichtbar werden.
Sehr langsam bei langen Dateienpyin ist rechenintensiv. Kurze Sätze (2–4 s) genügen; ggf. Audio auf 16 kHz laden (librosa.load(datei, sr=16000)).
Whisper meckert über ffmpegWhisper braucht ffmpeg. Über den Paketmanager des Systems installieren (z. B. apt install ffmpeg / brew install ffmpeg).

Erweiterung — das Was vom Wie trennen

Bisher hast du den Klang gemessen. Whisper, ein grosses vortrainiertes Sprachmodell, liest den Inhalt — es verwandelt die Aufnahme in Text. So hältst du beide Botschaften getrennt in der Hand:

import whisper

modell = whisper.load_model("base")          # klein, laeuft ohne Grafikkarte
ergebnis = modell.transcribe("wuetend.wav", language="de")
print("Gesagt (das WAS):", ergebnis["text"])
# Das WIE hast du oben schon gemessen — Tonhoehe, Melodie, Lautstaerke.

Der Witz: In allen drei Aufnahmen liefert Whisper denselben Text, während deine Klangmerkmale drei verschiedene Stimmungen zeigen. Was gesagt wurde, ist gleich; wie es gesagt wurde, nicht.

Bonus — „Sesam, öffne dich“: der Stimmschlüssel

Als Klasse baut ihr einen Türöffner aus Stimme. Jede und jeder nimmt denselben Satz mehrmals auf; ein kleines Modell lernt aus den Klangmerkmalen, wer spricht — nicht was gesagt wird. Sprich den Satz, und das Modell rät den Namen.

  1. Sammeln. Jede Person nimmt denselben Satz 5-mal auf (also z. B. 5 Personen × 5 = 25 Aufnahmen). Namen als Dateinamen.
  2. Merkmale ziehen. Für jede Aufnahme dieselben Klangmerkmale wie oben (plus optional die MFCC, die librosa als librosa.feature.mfcc liefert — ein kompakter Klang-Fingerabdruck).
  3. Lernen. Ein einfacher Klassifikator (z. B. sklearns KNeighborsClassifier) lernt, Merkmale → Name. Ein Teil der Aufnahmen zum Testen zurückhalten.
  4. Testen. Neue Aufnahme sprechen — errät das Modell den Sprecher? Und der ehrliche Test: Kann jemand mit ähnlicher Stimme (oder eine Stimmkopie!) den Schlüssel überlisten?

Die Lehre des Bonus

Der Stimmschlüssel funktioniert erstaunlich gut — und lässt sich doch täuschen. Genau das ist der Punkt: Eine gute Kopie könnte ihn öffnen. Der Bonus ist ein Spiel, keine Sicherung. Wer sein Handy oder seine Tür nur mit der Stimme schützt, hat die ehrliche Grenze nicht verstanden.

Zum Nachdenken

← 9.3 Persönlichkeit aus Mimik Alle Aktivitäten →