← Zurück zur Startseite

Technische Dokumentation

Architektur und Design von Hush Meet

Architekturübersicht

┌─────────────────────────────────────────────────────┐
│  Chrome-Erweiterung (Manifest V3)                     │
│                                                     │
│  ┌──────────────┐     ┌───────────────────────────┐ │
│  │   Popup-UI   │     │     Content Script         │ │
│  │  (React)     │     │   (meet.google.com)        │ │
│  │              │     │                            │ │
│  │  - Umschalten    │     │  ┌────────────────────┐   │ │
│  │  - Messer     │◄───►│  │  Audio-Analysator    │   │ │
│  │  - Einstellg.  │     │  │  (Web Audio API)   │   │ │
│  │              │     │  └────────┬───────────┘   │ │
│  └──────────────┘     │           │               │ │
│         ▲             │  ┌────────▼───────────┐   │ │
│         │             │  │  Zustandsautomat     │   │ │
│         │             │  │  IDLE → MUTED →    │   │ │
│         │             │  │  SPEAKING → GRACE  │   │ │
│         │             │  └────────┬───────────┘   │ │
│         │             │           │               │ │
│         │             │  ┌────────▼───────────┐   │ │
│         │             │  │  Stumm-Controller   │   │ │
│         │             │  │  (DOM-Manipulation)│   │ │
│         │             │  └────────────────────┘   │ │
│         │             └───────────────────────────┘ │
│         │                                           │
│         └─── Chrome Storage API (Konfig/Status-Sync)─┘
│                                                     │
└─────────────────────────────────────────────────────┘

Projektstruktur

src/
├── constants.ts          # Konstanten, Modi, Schwellenwerte, Storage-Schlüssel
├── messages.ts           # i18n-Nachrichten (EN/JA)
├── i18n.ts               # Sprachverwaltung
├── manifest.ts           # Chrome-Erweiterung Manifest-Definition
├── background/
│   └── service-worker.ts # Service Worker (Spiel-Launcher, etc.)
├── content/
│   └── index.ts          # Content Script (Zustandsautomat, Modussteuerung, Tastenkürzel)
└── popup/
    ├── index.html        # Popup-Einstiegs-HTML
    ├── main.tsx          # React-Einbindung
    ├── Popup.tsx         # Popup-UI-Komponente
    ├── popup.css         # Styles
    ├── Equalizer.tsx     # Spektrumanalysator
    ├── ThemeSwitcher.tsx # Theme-Umschalter
    ├── LocaleSwitcher.tsx# Sprachumschalter
    └── GameLauncher.tsx  # Minispiel-Launcher

Komponentendetails

1. Content Script (src/content/index.ts)

Dieses Skript wird in die Google Meet-Seite injiziert. Seine Hauptaufgaben sind:

1.1 Audio-Analyse-Engine

Verwendet die Web Audio API AnalyserNode zur Echtzeitmessung der Mikrofon-Eingangslautstärke.

getUserMedia() → AudioContext → MediaStreamSource → AnalyserNode
                                                          │
                                                    getFloatTimeDomainData()
                                                          │
                                                    RMS-Berechnung (Root Mean Square)

Konfigurationsparameter:

Parameter Wert Beschreibung
fftSize 512 FFT-Fenstergröße
smoothingTimeConstant 0.3 Zeitliche Glättungskonstante
echoCancellation true Echounterdrückung aktivieren
noiseSuppression false Rauschunterdrückung aus (für VAD-Genauigkeit)

1.2 Zustandsautomat

Ein endlicher Zustandsautomat mit 5 Zuständen verwaltet den Sprechzustand.

IDLE ──(Modus außer Aus gewählt)──► MUTED ──(Lautstärke > Sprachschwelle)──► UNMUTING ──► SPEAKING
                     ▲                                                │
                     │                              (Lautstärke < Stilleschwelle)
                     │                                                │
                     └──(Nachklingtimer abgelaufen)── GRACE ◄────────────────┘
                                                │
                                         (Lautstärke > Stilleschwelle)
                                                │
                                                ▼
                                            SPEAKING

