From 2cd721dd97a82504ab10d71bb4fea931e01ac129 Mon Sep 17 00:00:00 2001 From: Eddy Date: Wed, 15 Apr 2026 14:46:24 +0200 Subject: [PATCH] Feature: VoicePanel mit Push-to-Talk und Sprachsteuerung - Neues VoicePanel.svelte mit Mikrofon-Zugriff via Web Audio API - Push-to-Talk und Continuous-Mode (VAD-Ready) - Audio-Visualisierung mit Canvas-Waveform - OpenAI Whisper STT + TTS Integration via voice.rs - Stimmenauswahl (Alloy, Echo, Fable, Onyx, Nova, Shimmer) - Tab "Sprache" im rechten Panel integriert Co-Authored-By: Claude Opus 4.5 --- src/lib/components/VoicePanel.svelte | 664 +++++++++++++++++++++++++++ src/routes/+page.svelte | 4 + 2 files changed, 668 insertions(+) create mode 100644 src/lib/components/VoicePanel.svelte diff --git a/src/lib/components/VoicePanel.svelte b/src/lib/components/VoicePanel.svelte new file mode 100644 index 0000000..6771b79 --- /dev/null +++ b/src/lib/components/VoicePanel.svelte @@ -0,0 +1,664 @@ + + + + +
+
+

🎤 Sprachsteuerung

+ {#if !isVoiceAvailable} + API Key fehlt + {/if} +
+ + {#if isVoiceAvailable} +
+ +
+ + +
+ + +
+ + {#if isListening} +
+ + Höre zu... +
+ {/if} +
+ + +
+ {#if voiceMode === 'push-to-talk'} + +

Oder Leertaste gedrückt halten

+ {:else} + + {/if} +
+ + + {#if currentTranscript} +
+ Du: + {currentTranscript} +
+ {/if} + + + {#if isSpeaking} +
+ + Claude spricht... + +
+ {/if} + + +
+ + +
+
+ {:else} +
+

Setze OPENAI_API_KEY Umgebungsvariable für Sprachsteuerung.

+

Oder warte auf lokale Whisper/Piper Integration.

+
+ {/if} +
+ + diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 9063af8..13266b5 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -14,6 +14,7 @@ import PerformancePanel from '$lib/components/PerformancePanel.svelte'; import HooksPanel from '$lib/components/HooksPanel.svelte'; import ProgramsPanel from '$lib/components/ProgramsPanel.svelte'; + import VoicePanel from '$lib/components/VoicePanel.svelte'; let activeMiddleTab = 'activity'; let activeRightTab = 'agents'; @@ -30,6 +31,7 @@ const rightTabs = [ { id: 'agents', label: 'Agents', icon: '🤖' }, + { id: 'voice', label: 'Sprache', icon: '🎤' }, { id: 'context', label: 'Context', icon: '📌' }, { id: 'hooks', label: 'Hooks', icon: '🪝' }, { id: 'guards', label: 'Guard-Rails', icon: '🛡️' }, @@ -108,6 +110,8 @@
{#if activeRightTab === 'agents'} + {:else if activeRightTab === 'voice'} + {:else if activeRightTab === 'context'} {:else if activeRightTab === 'hooks'}