Architektur und Design von Hush Meet
┌─────────────────────────────────────────────────────┐
│ 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)─┘
│ │
└─────────────────────────────────────────────────────┘
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
src/content/index.ts)Dieses Skript wird in die Google Meet-Seite injiziert. Seine Hauptaufgaben sind:
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) |
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 |
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 |
Bietet ein anpassbares Tastenkürzel (Standard: Strg+Umschalt+M).
Das Tastenkürzel kann in den Popup-Einstellungen frei geändert werden.
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
Erkennt die Google Meet-Stummschaltungstaste mit mehreren Strategien:
aria-label-Attribut (unterstützt Japanisch/Englisch)data-tooltip-AttributStrg+D-Tastenkürzels
Der Stummschaltungszustand wird aus dem data-is-muted-Attribut oder dem aria-label-Textinhalt ermittelt.
src/popup/)Eine mit React 19 erstellte Einstellungs-UI. Synchronisiert den Zustand mit dem Content Script in Echtzeit über die Chrome Storage API.
speechThreshold (0,005–0,25) — pro Modus gespeichert
gracePeriod (500ms–4000ms) — pro Modus gespeichert
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.
| 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 |
| Befehl | Beschreibung |
|---|---|
vp install |
Abhängigkeiten installieren |
vp build |
Produktions-Build |
vp test |
Tests ausführen |
vp check |
Formatierung / Lint / Typprüfung |