* Wenn der Benutzer das Meet-Mikrofon manuell umschaltet, bleibt der Modus gleich und nur der Zustand folgt.
Zustand Beschreibung Meet-Aktion
IDLE Aus-Modus oder nicht initialisiert Keine
MUTED Stille erkannt → stummgeschaltet Stummschalten
UNMUTING Sprache erkannt → Freischaltung Freischalten
SPEAKING Spricht gerade Keine
GRACE Sprache beendet → Nachklingzeit Keine

1.3 Betriebsmodi

Vier Modi steuern das Verhalten der Zustandsübergänge. Aus ist der deaktivierte Modus.

Modus Freischalten Stummschalten Tastenkürzel
Aus Keine Keine Deaktiviert
Auto Automatisch bei Spracherkennung Automatisch bei Stille Umschalten
Auto-Aus Manuell / Tastenkürzel Automatisch bei Stille Umschalten
Push-to-Talk Solange Taste gedrückt Taste losgelassen → Nachklingzeit → Stumm Halten

1.4 Tastenkürzel

Bietet ein anpassbares Tastenkürzel (Standard: Strg+Umschalt+M).

Das Tastenkürzel kann in den Popup-Einstellungen frei geändert werden.

1.5 Asymmetrisches Schwellenwert-Design

Unterschiedliche Schwellenwerte für Freischalten und Stummschalten verhindern Flattern (häufiges Umschalten).

Sprachschwelle (Sprachbeginn)    = 0,025  (Standard)
Stilleschwelle (Stilleerkennung) = Sprachschwelle × 0,5 = 0,0125

  Lautstärke
   ▲
   │  ┄┄┄┄┄┄┄┄┄ Sprachschwelle (0,025) ┄┄┄┄  ← Freischalten bei Überschreitung
   │
   │  ┄┄┄┄┄┄┄┄┄ Stilleschwelle (0,0125) ┄┄  ← Nachklingzeit beginnt bei Unterschreitung
   │
   └──────────────────────────────────────────► Zeit

1.6 Stummschaltungstasten-Erkennung

Erkennt die Google Meet-Stummschaltungstaste mit mehreren Strategien:

  1. Suche nach aria-label-Attribut (unterstützt Japanisch/Englisch)
  2. Suche nach data-tooltip-Attribut
  3. Fallback: Simulation des Strg+D-Tastenkürzels

Der Stummschaltungszustand wird aus dem data-is-muted-Attribut oder dem aria-label-Textinhalt ermittelt.

2. Popup UI (src/popup/)

Eine mit React 19 erstellte Einstellungs-UI. Synchronisiert den Zustand mit dem Content Script in Echtzeit über die Chrome Storage API.

Datenfluss

Popup → Chrome Storage → Content Script
  │                            │
  │  hushMeetConfig: object    │  (Empfindlichkeit/Nachklingzeit-Einstellungen)
  │  hushMeetMode: string      │  (Betriebsmodus)
  │  hushMeetShortcutKey: str  │  (Tastenkürzel)
  │                            │
  │                            ▼
  │                      Content Script → Chrome Storage → Popup
  │                            │
  │                            │  hushMeetState: string  (aktueller Zustand)
  │                            │  hushMeetLevel: number  (Lautstärkepegel)
  │                            │  hushMeetSpectrum: array (Spektrum)
  └────────────────────────────┘

Popup und Content Script kommunizieren nicht direkt; sie kommunizieren bidirektional über Chrome Storage API-Änderungsereignisse.

Build-System

Werkzeug Version Zweck
Vite+ toolchain Abhängigkeitsverwaltung, Build, Test, Validierung
Vite 8.x Interne Build-Infrastruktur
CRXJS Vite Plugin 2.x Chrome-Erweiterung HMR & Manifest-Generierung
React 19.x Popup UI
TypeScript 5.9.x Typsicherheit

Befehle

Befehl Beschreibung
vp install Abhängigkeiten installieren
vp build Produktions-Build
vp test Tests ausführen
vp check Formatierung / Lint / Typprüfung

Bekannte Einschränkungen

Zukünftige Verbesserungen