From 9e7cc6612f74d1ab3f532c93a35edeb993f0c55c Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 15:50:16 +0200 Subject: [PATCH] Lucy ausgegliedert: client/lucy-* -> eigenes Repo Hitonabi/lucy (+ alte hermes-voice geloescht) - lucy-desktop + lucy-tts leben jetzt in F:/Coding Stuff/lucy bzw. git .../Hitonabi/lucy (Verzeichnisnamen unveraendert -> alle Pfade/BATs funktionieren weiter) - lucy-f5 geloescht (Experiment abgeschlossen, Verdikt: Pocket bleibt; Skripte in der Historie) - hermes-voice geloescht (Vor-Lucy-Python-Client, ersetzt) - docs/LUCY_TTS_PLAN.md mit umgezogen; .gitignore entschlackt - MC2 = Box/Stack (Backend, Frontend, Sidecars, Deploy, hermes-pc-Executor) Co-Authored-By: Claude Fable 5 --- .gitignore | 22 - client/hermes-voice/agent_client.py | 31 - client/hermes-voice/ai_client.py | 47 - client/hermes-voice/audio_input.py | 91 - client/hermes-voice/audio_output.py | 70 - client/hermes-voice/build.bat | 46 - client/hermes-voice/config.py | 62 - client/hermes-voice/config_manager.py | 39 - client/hermes-voice/hotkey_listener.py | 103 - client/hermes-voice/main.py | 325 -- client/hermes-voice/requirements.txt | 29 - client/hermes-voice/screen_capture.py | 19 - client/hermes-voice/setup.bat | 44 - client/hermes-voice/start.bat | 4 - client/lucy-desktop/.gitignore | 7 - client/lucy-desktop/Lucy-Check.bat | 8 - client/lucy-desktop/Lucy-Dev-Debug.bat | 13 - client/lucy-desktop/Lucy-Neustart.bat | 12 - .../lucy-desktop/Verknuepfung-erstellen.bat | 7 - client/lucy-desktop/electron.vite.config.ts | 20 - client/lucy-desktop/lucy.ico | Bin 16608 -> 0 bytes client/lucy-desktop/package-lock.json | 4702 ----------------- client/lucy-desktop/package.json | 39 - .../lucy-desktop/scripts/copy-vad-assets.mjs | 23 - client/lucy-desktop/src/main/index.ts | 249 - client/lucy-desktop/src/preload/index.ts | 34 - client/lucy-desktop/src/renderer/index.html | 13 - .../src/renderer/public/vrma/ATTRIBUTION.md | 11 - .../src/renderer/public/vrma/Blush.vrma | Bin 118448 -> 0 bytes .../src/renderer/public/vrma/Clapping.vrma | Bin 118448 -> 0 bytes .../src/renderer/public/vrma/Goodbye.vrma | Bin 118448 -> 0 bytes .../src/renderer/public/vrma/LookAround.vrma | Bin 118448 -> 0 bytes .../src/renderer/public/vrma/Relax.vrma | Bin 118448 -> 0 bytes .../src/renderer/public/vrma/Sad.vrma | Bin 118448 -> 0 bytes .../src/renderer/public/vrma/Surprised.vrma | Bin 118448 -> 0 bytes .../src/renderer/public/vrma/Thinking.vrma | Bin 118448 -> 0 bytes client/lucy-desktop/src/renderer/src/App.tsx | 234 - .../src/renderer/src/components/AuraGlow.tsx | 47 - .../src/renderer/src/components/Avatar3D.tsx | 357 -- .../renderer/src/components/ChatMarkdown.tsx | 60 - .../lucy-desktop/src/renderer/src/config.ts | 58 - .../src/renderer/src/lib/voice/audio.ts | 175 - .../src/renderer/src/lib/voice/perf.ts | 8 - .../src/renderer/src/lib/voice/sentiment.ts | 14 - .../renderer/src/lib/voice/textPipeline.ts | 74 - .../renderer/src/lib/voice/useDanceAudio.ts | 48 - .../renderer/src/lib/voice/usePushToTalk.ts | 45 - .../src/renderer/src/lib/voice/useVAD.ts | 157 - .../renderer/src/lib/voice/useVoiceAgent.ts | 305 -- .../renderer/src/lib/voice/visionIntent.ts | 11 - client/lucy-desktop/src/renderer/src/main.tsx | 10 - .../lucy-desktop/src/renderer/src/styles.css | 282 - .../renderer/src/voice-core/engines/boxStt.ts | 18 - .../src/voice-core/engines/pocketTts.ts | 39 - .../src/renderer/src/voice-core/index.ts | 14 - .../src/renderer/src/voice-core/speech.ts | 84 - .../src/renderer/src/voice-core/types.ts | 27 - client/lucy-desktop/start-lucy.cmd | 9 - client/lucy-desktop/tsconfig.json | 15 - client/lucy-f5/bench_dml.py | 268 - client/lucy-f5/dakeqq_infer.py | 298 -- client/lucy-f5/f5_server.py | 196 - client/lucy-f5/f5_test.py | 44 - client/lucy-f5/lucy_ref.txt | 1 - client/lucy-f5/vocab.txt | 2545 --------- client/lucy-f5/vocab_v1.txt | 2545 --------- client/lucy-tts/B2-Test.bat | 12 - client/lucy-tts/Lucy-Samples-erzeugen.bat | 13 - client/lucy-tts/Lucy-Startklar.bat | 13 - client/lucy-tts/Sweep-B2.bat | 12 - client/lucy-tts/TTFB-Test.bat | 9 - client/lucy-tts/Umlaut-Test.bat | 9 - client/lucy-tts/analyze.py | 50 - client/lucy-tts/bench_b2.py | 67 - client/lucy-tts/bench_lucy.py | 109 - client/lucy-tts/debug_stream.py | 32 - client/lucy-tts/diag_clip.py | 41 - client/lucy-tts/diag_noiseclamp.py | 40 - client/lucy-tts/diag_stream2.py | 57 - client/lucy-tts/diag_stream3.py | 59 - client/lucy-tts/diag_voice_f0.py | 44 - client/lucy-tts/final_test.py | 47 - client/lucy-tts/lucy_ready.py | 60 - client/lucy-tts/make_samples.py | 64 - client/lucy-tts/measure_fix.py | 38 - client/lucy-tts/oute_pc.py | 45 - client/lucy-tts/pocket_server.py | 471 -- client/lucy-tts/ptts_preset.py | 47 - client/lucy-tts/ptts_test.py | 45 - client/lucy-tts/render_desktop.py | 28 - client/lucy-tts/speed_test.py | 20 - client/lucy-tts/stress_de.py | 47 - client/lucy-tts/sweep_b2.py | 105 - client/lucy-tts/sweep_quality.py | 53 - client/lucy-tts/sweep_quality2.py | 45 - client/lucy-tts/test_text_norm.py | 28 - client/lucy-tts/text_norm.py | 120 - client/lucy-tts/transcribe.py | 19 - client/lucy-tts/ttfb_test.py | 50 - client/lucy-tts/tune_front_loud.py | 79 - client/lucy-tts/tune_lsd.py | 33 - client/lucy-tts/tune_lsd_v2.py | 56 - client/lucy-tts/tune_natural.py | 61 - client/lucy-tts/tune_tailfix.py | 63 - client/lucy-tts/tune_temp_final.py | 40 - client/lucy-tts/umlaut_test.py | 49 - client/lucy-tts/verify_clip.py | 28 - 107 files changed, 16366 deletions(-) delete mode 100644 client/hermes-voice/agent_client.py delete mode 100644 client/hermes-voice/ai_client.py delete mode 100644 client/hermes-voice/audio_input.py delete mode 100644 client/hermes-voice/audio_output.py delete mode 100644 client/hermes-voice/build.bat delete mode 100644 client/hermes-voice/config.py delete mode 100644 client/hermes-voice/config_manager.py delete mode 100644 client/hermes-voice/hotkey_listener.py delete mode 100644 client/hermes-voice/main.py delete mode 100644 client/hermes-voice/requirements.txt delete mode 100644 client/hermes-voice/screen_capture.py delete mode 100644 client/hermes-voice/setup.bat delete mode 100644 client/hermes-voice/start.bat delete mode 100644 client/lucy-desktop/.gitignore delete mode 100644 client/lucy-desktop/Lucy-Check.bat delete mode 100644 client/lucy-desktop/Lucy-Dev-Debug.bat delete mode 100644 client/lucy-desktop/Lucy-Neustart.bat delete mode 100644 client/lucy-desktop/Verknuepfung-erstellen.bat delete mode 100644 client/lucy-desktop/electron.vite.config.ts delete mode 100644 client/lucy-desktop/lucy.ico delete mode 100644 client/lucy-desktop/package-lock.json delete mode 100644 client/lucy-desktop/package.json delete mode 100644 client/lucy-desktop/scripts/copy-vad-assets.mjs delete mode 100644 client/lucy-desktop/src/main/index.ts delete mode 100644 client/lucy-desktop/src/preload/index.ts delete mode 100644 client/lucy-desktop/src/renderer/index.html delete mode 100644 client/lucy-desktop/src/renderer/public/vrma/ATTRIBUTION.md delete mode 100644 client/lucy-desktop/src/renderer/public/vrma/Blush.vrma delete mode 100644 client/lucy-desktop/src/renderer/public/vrma/Clapping.vrma delete mode 100644 client/lucy-desktop/src/renderer/public/vrma/Goodbye.vrma delete mode 100644 client/lucy-desktop/src/renderer/public/vrma/LookAround.vrma delete mode 100644 client/lucy-desktop/src/renderer/public/vrma/Relax.vrma delete mode 100644 client/lucy-desktop/src/renderer/public/vrma/Sad.vrma delete mode 100644 client/lucy-desktop/src/renderer/public/vrma/Surprised.vrma delete mode 100644 client/lucy-desktop/src/renderer/public/vrma/Thinking.vrma delete mode 100644 client/lucy-desktop/src/renderer/src/App.tsx delete mode 100644 client/lucy-desktop/src/renderer/src/components/AuraGlow.tsx delete mode 100644 client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx delete mode 100644 client/lucy-desktop/src/renderer/src/components/ChatMarkdown.tsx delete mode 100644 client/lucy-desktop/src/renderer/src/config.ts delete mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/audio.ts delete mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/perf.ts delete mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/sentiment.ts delete mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/textPipeline.ts delete mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/useDanceAudio.ts delete mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/usePushToTalk.ts delete mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/useVAD.ts delete mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/useVoiceAgent.ts delete mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/visionIntent.ts delete mode 100644 client/lucy-desktop/src/renderer/src/main.tsx delete mode 100644 client/lucy-desktop/src/renderer/src/styles.css delete mode 100644 client/lucy-desktop/src/renderer/src/voice-core/engines/boxStt.ts delete mode 100644 client/lucy-desktop/src/renderer/src/voice-core/engines/pocketTts.ts delete mode 100644 client/lucy-desktop/src/renderer/src/voice-core/index.ts delete mode 100644 client/lucy-desktop/src/renderer/src/voice-core/speech.ts delete mode 100644 client/lucy-desktop/src/renderer/src/voice-core/types.ts delete mode 100644 client/lucy-desktop/start-lucy.cmd delete mode 100644 client/lucy-desktop/tsconfig.json delete mode 100644 client/lucy-f5/bench_dml.py delete mode 100644 client/lucy-f5/dakeqq_infer.py delete mode 100644 client/lucy-f5/f5_server.py delete mode 100644 client/lucy-f5/f5_test.py delete mode 100644 client/lucy-f5/lucy_ref.txt delete mode 100644 client/lucy-f5/vocab.txt delete mode 100644 client/lucy-f5/vocab_v1.txt delete mode 100644 client/lucy-tts/B2-Test.bat delete mode 100644 client/lucy-tts/Lucy-Samples-erzeugen.bat delete mode 100644 client/lucy-tts/Lucy-Startklar.bat delete mode 100644 client/lucy-tts/Sweep-B2.bat delete mode 100644 client/lucy-tts/TTFB-Test.bat delete mode 100644 client/lucy-tts/Umlaut-Test.bat delete mode 100644 client/lucy-tts/analyze.py delete mode 100644 client/lucy-tts/bench_b2.py delete mode 100644 client/lucy-tts/bench_lucy.py delete mode 100644 client/lucy-tts/debug_stream.py delete mode 100644 client/lucy-tts/diag_clip.py delete mode 100644 client/lucy-tts/diag_noiseclamp.py delete mode 100644 client/lucy-tts/diag_stream2.py delete mode 100644 client/lucy-tts/diag_stream3.py delete mode 100644 client/lucy-tts/diag_voice_f0.py delete mode 100644 client/lucy-tts/final_test.py delete mode 100644 client/lucy-tts/lucy_ready.py delete mode 100644 client/lucy-tts/make_samples.py delete mode 100644 client/lucy-tts/measure_fix.py delete mode 100644 client/lucy-tts/oute_pc.py delete mode 100644 client/lucy-tts/pocket_server.py delete mode 100644 client/lucy-tts/ptts_preset.py delete mode 100644 client/lucy-tts/ptts_test.py delete mode 100644 client/lucy-tts/render_desktop.py delete mode 100644 client/lucy-tts/speed_test.py delete mode 100644 client/lucy-tts/stress_de.py delete mode 100644 client/lucy-tts/sweep_b2.py delete mode 100644 client/lucy-tts/sweep_quality.py delete mode 100644 client/lucy-tts/sweep_quality2.py delete mode 100644 client/lucy-tts/test_text_norm.py delete mode 100644 client/lucy-tts/text_norm.py delete mode 100644 client/lucy-tts/transcribe.py delete mode 100644 client/lucy-tts/ttfb_test.py delete mode 100644 client/lucy-tts/tune_front_loud.py delete mode 100644 client/lucy-tts/tune_lsd.py delete mode 100644 client/lucy-tts/tune_lsd_v2.py delete mode 100644 client/lucy-tts/tune_natural.py delete mode 100644 client/lucy-tts/tune_tailfix.py delete mode 100644 client/lucy-tts/tune_temp_final.py delete mode 100644 client/lucy-tts/umlaut_test.py delete mode 100644 client/lucy-tts/verify_clip.py diff --git a/.gitignore b/.gitignore index c10301f..9b42480 100644 --- a/.gitignore +++ b/.gitignore @@ -20,25 +20,3 @@ frontend/dist/avatar.vrm box_recon* gemma_swap* -# Lucy-TTS/F5-Experimente: nur Code/Batch committen — venvs, Modelle, Audio, Logs bleiben lokal -client/lucy-tts/ptts-venv/ -client/lucy-tts/venv/ -client/lucy-tts/llamacpp-vulkan/ -client/lucy-tts/llamacpp-vulkan.zip -client/lucy-tts/models/ -client/lucy-tts/out_*/ -client/lucy-tts/*.wav -client/lucy-tts/*.mp3 -client/lucy-tts/*.log -client/lucy-tts/*.safetensors -client/lucy-tts/*.json -client/lucy-f5/.cache/ -client/lucy-f5/F5-TTS-ONNX/ -client/lucy-f5/onnx_de/ -client/lucy-f5/onnx_f32/ -client/lucy-f5/vocos-mel-24khz/ -client/lucy-f5/*.onnx -client/lucy-f5/*.safetensors -client/lucy-f5/*.wav -client/lucy-f5/*.zip -client/lucy-f5/venv/ diff --git a/client/hermes-voice/agent_client.py b/client/hermes-voice/agent_client.py deleted file mode 100644 index 61171fc..0000000 --- a/client/hermes-voice/agent_client.py +++ /dev/null @@ -1,31 +0,0 @@ -"""Spricht mit dem Hermes Agent Daemon auf der AI Box.""" -import httpx - -TIMEOUT = 120 - - -def ask_agent(text: str, screenshot_b64: str | None, settings: dict) -> tuple[str, list]: - """Schickt Nachricht an den Daemon, gibt (response, tool_calls) zurück.""" - daemon_url = settings.get("agent_daemon_url", "http://192.168.178.151:8765") - try: - with httpx.Client(timeout=TIMEOUT) as c: - resp = c.post(f"{daemon_url}/chat", json={ - "message": text, - "screenshot": screenshot_b64, - }) - resp.raise_for_status() - data = resp.json() - return data.get("response", ""), data.get("tool_calls", []) - except httpx.TimeoutException: - return "Antwort hat zu lange gedauert.", [] - except Exception as e: - return f"Agent nicht erreichbar: {e}", [] - - -def get_agent_status(settings: dict) -> dict: - daemon_url = settings.get("agent_daemon_url", "http://192.168.178.151:8765") - try: - with httpx.Client(timeout=5) as c: - return c.get(f"{daemon_url}/status").json() - except Exception: - return {"alive": False} diff --git a/client/hermes-voice/ai_client.py b/client/hermes-voice/ai_client.py deleted file mode 100644 index 55df3f7..0000000 --- a/client/hermes-voice/ai_client.py +++ /dev/null @@ -1,47 +0,0 @@ -import httpx - -SYSTEM_PROMPT = ( - "Du bist Hermes, ein hilfreicher KI-Assistent. " - "Antworte kurz und präzise, da deine Antwort vorgelesen wird. " - "Maximal 3-4 Sätze, kein Markdown." -) -REQUEST_TIMEOUT = 30 - - -def ask(text: str, screenshot_b64: str | None, settings: dict) -> str: - """Schickt Text (+ optionalen Screenshot) an MC2 und gibt die Antwort zurück.""" - use_vision = screenshot_b64 is not None - model = settings.get("vision_model", "Qwen3-VL-2B-Instruct") if use_vision \ - else settings.get("chat_model", "Hermes-4-14B") - base_url = settings.get("mc2_url", "http://192.168.178.151:9001/v1") - max_tokens = int(settings.get("max_response_tokens", 200)) - - if use_vision: - user_content = [ - {"type": "text", "text": text}, - {"type": "image_url", "image_url": { - "url": f"data:image/jpeg;base64,{screenshot_b64}" - }}, - ] - else: - user_content = text - - payload = { - "model": model, - "messages": [ - {"role": "system", "content": SYSTEM_PROMPT}, - {"role": "user", "content": user_content}, - ], - "max_tokens": max_tokens, - "stream": False, - } - - try: - with httpx.Client(timeout=REQUEST_TIMEOUT) as client: - response = client.post(f"{base_url}/chat/completions", json=payload) - response.raise_for_status() - return response.json()["choices"][0]["message"]["content"].strip() - except httpx.TimeoutException: - return "Entschuldigung, die Antwort hat zu lange gedauert." - except Exception as e: - return f"Verbindungsfehler: {e}" diff --git a/client/hermes-voice/audio_input.py b/client/hermes-voice/audio_input.py deleted file mode 100644 index 8d500b9..0000000 --- a/client/hermes-voice/audio_input.py +++ /dev/null @@ -1,91 +0,0 @@ -""" -Audio-Input: Aufnahme + Whisper STT. -Kein Wake-Word-Loop — Aufnahme startet direkt auf Hotkey-Signal. -""" -import os -import tempfile -import threading -import numpy as np -import sounddevice as sd -import scipy.io.wavfile as wav -from faster_whisper import WhisperModel -from pathlib import Path - -SAMPLE_RATE = 16000 -CHUNK = 1024 -ENERGY_THRESHOLD = 0.008 - -_model: WhisperModel | None = None -_model_size: str = "" -_recording = False -_frames: list[np.ndarray] = [] -_stream: sd.InputStream | None = None -_lock = threading.Lock() - - -def load_model(model_size: str): - global _model, _model_size - if _model is None or _model_size != model_size: - model_dir = Path.home() / ".hermes-voice" / "whisper-models" - model_dir.mkdir(parents=True, exist_ok=True) - _model = WhisperModel( - model_size, - device="cpu", - compute_type="int8", - download_root=str(model_dir), - ) - _model_size = model_size - - -def start_recording(): - global _recording, _frames, _stream - with _lock: - _recording = True - _frames = [] - - def callback(indata, frames, time, status): - if _recording: - _frames.append(indata[:, 0].copy()) - - _stream = sd.InputStream( - samplerate=SAMPLE_RATE, - channels=1, - dtype="float32", - blocksize=CHUNK, - callback=callback, - ) - _stream.start() - - -def stop_recording() -> np.ndarray: - global _recording, _stream - with _lock: - _recording = False - if _stream: - _stream.stop() - _stream.close() - _stream = None - if not _frames: - return np.array([], dtype=np.float32) - return np.concatenate(_frames) - - -def transcribe(audio: np.ndarray, model_size: str, language: str) -> str: - if len(audio) < SAMPLE_RATE * 0.3: - return "" - load_model(model_size) - - with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f: - tmp = f.name - try: - wav.write(tmp, SAMPLE_RATE, (audio * 32767).astype(np.int16)) - lang = language if language != "auto" else None - segments, _ = _model.transcribe( - tmp, - language=lang, - beam_size=3, - vad_filter=True, - ) - return " ".join(s.text for s in segments).strip() - finally: - os.unlink(tmp) diff --git a/client/hermes-voice/audio_output.py b/client/hermes-voice/audio_output.py deleted file mode 100644 index 1b4f0c1..0000000 --- a/client/hermes-voice/audio_output.py +++ /dev/null @@ -1,70 +0,0 @@ -import asyncio -import os -import tempfile -import threading -import time -import pygame -import edge_tts - -pygame.mixer.init() -_stop_event = threading.Event() -_speak_lock = threading.Lock() - - -def stop_speaking(): - _stop_event.set() - pygame.mixer.music.stop() - - -def speak(text: str, voice: str = "de-DE-SeraphinaMultilingualNeural", rate: str = "+0%"): - """Text → Edge TTS → Lautsprecher. Blockiert bis fertig oder unterbrochen.""" - with _speak_lock: - _stop_event.clear() - - tmp_path = None - try: - with tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) as f: - tmp_path = f.name - - # Edge TTS in eigenem Event-Loop (Thread-sicher) - loop = asyncio.new_event_loop() - try: - communicate = edge_tts.Communicate(text, voice, rate=rate) - loop.run_until_complete(communicate.save(tmp_path)) - finally: - loop.close() - - if _stop_event.is_set(): - return - - pygame.mixer.music.load(tmp_path) - pygame.mixer.music.play() - - # Polling ohne pygame.time.wait (blockiert Event-Loop nicht) - while pygame.mixer.music.get_busy(): - if _stop_event.is_set(): - pygame.mixer.music.stop() - break - time.sleep(0.05) - - except Exception: - pass - finally: - if tmp_path and os.path.exists(tmp_path): - try: - os.unlink(tmp_path) - except OSError: - pass - - -def play_ding(): - """Kurzer Aktivierungs-Ton (440 Hz, 120ms).""" - import numpy as np - sample_rate = 44100 - duration = 0.12 - t = np.linspace(0, duration, int(sample_rate * duration), False) - wave = (np.sin(2 * np.pi * 440 * t) * 0.3 * 32767).astype(np.int16) - stereo = np.column_stack([wave, wave]) - sound = pygame.sndarray.make_sound(stereo) - sound.play() - time.sleep(duration + 0.02) diff --git a/client/hermes-voice/build.bat b/client/hermes-voice/build.bat deleted file mode 100644 index a4de412..0000000 --- a/client/hermes-voice/build.bat +++ /dev/null @@ -1,46 +0,0 @@ -@echo off -cd /d "%~dp0" - -echo ======================================== -echo Hermes Voice Client -- Build (.exe) -echo ======================================== -echo. - -:: Venv pruefen -if not exist ".venv\Scripts\activate.bat" ( - echo [FEHLER] Bitte erst setup.bat ausfuehren. - pause - exit /b 1 -) - -:: PyInstaller installieren falls noetig -.venv\Scripts\pip install pyinstaller -q - -echo [1/2] Baue HermesVoice.exe ... -.venv\Scripts\pyinstaller ^ - --onefile ^ - --windowed ^ - --name HermesVoice ^ - --add-data "assets;assets" ^ - --hidden-import "customtkinter" ^ - --hidden-import "pynput.keyboard._win32" ^ - --hidden-import "pynput.mouse._win32" ^ - --collect-all "customtkinter" ^ - main.py - -echo. -if exist "dist\HermesVoice.exe" ( - echo [2/2] Fertig! - echo. - echo dist\HermesVoice.exe ^(%.0f MB^) - echo. - echo Die .exe benoetigt beim ersten Start Internet fuer: - echo - Whisper-Modell-Download ^(~150MB fuer "small"^) - echo - Edge TTS ^(online^) - echo. - for %%I in ("dist\HermesVoice.exe") do echo Groesse: %%~zI Bytes -) else ( - echo [FEHLER] Build fehlgeschlagen. Siehe build-Log oben. -) -echo ======================================== -pause diff --git a/client/hermes-voice/config.py b/client/hermes-voice/config.py deleted file mode 100644 index 092f4c8..0000000 --- a/client/hermes-voice/config.py +++ /dev/null @@ -1,62 +0,0 @@ -# Hermes Voice Client — Konfiguration -# Alle Einstellungen hier anpassen, kein Code-Edit nötig. - -# ── AI-Box ────────────────────────────────────────────────────────────── -MC2_BASE_URL = "http://192.168.178.151:9001/v1" - -# Modell für reine Text-Anfragen (kein Screenshot) -CHAT_MODEL = "Hermes-4-14B" - -# Modell wenn ein Screenshot mitgeschickt wird -VISION_MODEL = "Qwen3-VL-2B-Instruct" - -# ── Wake Word ──────────────────────────────────────────────────────────── -# Einfach den gewünschten Trigger-Text hier eintragen — kein Account, kein Download. -# Whisper transkribiert Sprache und prüft ob eines der Wörter enthalten ist. -# Mehrere Varianten möglich: ["hey hermes", "hermes", "hey jarvis"] -WAKE_WORDS = ["hey hermes", "hermes"] - -# Whisper-Modell für die schnelle Wake-Detection (tiny = 39MB, sehr schnell) -WAKE_WHISPER_MODEL = "tiny" - -# ── Spracheingabe ──────────────────────────────────────────────────────── -# faster-whisper Modellgröße: "tiny", "base", "small", "medium" -# "small" läuft gut auf CPU (~244 MB), "base" ist schneller aber ungenauer -WHISPER_MODEL_SIZE = "small" -WHISPER_LANGUAGE = "de" # "de" für Deutsch, "en" für Englisch, None = auto - -# Sekunden Stille bis Aufnahme endet -SILENCE_TIMEOUT = 1.5 -# Maximale Aufnahmedauer in Sekunden (Sicherheitsnetz) -MAX_RECORD_SECONDS = 20 - -# ── Sprachausgabe ──────────────────────────────────────────────────────── -# Edge TTS Stimmen: https://speech.microsoft.com/portal/voicegallery -# Deutsch: "de-DE-KillianNeural", "de-DE-SeraphinaMultilingualNeural" -# Englisch: "en-US-AndrewNeural", "en-US-AriaNeural" -TTS_VOICE = "de-DE-KillianNeural" -TTS_RATE = "+0%" # Geschwindigkeit: "+10%" schneller, "-10%" langsamer -TTS_PITCH = "+0Hz" # Tonhöhe - -# ── Screen Capture ─────────────────────────────────────────────────────── -# Screenshot bei jeder Anfrage mitschicken? -SCREENSHOT_ON_QUERY = True -# Monitor-Index (0 = alle, 1 = primär, 2 = zweiter Monitor) -SCREENSHOT_MONITOR = 1 -# Auflösung für Screenshot (kleinere = schnellere Übertragung) -SCREENSHOT_WIDTH = 1280 -SCREENSHOT_HEIGHT = 720 - -# ── Agent-Verhalten ────────────────────────────────────────────────────── -MAX_RESPONSE_TOKENS = 200 # kurze gesprochene Antworten -REQUEST_TIMEOUT = 30 # Sekunden bis Timeout - -SYSTEM_PROMPT = """Du bist Hermes, ein KI-Assistent der direkt in den lokalen AI-Homelab integriert ist. -Du hörst die Stimme des Nutzers und siehst seinen Bildschirm. - -Regeln für Antworten: -- Kurz und präzise (2–4 Sätze maximum) -- Kein Markdown, keine Aufzählungen, keine Codeblöcke — du wirst gesprochen -- Wenn du einen offensichtlichen Fehler auf dem Bildschirm siehst, weise kurz darauf hin -- Antworte auf Deutsch wenn der Nutzer Deutsch spricht, auf Englisch wenn Englisch -- Sei direkt und hilfreich, kein unnötiges Smalltalk""" diff --git a/client/hermes-voice/config_manager.py b/client/hermes-voice/config_manager.py deleted file mode 100644 index c2d725c..0000000 --- a/client/hermes-voice/config_manager.py +++ /dev/null @@ -1,39 +0,0 @@ -import json -from pathlib import Path - -CONFIG_DIR = Path.home() / ".hermes-voice" -SETTINGS_FILE = CONFIG_DIR / "settings.json" - -DEFAULTS = { - "mc2_url": "http://192.168.178.151:9001/v1", - "chat_model": "Hermes-4-14B", - "vision_model": "Qwen3-VL-2B-Instruct", - "hotkey": "ctrl_r", - "tts_voice": "de-DE-SeraphinaMultilingualNeural", - "tts_rate": "+0%", - "whisper_model": "small", - "language": "de", - "screenshot_enabled": True, - "screenshot_monitor": 1, - "max_response_tokens": 200, - "silence_timeout": 1.5, -} - - -def load() -> dict: - CONFIG_DIR.mkdir(exist_ok=True) - if SETTINGS_FILE.exists(): - try: - saved = json.loads(SETTINGS_FILE.read_text(encoding="utf-8")) - return {**DEFAULTS, **saved} - except Exception: - pass - return dict(DEFAULTS) - - -def save(settings: dict): - CONFIG_DIR.mkdir(exist_ok=True) - SETTINGS_FILE.write_text( - json.dumps(settings, indent=2, ensure_ascii=False), - encoding="utf-8", - ) diff --git a/client/hermes-voice/hotkey_listener.py b/client/hermes-voice/hotkey_listener.py deleted file mode 100644 index e148b00..0000000 --- a/client/hermes-voice/hotkey_listener.py +++ /dev/null @@ -1,103 +0,0 @@ -""" -Globaler Push-to-Talk Hotkey via pynput. -Funktioniert auch wenn das Fenster minimiert/im Hintergrund ist. -""" -import threading -from pynput import keyboard - -# Mapping: config-String → pynput Key/KeyCode -_SPECIAL = { - "ctrl_r": keyboard.Key.ctrl_r, - "ctrl_l": keyboard.Key.ctrl_l, - "alt_r": keyboard.Key.alt_r, - "alt_l": keyboard.Key.alt_l, - "shift_r": keyboard.Key.shift_r, - "shift_l": keyboard.Key.shift_l, - "f13": keyboard.Key.f13, - "f14": keyboard.Key.f14, - "f15": keyboard.Key.f15, - "f16": keyboard.Key.f16, - "caps_lock": keyboard.Key.caps_lock, - "scroll_lock": keyboard.Key.scroll_lock, - "pause": keyboard.Key.pause, -} - -DISPLAY_NAMES = { - "ctrl_r": "Rechte Strg", - "ctrl_l": "Linke Strg", - "alt_r": "Rechte Alt", - "alt_l": "Linke Alt", - "shift_r": "Rechte Shift", - "shift_l": "Linke Shift", - "f13": "F13", "f14": "F14", "f15": "F15", "f16": "F16", - "caps_lock": "Caps Lock", - "scroll_lock": "Scroll Lock", - "pause": "Pause", -} - - -def key_to_str(key) -> str: - """Konvertiert pynput Key → config-String.""" - for name, k in _SPECIAL.items(): - if key == k: - return name - if hasattr(key, "char") and key.char: - return key.char.lower() - return str(key).replace("Key.", "") - - -def str_to_display(key_str: str) -> str: - return DISPLAY_NAMES.get(key_str, key_str.upper()) - - -class HotkeyListener: - def __init__(self, key_str: str, on_press_cb, on_release_cb): - self._key_str = key_str - self._on_press = on_press_cb - self._on_release = on_release_cb - self._pressed = False - self._listener: keyboard.Listener | None = None - - def _target_key(self): - return _SPECIAL.get(self._key_str) or keyboard.KeyCode.from_char(self._key_str) - - def _on_press_raw(self, key): - if not self._pressed and key == self._target_key(): - self._pressed = True - self._on_press() - - def _on_release_raw(self, key): - if self._pressed and key == self._target_key(): - self._pressed = False - self._on_release() - - def start(self): - self._listener = keyboard.Listener( - on_press=self._on_press_raw, - on_release=self._on_release_raw, - ) - self._listener.start() - - def stop(self): - if self._listener: - self._listener.stop() - - def update_key(self, key_str: str): - self._key_str = key_str - self._pressed = False - - -class KeyCapturer: - """Einmalig den nächsten Tastendruck abfangen für Hotkey-Konfiguration.""" - - def __init__(self, callback): - self._callback = callback - self._listener: keyboard.Listener | None = None - - def start(self): - def on_press(key): - key_str = key_to_str(key) - self._listener.stop() - self._callback(key_str) - self._listener = keyboard.Listener(on_press=on_press) - self._listener.start() diff --git a/client/hermes-voice/main.py b/client/hermes-voice/main.py deleted file mode 100644 index 26441f3..0000000 --- a/client/hermes-voice/main.py +++ /dev/null @@ -1,325 +0,0 @@ -""" -Hermes Voice Client — GUI -Push-to-Talk: Hotkey halten → sprechen → loslassen → Hermes antwortet -""" -import queue -import threading -import sys -import customtkinter as ctk -from PIL import Image, ImageDraw - -import config_manager as cfg -from audio_input import start_recording, stop_recording, transcribe -from audio_output import speak, stop_speaking, play_ding -from screen_capture import capture_screen -from agent_client import ask_agent, get_agent_status -from hotkey_listener import HotkeyListener, KeyCapturer, str_to_display - -ctk.set_appearance_mode("dark") -ctk.set_default_color_theme("blue") - -# ── UI-Event-Queue (thread-safe) ───────────────────────────────────────── -_ui_queue: queue.Queue = queue.Queue() - -def ui_event(event: str, data=None): - _ui_queue.put((event, data)) - - -# ── Hauptfenster ───────────────────────────────────────────────────────── -class HermesApp(ctk.CTk): - def __init__(self): - super().__init__() - self.settings = cfg.load() - self._hotkey: HotkeyListener | None = None - self._worker: threading.Thread | None = None - - self.title("Hermes Voice") - self.geometry("400x520") - self.resizable(False, False) - self.protocol("WM_DELETE_WINDOW", self._on_close) - - self._build_ui() - self._start_hotkey() - self.after(100, self._poll_queue) - - # ── Layout ─────────────────────────────────────────────────────────── - def _build_ui(self): - self.grid_columnconfigure(0, weight=1) - self.grid_rowconfigure(2, weight=1) - - # Header - header = ctk.CTkFrame(self, height=50, corner_radius=0) - header.grid(row=0, column=0, sticky="ew") - header.grid_columnconfigure(0, weight=1) - ctk.CTkLabel(header, text="⚡ Hermes Voice", - font=ctk.CTkFont(size=16, weight="bold")).grid( - row=0, column=0, padx=16, pady=12, sticky="w") - ctk.CTkButton(header, text="⚙", width=36, height=36, - command=self._open_settings).grid( - row=0, column=1, padx=8, pady=8) - - # Status - status_frame = ctk.CTkFrame(self, corner_radius=12) - status_frame.grid(row=1, column=0, padx=16, pady=(16, 8), sticky="ew") - status_frame.grid_columnconfigure(0, weight=1) - - self._status_dot = ctk.CTkLabel(status_frame, text="●", - font=ctk.CTkFont(size=32), - text_color="#22c55e") - self._status_dot.grid(row=0, column=0, pady=(12, 4)) - - self._status_label = ctk.CTkLabel(status_frame, text="Bereit", - font=ctk.CTkFont(size=14)) - self._status_label.grid(row=1, column=0, pady=(0, 4)) - - self._hotkey_label = ctk.CTkLabel( - status_frame, - text=f"[ {str_to_display(self.settings['hotkey'])} ] gedrückt halten", - font=ctk.CTkFont(size=11), - text_color="gray", - ) - self._hotkey_label.grid(row=2, column=0, pady=(0, 12)) - - # Conversation log - log_frame = ctk.CTkFrame(self, corner_radius=12) - log_frame.grid(row=2, column=0, padx=16, pady=8, sticky="nsew") - log_frame.grid_columnconfigure(0, weight=1) - log_frame.grid_rowconfigure(1, weight=1) - - ctk.CTkLabel(log_frame, text="Letzte Konversation", - font=ctk.CTkFont(size=11), text_color="gray").grid( - row=0, column=0, padx=12, pady=(8, 0), sticky="w") - - self._log = ctk.CTkTextbox(log_frame, font=ctk.CTkFont(size=12), - state="disabled", wrap="word") - self._log.grid(row=1, column=0, padx=8, pady=(4, 8), sticky="nsew") - - # Footer - footer = ctk.CTkFrame(self, height=40, corner_radius=0) - footer.grid(row=3, column=0, sticky="ew") - footer.grid_columnconfigure(0, weight=1) - - self._screenshot_var = ctk.BooleanVar( - value=self.settings["screenshot_enabled"]) - ctk.CTkCheckBox(footer, text="Screenshot mitsenden", - variable=self._screenshot_var, - command=self._toggle_screenshot).grid( - row=0, column=0, padx=16, pady=8, sticky="w") - - ctk.CTkButton(footer, text="Stop", width=60, height=28, - fg_color="#dc2626", hover_color="#b91c1c", - command=stop_speaking).grid( - row=0, column=1, padx=8, pady=8) - - # ── Hotkey ─────────────────────────────────────────────────────────── - def _start_hotkey(self): - if self._hotkey: - self._hotkey.stop() - self._hotkey = HotkeyListener( - self.settings["hotkey"], - on_press_cb=self._hotkey_pressed, - on_release_cb=self._hotkey_released, - ) - self._hotkey.start() - - def _hotkey_pressed(self): - ui_event("status", ("recording", "🔴 Ich höre…", "#ef4444")) - play_ding() - start_recording() - - def _hotkey_released(self): - audio = stop_recording() - ui_event("status", ("thinking", "💭 Denke…", "#3b82f6")) - self._worker = threading.Thread( - target=self._process, args=(audio,), daemon=True) - self._worker.start() - - def _process(self, audio): - text = transcribe(audio, - self.settings["whisper_model"], - self.settings["language"]) - if not text: - ui_event("status", ("idle", "Bereit", "#22c55e")) - return - - ui_event("log_user", text) - screenshot = (capture_screen() - if self.settings["screenshot_enabled"] else None) - - ui_event("status", ("thinking", "💭 Denke…", "#3b82f6")) - response, tool_calls = ask_agent(text, screenshot, self.settings) - - for tc in tool_calls: - ui_event("log_tool", tc) - - ui_event("log_hermes", response) - ui_event("status", ("speaking", "🔊 Spricht…", "#a855f7")) - speak(response, self.settings["tts_voice"], self.settings["tts_rate"]) - ui_event("status", ("idle", "Bereit", "#22c55e")) - - # ── Queue-Polling ──────────────────────────────────────────────────── - def _poll_queue(self): - while not _ui_queue.empty(): - event, data = _ui_queue.get_nowait() - if event == "status": - _, label, color = data - self._status_label.configure(text=label) - self._status_dot.configure(text_color=color) - elif event == "log_user": - self._append_log(f"Du: {data}") - elif event == "log_hermes": - self._append_log(f"Hermes: {data}\n") - self.after(80, self._poll_queue) - - def _append_log(self, text: str): - self._log.configure(state="normal") - self._log.insert("end", text + "\n") - self._log.see("end") - self._log.configure(state="disabled") - - # ── Settings Dialog ────────────────────────────────────────────────── - def _open_settings(self): - SettingsWindow(self) - - def _toggle_screenshot(self): - self.settings["screenshot_enabled"] = self._screenshot_var.get() - cfg.save(self.settings) - - def apply_settings(self, new_settings: dict): - self.settings = new_settings - cfg.save(new_settings) - self._hotkey.update_key(new_settings["hotkey"]) - self._hotkey_label.configure( - text=f"[ {str_to_display(new_settings['hotkey'])} ] gedrückt halten") - self._screenshot_var.set(new_settings["screenshot_enabled"]) - - def _on_close(self): - if self._hotkey: - self._hotkey.stop() - stop_speaking() - self.destroy() - - -# ── Settings Window ─────────────────────────────────────────────────────── -class SettingsWindow(ctk.CTkToplevel): - def __init__(self, parent: HermesApp): - super().__init__(parent) - self._parent = parent - self.title("Einstellungen") - self.geometry("420x520") - self.resizable(False, False) - self.grab_set() - self._s = dict(parent.settings) - self._capturing = False - self._build() - - def _build(self): - self.grid_columnconfigure(1, weight=1) - row = 0 - - def label(text): - nonlocal row - ctk.CTkLabel(self, text=text, anchor="w").grid( - row=row, column=0, padx=16, pady=6, sticky="w") - - def entry(key, width=240): - nonlocal row - var = ctk.StringVar(value=str(self._s.get(key, ""))) - e = ctk.CTkEntry(self, textvariable=var, width=width) - e.grid(row=row, column=1, padx=16, pady=6, sticky="ew") - row += 1 - return var - - def dropdown(key, options, width=200): - nonlocal row - var = ctk.StringVar(value=str(self._s.get(key, options[0]))) - dd = ctk.CTkOptionMenu(self, values=options, variable=var, width=width) - dd.grid(row=row, column=1, padx=16, pady=6, sticky="w") - row += 1 - return var - - def toggle(key): - nonlocal row - var = ctk.BooleanVar(value=bool(self._s.get(key, False))) - sw = ctk.CTkSwitch(self, text="", variable=var) - sw.grid(row=row, column=1, padx=16, pady=6, sticky="w") - row += 1 - return var - - label("MC2 URL") - self._url = entry("mc2_url") - - label("Hotkey") - self._hotkey_frame = ctk.CTkFrame(self, fg_color="transparent") - self._hotkey_frame.grid(row=row, column=1, padx=16, pady=6, sticky="w") - self._hotkey_display = ctk.CTkLabel( - self._hotkey_frame, - text=str_to_display(self._s.get("hotkey", "ctrl_r")), - width=100, - ) - self._hotkey_display.grid(row=0, column=0, padx=(0, 8)) - ctk.CTkButton(self._hotkey_frame, text="Aufnehmen", width=90, - command=self._capture_hotkey).grid(row=0, column=1) - row += 1 - - label("TTS Stimme") - self._voice = dropdown("tts_voice", [ - "de-DE-SeraphinaMultilingualNeural", - "de-DE-AmalaNeural", - "de-DE-KatjaNeural", - "de-DE-KillianNeural", - "de-DE-ConradNeural", - "en-US-AriaNeural", - "en-US-JennyNeural", - ]) - - label("Whisper Modell") - self._whisper = dropdown("whisper_model", - ["tiny", "base", "small", "medium"]) - - label("Sprache") - self._lang = dropdown("language", - ["de", "en", "auto"]) - - label("Screenshot") - self._screenshot = toggle("screenshot_enabled") - - label("Monitor") - self._monitor = dropdown("screenshot_monitor", ["1", "2", "3"]) - - label("Max. Tokens") - self._tokens = entry("max_response_tokens", width=100) - - row += 1 - ctk.CTkButton(self, text="Speichern", command=self._save).grid( - row=row, column=0, columnspan=2, pady=16, padx=16, sticky="ew") - - def _capture_hotkey(self): - self._hotkey_display.configure(text="Taste drücken…") - - def on_key(key_str): - self._s["hotkey"] = key_str - self.after(0, lambda: self._hotkey_display.configure( - text=str_to_display(key_str))) - - KeyCapturer(on_key).start() - - def _save(self): - self._s["mc2_url"] = self._url.get().strip() - self._s["tts_voice"] = self._voice.get() - self._s["whisper_model"] = self._whisper.get() - self._s["language"] = self._lang.get() - self._s["screenshot_enabled"] = self._screenshot.get() - self._s["screenshot_monitor"] = int(self._monitor.get()) - try: - self._s["max_response_tokens"] = int(self._tokens.get()) - except ValueError: - pass - self._parent.apply_settings(self._s) - self.destroy() - - -# ── Entry Point ─────────────────────────────────────────────────────────── -if __name__ == "__main__": - app = HermesApp() - app.mainloop() diff --git a/client/hermes-voice/requirements.txt b/client/hermes-voice/requirements.txt deleted file mode 100644 index f5b143b..0000000 --- a/client/hermes-voice/requirements.txt +++ /dev/null @@ -1,29 +0,0 @@ -# Hermes Voice Client — Dependencies -# Installation: pip install -r requirements.txt - -# Speech-to-Text (lokal auf CPU) -faster-whisper>=1.0.0 - -# Audio I/O -sounddevice>=0.4.6 -numpy>=1.24.0 -scipy>=1.11.0 - -# Text-to-Speech -edge-tts>=6.1.9 - -# Screen Capture -mss>=9.0.1 -Pillow>=10.0.0 - -# HTTP Client -httpx>=0.27.0 - -# Audio Playback -pygame>=2.5.0 - -# GUI -customtkinter>=5.2.0 - -# Globaler Hotkey -pynput>=1.7.6 diff --git a/client/hermes-voice/screen_capture.py b/client/hermes-voice/screen_capture.py deleted file mode 100644 index 22f6be5..0000000 --- a/client/hermes-voice/screen_capture.py +++ /dev/null @@ -1,19 +0,0 @@ -import base64 -import io -import mss -from PIL import Image -from config import SCREENSHOT_MONITOR, SCREENSHOT_WIDTH, SCREENSHOT_HEIGHT - - -def capture_screen() -> str: - """Screenshot des primären Monitors als base64-JPEG.""" - with mss.mss() as sct: - monitor = sct.monitors[SCREENSHOT_MONITOR] - raw = sct.grab(monitor) - img = Image.frombytes("RGB", raw.size, raw.bgra, "raw", "BGRX") - - img = img.resize((SCREENSHOT_WIDTH, SCREENSHOT_HEIGHT), Image.LANCZOS) - - buf = io.BytesIO() - img.save(buf, format="JPEG", quality=80) - return base64.b64encode(buf.getvalue()).decode("utf-8") diff --git a/client/hermes-voice/setup.bat b/client/hermes-voice/setup.bat deleted file mode 100644 index fe6a861..0000000 --- a/client/hermes-voice/setup.bat +++ /dev/null @@ -1,44 +0,0 @@ -@echo off -:: Immer aus dem eigenen Verzeichnis laufen -cd /d "%~dp0" - -echo ======================================== -echo Hermes Voice Client -- Setup -echo ======================================== -echo. - -:: Python pruefen -python --version >nul 2>&1 -if errorlevel 1 ( - echo [FEHLER] Python nicht gefunden. Bitte Python 3.11+ installieren. - pause - exit /b 1 -) - -:: Venv anlegen falls nicht vorhanden -if not exist ".venv" ( - echo [1/3] Erstelle virtuelle Umgebung... - python -m venv .venv -) - -:: Dependencies installieren -echo [2/3] Installiere Dependencies... -.venv\Scripts\pip install --upgrade pip -q -.venv\Scripts\pip install -r requirements.txt - -:: Kurz-Check -echo [3/3] Pruefe Konfiguration... -.venv\Scripts\python -c "import customtkinter; import pynput; print('GUI + Hotkey OK')" - -echo. -echo ======================================== -echo Setup abgeschlossen! -echo. -echo Naechste Schritte: -echo 1. start.bat ausfuehren -echo 2. Einstellungen (Zahnrad) pruefen: -echo - MC2 URL (Standard: 192.168.178.151:9001) -echo - Hotkey (Standard: Rechte Strg) -echo Optional: build.bat fuer .exe-Kompilierung -echo ======================================== -pause diff --git a/client/hermes-voice/start.bat b/client/hermes-voice/start.bat deleted file mode 100644 index 62f6d0f..0000000 --- a/client/hermes-voice/start.bat +++ /dev/null @@ -1,4 +0,0 @@ -@echo off -:: Hermes Voice Client starten (kein Konsolenfenster im Hintergrund) -cd /d "%~dp0" -start "" .venv\Scripts\pythonw.exe main.py diff --git a/client/lucy-desktop/.gitignore b/client/lucy-desktop/.gitignore deleted file mode 100644 index f26aa03..0000000 --- a/client/lucy-desktop/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -node_modules/ -out/ -dist/ -*.log -# Avatar-VRM ist gross + Lizenz/Redistribution -> nicht committen (lokal/Box vorhalten) -src/renderer/public/avatar.vrm -src/renderer/public/vad/ diff --git a/client/lucy-desktop/Lucy-Check.bat b/client/lucy-desktop/Lucy-Check.bat deleted file mode 100644 index ccdbf37..0000000 --- a/client/lucy-desktop/Lucy-Check.bat +++ /dev/null @@ -1,8 +0,0 @@ -@echo off -chcp 65001 >nul -cd /d "%~dp0" -curl -s -m 5 http://127.0.0.1:8130/health > lucy_check.log 2>&1 -echo.>> lucy_check.log -echo --- electron/vite/pocket laeuft? --->> lucy_check.log -powershell -NoProfile -Command "Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -match 'pocket_server:app|electron-vite|lucy-desktop' } | ForEach-Object { $_.Name + ' ' + $_.ProcessId }" >> lucy_check.log 2>&1 -type lucy_check.log diff --git a/client/lucy-desktop/Lucy-Dev-Debug.bat b/client/lucy-desktop/Lucy-Dev-Debug.bat deleted file mode 100644 index 58233aa..0000000 --- a/client/lucy-desktop/Lucy-Dev-Debug.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off -chcp 65001 >nul -cd /d "F:\Coding Stuff\mission-control-2\client\lucy-desktop" -echo Beende haengende Versuche (ohne mich selbst)... -powershell -NoProfile -Command "Get-CimInstance Win32_Process | Where-Object { $_.Name -eq 'electron.exe' -or $_.CommandLine -match 'electron-vite|pocket_server:app|start-lucy' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force -EA SilentlyContinue }" -timeout /t 2 >nul -echo Starte 'npm run dev' mit Log-Capture... -start /b "" cmd /c "npm run dev > dev.log 2>&1" -timeout /t 22 >nul -echo === dev.log === -type dev.log -echo. -echo (laeuft im Hintergrund weiter, falls erfolgreich) diff --git a/client/lucy-desktop/Lucy-Neustart.bat b/client/lucy-desktop/Lucy-Neustart.bat deleted file mode 100644 index af9d02e..0000000 --- a/client/lucy-desktop/Lucy-Neustart.bat +++ /dev/null @@ -1,12 +0,0 @@ -@echo off -chcp 65001 >nul -REM Hygiene: Recon-Log mit Token entfernen -del /q "F:\Coding Stuff\mission-control-2\box_recon.log" 2>nul -echo Beende laufende Lucy-Instanz (pocket_server :8130 + Electron/Vite)... -powershell -NoProfile -ExecutionPolicy Bypass -Command "Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -match 'pocket_server:app|lucy-desktop|electron-vite' } | ForEach-Object { Write-Output ('kill ' + $_.ProcessId + ' ' + $_.Name); Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue }" -timeout /t 2 >nul -echo. -echo Starte Lucy neu (frischer Voice-Server + Client mit erweitertem Umlaut-Fix)... -start "" "F:\Coding Stuff\mission-control-2\client\lucy-desktop\start-lucy.cmd" -timeout /t 3 >nul -echo Fertig. diff --git a/client/lucy-desktop/Verknuepfung-erstellen.bat b/client/lucy-desktop/Verknuepfung-erstellen.bat deleted file mode 100644 index c5aed20..0000000 --- a/client/lucy-desktop/Verknuepfung-erstellen.bat +++ /dev/null @@ -1,7 +0,0 @@ -@echo off -chcp 65001 >nul -powershell -NoProfile -ExecutionPolicy Bypass -Command "$ws=New-Object -ComObject WScript.Shell; $p=Join-Path ([Environment]::GetFolderPath('Desktop')) 'Lucy.lnk'; $l=$ws.CreateShortcut($p); $l.TargetPath='F:\Coding Stuff\mission-control-2\client\lucy-desktop\start-lucy.cmd'; $l.WorkingDirectory='F:\Coding Stuff\mission-control-2\client\lucy-desktop'; $l.IconLocation='F:\Coding Stuff\mission-control-2\client\lucy-desktop\lucy.ico'; $l.Description='Lucy - lokaler Sprach-Companion starten'; $l.Save(); Write-Output ('OK: ' + $p)" > lucy_shortcut.log 2>&1 -type lucy_shortcut.log -echo. -echo Fertig - "Lucy" liegt jetzt auf dem Desktop. -pause diff --git a/client/lucy-desktop/electron.vite.config.ts b/client/lucy-desktop/electron.vite.config.ts deleted file mode 100644 index 0e79038..0000000 --- a/client/lucy-desktop/electron.vite.config.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { defineConfig } from "electron-vite" -import react from "@vitejs/plugin-react" -import { resolve } from "path" - -export default defineConfig({ - main: { - build: { rollupOptions: { input: { index: resolve(__dirname, "src/main/index.ts") } } }, - }, - preload: { - build: { rollupOptions: { input: { index: resolve(__dirname, "src/preload/index.ts") } } }, - }, - renderer: { - root: resolve(__dirname, "src/renderer"), - build: { rollupOptions: { input: { index: resolve(__dirname, "src/renderer/index.html") } } }, - // Silero-VAD-Assets (Worklet + ONNX + onnxruntime-WASM) liegen self-hosted in - // src/renderer/public/vad/ (scripts/copy-vad-assets.mjs, läuft via npm postinstall) — - // Pfade = baseAssetPath/onnxWASMBasePath in useVAD.ts. - plugins: [react()], - }, -}) diff --git a/client/lucy-desktop/lucy.ico b/client/lucy-desktop/lucy.ico deleted file mode 100644 index f5849fe7fd99fdbf4e072111883606be83f48b8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16608 zcmZ{M3p`Zm|Npp!R6~*^CaJYuCrOgbR93bX)2_<4VY*TwNvO=ltyGfQwiL@~+epe3 za!FUX!!PjP!hdvTfDc}$ANs;yh5X{O4VCkDQ6Kn1({HQW zRut-4qMrPq7Wi8C)Q|f@P^dW-@E^76pod3Ls4c`DKWyE7)@P_~-yO3Lp;*!8?qOWF zb>g{Er_(VZ!q7$4!T)TDJ{)5mbHifip}7aF(T8#uXw5yAwq@i}eZbOt+Yc9R*|vCn zSfT!XYhV35)Xi22C-jlKC;hqjH-F(m_t5Ys!u;i+q>b5uVuw$Uz#%2Tc zKpJ^iFYhzIu-9+J;~`dVXyv^fGu&n;w1$++D+TSnU;ZNSpODA@*!NCx?y9`Qj~XP{ zCoV8?R5Wj~YR>c4BsCJu10)abGRVr{5LK>SU1NeU#n}OO89ir1a2eI*tcz9W(Q@69 zBvE+#ZVxl8>At`-l^8Eofd~0@4!gE%pxv%;)!7O!`}<8^_KIIiLRhr(nlX}C^e|ES z%KssDhxElhmpUi*%fRj+S#!X-A=A;I*~cT^mYE+(Svk`!G=DI^&@XQ!XJ9pCB?CmdwG-yd-qJ_pmpB0WNlBz(fNV+;|24BbM9e(3m`lyXS#W~ z-P*h1;&)b~(Qo;jWAfT~VsaLnd`#dapFcyWOMHcX=FiuV$M6lIWl(`CqBHwp(4El6 z&AI)l>T`77Rdsu9^?0z?6ekt+wYrbHe0=GbliC)PliXr#w~cs&8`rGCx0I`SVE)21 zCNdALahJZ|K~LtbiKtlBHm)me>vQNoF-OzQ=(i1rF6IdB%%G~B?NF47Y;+)S)E&yn z66z5RBnHxT{5(jTj}|C`iH>9G=b*cVbmLNK|i9b5o<~b>vw{T@gMu+TNSy*l^AE{&+BFX`A#M`@MEPTHPaQR?k!CRr`d1f@{*)*-6Q zcqXl4;sGA5$joG*F#H}q$NZMqGNP_Bu{7Yj$LDK=Tk0`p$8T#{<`2HZGYG_Ut9k8@ zZ4TE|7lZd~c1iYr6Y&BjioJdtjfGLC>MQ4yE>RmTvCn0l)#6I+=sIo2cB+#n$FNkK zu?8|Ze&Wt;$A14VhU5L94x*}Yp!?B2jV9qi%Ted@o=(PGTscOaR*7bXh{#=xS@gMm-z#(tKl67>/_<(nB_(iEXs+Pd&H=Sp@%ODLDT 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 diff --git a/client/lucy-desktop/package-lock.json b/client/lucy-desktop/package-lock.json deleted file mode 100644 index be623de..0000000 --- a/client/lucy-desktop/package-lock.json +++ /dev/null @@ -1,4702 +0,0 @@ -{ - "name": "lucy-desktop", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "lucy-desktop", - "version": "0.1.0", - "hasInstallScript": true, - "dependencies": { - "@pixiv/three-vrm": "^3.4.0", - "@pixiv/three-vrm-animation": "^3.5.4", - "@react-three/drei": "^9.114.0", - "@react-three/fiber": "^8.17.10", - "@ricky0123/vad-web": "^0.0.30", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-markdown": "^9.1.0", - "remark-gfm": "^4.0.1", - "three": "^0.169.0" - }, - "devDependencies": { - "@types/react": "^18.3.12", - "@types/react-dom": "^18.3.1", - "@types/three": "^0.169.0", - "@vitejs/plugin-react": "^4.3.4", - "electron": "^43.0.0", - "electron-vite": "^3.0.0", - "typescript": "^5.6.3", - "vite": "^6.0.3" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", - "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", - "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helpers": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", - "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", - "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", - "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", - "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", - "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", - "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", - "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", - "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.7" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz", - "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", - "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", - "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", - "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", - "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", - "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@electron-internal/extract-zip": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@electron-internal/extract-zip/-/extract-zip-1.0.4.tgz", - "integrity": "sha512-Zr1Vs7E9tpCNhZHDAbFVXc2gEVCG9RqPDjrno5+bdgB6LRAuvgyMHJut4NCVyYwtAieapMzc3fiQ3CSTi75ARg==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=22.12.0" - } - }, - "node_modules/@electron/get": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-5.0.0.tgz", - "integrity": "sha512-pjoBpru1KdEtcExBnuHAP1cAc/5faoedw0hzJkL3o4/IJp7HNF1+fbrdxT3gMYRX2oJfvnA/WXeCTVQpYYxyJA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^3.0.0", - "graceful-fs": "^4.2.11", - "progress": "^2.0.3", - "semver": "^7.6.3", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=22.12.0" - }, - "optionalDependencies": { - "undici": "^7.24.4" - } - }, - "node_modules/@electron/get/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@mediapipe/tasks-vision": { - "version": "0.10.17", - "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.17.tgz", - "integrity": "sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg==", - "license": "Apache-2.0" - }, - "node_modules/@monogrid/gainmap-js": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@monogrid/gainmap-js/-/gainmap-js-3.4.0.tgz", - "integrity": "sha512-2Z0FATFHaoYJ8b+Y4y4Hgfn3FRFwuU5zRrk+9dFWp4uGAdHGqVEdP7HP+gLA3X469KXHmfupJaUbKo1b/aDKIg==", - "license": "MIT", - "dependencies": { - "promise-worker-transferable": "^1.0.4" - }, - "peerDependencies": { - "three": ">= 0.159.0" - } - }, - "node_modules/@pixiv/three-vrm": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/three-vrm/-/three-vrm-3.5.4.tgz", - "integrity": "sha512-hY0MnmKVLUebFR9QN9vCRXo0rZmLpxjLVZAupQv5qDDGCKZuNxlOts9PqTkWlzhkMLLdhB48AF+P4PCy/DFOzA==", - "license": "MIT", - "dependencies": { - "@pixiv/three-vrm-core": "3.5.4", - "@pixiv/three-vrm-materials-hdr-emissive-multiplier": "3.5.4", - "@pixiv/three-vrm-materials-mtoon": "3.5.4", - "@pixiv/three-vrm-materials-v0compat": "3.5.4", - "@pixiv/three-vrm-node-constraint": "3.5.4", - "@pixiv/three-vrm-springbone": "3.5.4" - }, - "peerDependencies": { - "three": ">=0.137" - } - }, - "node_modules/@pixiv/three-vrm-animation": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/three-vrm-animation/-/three-vrm-animation-3.5.4.tgz", - "integrity": "sha512-yVJL7LoVwZ0fsW2SJhfa0bqIMcfTzBKyc1q/LeKqAtEv63BEQ9VUudx5ikd4zIkgvXwjxw7vGl2zvedrexFisg==", - "license": "MIT", - "dependencies": { - "@pixiv/three-vrm-core": "3.5.4", - "@pixiv/types-vrmc-vrm-1.0": "3.5.4", - "@pixiv/types-vrmc-vrm-animation-1.0": "3.5.4" - }, - "peerDependencies": { - "three": ">=0.137" - } - }, - "node_modules/@pixiv/three-vrm-core": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/three-vrm-core/-/three-vrm-core-3.5.4.tgz", - "integrity": "sha512-CgaxZ4qX6JmE2oKsOVGGlheT011qP4bBZGUaMJJ5iQINI999+cveIdISe459B+AMYD1dU5h1+xCtDthLQNH1Bg==", - "license": "MIT", - "dependencies": { - "@pixiv/types-vrm-0.0": "3.5.4", - "@pixiv/types-vrmc-vrm-1.0": "3.5.4" - }, - "peerDependencies": { - "three": ">=0.137" - } - }, - "node_modules/@pixiv/three-vrm-materials-hdr-emissive-multiplier": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/three-vrm-materials-hdr-emissive-multiplier/-/three-vrm-materials-hdr-emissive-multiplier-3.5.4.tgz", - "integrity": "sha512-3BPZ42qW38cHhP+imqEnqTFsltvYkHA/t4VzWFdQ9sngWt0NiFAOotEsv8gZn1ZgKE9VRQezXne6s5aRWQlQqA==", - "license": "MIT", - "dependencies": { - "@pixiv/types-vrmc-materials-hdr-emissive-multiplier-1.0": "3.5.4" - }, - "peerDependencies": { - "three": ">=0.137" - } - }, - "node_modules/@pixiv/three-vrm-materials-mtoon": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/three-vrm-materials-mtoon/-/three-vrm-materials-mtoon-3.5.4.tgz", - "integrity": "sha512-vLHt7IYZxlijbCMa5TRRf6gaQjA65F/d7oZBNfZW3XC8sBg57ZV0M/xBAJm2d6UwVmTbBd9NG9li/Y9yuupDQw==", - "license": "MIT", - "dependencies": { - "@pixiv/types-vrm-0.0": "3.5.4", - "@pixiv/types-vrmc-materials-mtoon-1.0": "3.5.4" - }, - "peerDependencies": { - "three": ">=0.137" - } - }, - "node_modules/@pixiv/three-vrm-materials-v0compat": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/three-vrm-materials-v0compat/-/three-vrm-materials-v0compat-3.5.4.tgz", - "integrity": "sha512-qRRtg8vYFBRJpsa3evruWqmXr0Gwd8uJXwxxUKuKtrIN0Hw0hJsRLHkg9E238Q8xRTnoycdkSgX4VvVknvtXBA==", - "license": "MIT", - "dependencies": { - "@pixiv/types-vrm-0.0": "3.5.4", - "@pixiv/types-vrmc-materials-mtoon-1.0": "3.5.4" - }, - "peerDependencies": { - "three": ">=0.137" - } - }, - "node_modules/@pixiv/three-vrm-node-constraint": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/three-vrm-node-constraint/-/three-vrm-node-constraint-3.5.4.tgz", - "integrity": "sha512-nyAghDrYNp0Z2siEaY2+th+FzZdDs9EJy8K576Mpw9cy3jwtCJuTHBQmGzKkrgoLaBfrso+3Tdfgr62AJV0m1w==", - "license": "MIT", - "dependencies": { - "@pixiv/types-vrmc-node-constraint-1.0": "3.5.4" - }, - "peerDependencies": { - "three": ">=0.137" - } - }, - "node_modules/@pixiv/three-vrm-springbone": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/three-vrm-springbone/-/three-vrm-springbone-3.5.4.tgz", - "integrity": "sha512-8KWA7vHU+OnW6XcZPnDuUrjjPFRzmv2yxcTMNCYQvBS547/Iqo0RLbQvpO/ppceLTNJFY2TGXAWJU67aeazWjw==", - "license": "MIT", - "dependencies": { - "@pixiv/types-vrm-0.0": "3.5.4", - "@pixiv/types-vrmc-springbone-1.0": "3.5.4", - "@pixiv/types-vrmc-springbone-extended-collider-1.0": "3.5.4" - }, - "peerDependencies": { - "three": ">=0.137" - } - }, - "node_modules/@pixiv/types-vrm-0.0": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/types-vrm-0.0/-/types-vrm-0.0-3.5.4.tgz", - "integrity": "sha512-g9VMPikJxKJ/XgnhXxnqj6ejVhQ9WwOEUp7KyyZHsqRnHcQfSqyZFTs9wkAMCbwCqHXX/lg9+9Ogj8KhxCkbXw==", - "license": "MIT" - }, - "node_modules/@pixiv/types-vrmc-materials-hdr-emissive-multiplier-1.0": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/types-vrmc-materials-hdr-emissive-multiplier-1.0/-/types-vrmc-materials-hdr-emissive-multiplier-1.0-3.5.4.tgz", - "integrity": "sha512-h9GEQ3q1VTylL/P40kJ8uoQhfUYY54NhTG6Xsnl4X0jf7oHh8MKXYnMMn903hXml6082Yjx1C6x3DKckdnophg==", - "license": "MIT" - }, - "node_modules/@pixiv/types-vrmc-materials-mtoon-1.0": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/types-vrmc-materials-mtoon-1.0/-/types-vrmc-materials-mtoon-1.0-3.5.4.tgz", - "integrity": "sha512-AU5sOcsbmcnzRPfgfk7fzKhk5lNm2MqrbvtAsSlhylVMdlzrmXqIfRuexABcB9k+ysTp49qIFioot9KRlQcDUw==", - "license": "MIT" - }, - "node_modules/@pixiv/types-vrmc-node-constraint-1.0": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/types-vrmc-node-constraint-1.0/-/types-vrmc-node-constraint-1.0-3.5.4.tgz", - "integrity": "sha512-RRbK5NNvZv4ewRELezueCiDB11FGkt4pdZR/UJ027DJPaNzd6rls2OEJ8weQ3OmgHZpbx/BtdpX2JWX5WZZd/Q==", - "license": "MIT" - }, - "node_modules/@pixiv/types-vrmc-springbone-1.0": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/types-vrmc-springbone-1.0/-/types-vrmc-springbone-1.0-3.5.4.tgz", - "integrity": "sha512-NO7HTRBuWEe89Wo9BRI5hX1kWVkZzA4YWg9XALSTLdIT8HMiArL4NRse/CF91jNuLcTGfPEWlBJyq9SciAQxAg==", - "license": "MIT" - }, - "node_modules/@pixiv/types-vrmc-springbone-extended-collider-1.0": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/types-vrmc-springbone-extended-collider-1.0/-/types-vrmc-springbone-extended-collider-1.0-3.5.4.tgz", - "integrity": "sha512-uzJmcRh/iHYnZPtnq6N1+jb+T/ptYNCyFEoArkWGNXHSfPjTkMcheTQkL5iMNvTE6hqhyMRVMha9OmbvyLmmUQ==", - "license": "MIT" - }, - "node_modules/@pixiv/types-vrmc-vrm-1.0": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/types-vrmc-vrm-1.0/-/types-vrmc-vrm-1.0-3.5.4.tgz", - "integrity": "sha512-pkjT4QXT/Hp6rcq8J8EFEHIldbtPGYWOTaWdoRGMA8/KzJI5PdekZ6AUYbnSP6ElfJ3BSZ01DxxpQZa/UNsFqA==", - "license": "MIT" - }, - "node_modules/@pixiv/types-vrmc-vrm-animation-1.0": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/types-vrmc-vrm-animation-1.0/-/types-vrmc-vrm-animation-1.0-3.5.4.tgz", - "integrity": "sha512-qIl/RO+WnWcBlu/PdTpPtm+YRum8RNtNNigndd/V9dJ9mWeFVI6TThc5i+qbFQjTF/I5ka0HojfeujesIYc1IA==", - "license": "MIT", - "dependencies": { - "@pixiv/types-vrmc-vrm-1.0": "3.5.4" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", - "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", - "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", - "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", - "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", - "license": "BSD-3-Clause" - }, - "node_modules/@react-spring/animated": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", - "integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==", - "license": "MIT", - "dependencies": { - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/core": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz", - "integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==", - "license": "MIT", - "dependencies": { - "@react-spring/animated": "~9.7.5", - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-spring/donate" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/rafz": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz", - "integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==", - "license": "MIT" - }, - "node_modules/@react-spring/shared": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz", - "integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==", - "license": "MIT", - "dependencies": { - "@react-spring/rafz": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/three": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.7.5.tgz", - "integrity": "sha512-RxIsCoQfUqOS3POmhVHa1wdWS0wyHAUway73uRLp3GAL5U2iYVNdnzQsep6M2NZ994BlW8TcKuMtQHUqOsy6WA==", - "license": "MIT", - "dependencies": { - "@react-spring/animated": "~9.7.5", - "@react-spring/core": "~9.7.5", - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "@react-three/fiber": ">=6.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "three": ">=0.126" - } - }, - "node_modules/@react-spring/types": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz", - "integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==", - "license": "MIT" - }, - "node_modules/@react-three/drei": { - "version": "9.122.0", - "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.122.0.tgz", - "integrity": "sha512-SEO/F/rBCTjlLez7WAlpys+iGe9hty4rNgjZvgkQeXFSiwqD4Hbk/wNHMAbdd8vprO2Aj81mihv4dF5bC7D0CA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.26.0", - "@mediapipe/tasks-vision": "0.10.17", - "@monogrid/gainmap-js": "^3.0.6", - "@react-spring/three": "~9.7.5", - "@use-gesture/react": "^10.3.1", - "camera-controls": "^2.9.0", - "cross-env": "^7.0.3", - "detect-gpu": "^5.0.56", - "glsl-noise": "^0.0.0", - "hls.js": "^1.5.17", - "maath": "^0.10.8", - "meshline": "^3.3.1", - "react-composer": "^5.0.3", - "stats-gl": "^2.2.8", - "stats.js": "^0.17.0", - "suspend-react": "^0.1.3", - "three-mesh-bvh": "^0.7.8", - "three-stdlib": "^2.35.6", - "troika-three-text": "^0.52.0", - "tunnel-rat": "^0.1.2", - "utility-types": "^3.11.0", - "zustand": "^5.0.1" - }, - "peerDependencies": { - "@react-three/fiber": "^8", - "react": "^18", - "react-dom": "^18", - "three": ">=0.137" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/@react-three/fiber": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.18.0.tgz", - "integrity": "sha512-FYZZqD0UUHUswKz3LQl2Z7H24AhD14XGTsIRw3SJaXUxyfVMi+1yiZGmqTcPt/CkPpdU7rrxqcyQ1zJE5DjvIQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@types/react-reconciler": "^0.26.7", - "@types/webxr": "*", - "base64-js": "^1.5.1", - "buffer": "^6.0.3", - "its-fine": "^1.0.6", - "react-reconciler": "^0.27.0", - "react-use-measure": "^2.1.7", - "scheduler": "^0.21.0", - "suspend-react": "^0.1.3", - "zustand": "^3.7.1" - }, - "peerDependencies": { - "expo": ">=43.0", - "expo-asset": ">=8.4", - "expo-file-system": ">=11.0", - "expo-gl": ">=11.0", - "react": ">=18 <19", - "react-dom": ">=18 <19", - "react-native": ">=0.64", - "three": ">=0.133" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - }, - "expo-asset": { - "optional": true - }, - "expo-file-system": { - "optional": true - }, - "expo-gl": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/@react-three/fiber/node_modules/zustand": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", - "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", - "license": "MIT", - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - } - } - }, - "node_modules/@ricky0123/vad-web": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@ricky0123/vad-web/-/vad-web-0.0.30.tgz", - "integrity": "sha512-cJyYrh4YeeUBJcbR9Bic/bFDyB9qBkAepvpuWM3vLxnAi7bC3VHzf51UeNdT+OtY4D7MLAgV8iJMc4z41ZnaWg==", - "license": "ISC", - "dependencies": { - "onnxruntime-web": "^1.17.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", - "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", - "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", - "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", - "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", - "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", - "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", - "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", - "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", - "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", - "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", - "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", - "cpu": [ - "loong64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", - "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", - "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", - "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", - "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", - "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", - "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", - "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", - "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", - "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", - "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", - "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", - "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", - "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", - "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@tweenjs/tween.js": { - "version": "23.1.3", - "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", - "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", - "license": "MIT" - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/debug": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", - "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/draco3d": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", - "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==", - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "license": "MIT" - }, - "node_modules/@types/estree-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.13.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz", - "integrity": "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==", - "license": "MIT", - "dependencies": { - "undici-types": "~7.18.0" - } - }, - "node_modules/@types/offscreencanvas": { - "version": "2019.7.3", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", - "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", - "license": "MIT" - }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.31", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz", - "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^18.0.0" - } - }, - "node_modules/@types/react-reconciler": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz", - "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==", - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/stats.js": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz", - "integrity": "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==", - "license": "MIT" - }, - "node_modules/@types/three": { - "version": "0.169.0", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.169.0.tgz", - "integrity": "sha512-oan7qCgJBt03wIaK+4xPWclYRPG9wzcg7Z2f5T8xYTNEF95kh0t0lklxLLYBDo7gQiGLYzE6iF4ta7nXF2bcsw==", - "license": "MIT", - "dependencies": { - "@tweenjs/tween.js": "~23.1.3", - "@types/stats.js": "*", - "@types/webxr": "*", - "@webgpu/types": "*", - "fflate": "~0.8.2", - "meshoptimizer": "~0.18.1" - } - }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "license": "MIT" - }, - "node_modules/@types/webxr": { - "version": "0.5.24", - "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz", - "integrity": "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==", - "license": "MIT" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.2.tgz", - "integrity": "sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==", - "license": "ISC" - }, - "node_modules/@use-gesture/core": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", - "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==", - "license": "MIT" - }, - "node_modules/@use-gesture/react": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", - "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", - "license": "MIT", - "dependencies": { - "@use-gesture/core": "10.3.1" - }, - "peerDependencies": { - "react": ">= 16.8.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/@webgpu/types": { - "version": "0.1.71", - "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.71.tgz", - "integrity": "sha512-mMy8/ODcKhab808co15eW+yN+HgXoQxRQHTiBV9Mrvl1r0ufnid7YOcI+gi4eUWSWl9ezD6TW2KXccrL8HCh2A==", - "license": "BSD-3-Clause" - }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.40", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.40.tgz", - "integrity": "sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/bidi-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", - "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", - "license": "MIT", - "dependencies": { - "require-from-string": "^2.0.2" - } - }, - "node_modules/browserslist": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", - "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.10.38", - "caniuse-lite": "^1.0.30001799", - "electron-to-chromium": "^1.5.376", - "node-releases": "^2.0.48", - "update-browserslist-db": "^1.2.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/camera-controls": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.10.1.tgz", - "integrity": "sha512-KnaKdcvkBJ1Irbrzl8XD6WtZltkRjp869Jx8c0ujs9K+9WD+1D7ryBsCiVqJYUqt6i/HR5FxT7RLASieUD+Q5w==", - "license": "MIT", - "peerDependencies": { - "three": ">=0.126.1" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001799", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", - "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decode-named-character-reference": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", - "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-gpu": { - "version": "5.0.70", - "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.70.tgz", - "integrity": "sha512-bqerEP1Ese6nt3rFkwPnGbsUF9a4q+gMmpTVVOEzoCyeCc+y7/RvJnQZJx1JwhgQI5Ntg0Kgat8Uu7XpBqnz1w==", - "license": "MIT", - "dependencies": { - "webgl-constants": "^1.1.1" - } - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/draco3d": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", - "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==", - "license": "Apache-2.0" - }, - "node_modules/electron": { - "version": "43.0.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-43.0.0.tgz", - "integrity": "sha512-PV60GsWU6qufhuOhw3n+Yix3WPDcqDtBqE8orbEQGQGHEkgp9o/JCPgb7L4vIL0r1HnfPdqSRtboOTqbDkcFDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron-internal/extract-zip": "^1.0.1", - "@electron/get": "^5.0.0", - "@types/node": "^24.9.0" - }, - "bin": { - "electron": "cli.js", - "install-electron": "install.js" - }, - "engines": { - "node": ">= 22.12.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.380", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.380.tgz", - "integrity": "sha512-W6d5AbuEoRayO447cqrg6lKJIlscgRnnxOZl/08kfV71BQDoEBC7Wwis68z87LjyK6f4kWyTaubuDbhHKrZkbA==", - "dev": true, - "license": "ISC" - }, - "node_modules/electron-vite": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/electron-vite/-/electron-vite-3.1.0.tgz", - "integrity": "sha512-M7aAzaRvSl5VO+6KN4neJCYLHLpF/iWo5ztchI/+wMxIieDZQqpbCYfaEHHHPH6eupEzfvZdLYdPdmvGqoVe0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.26.10", - "@babel/plugin-transform-arrow-functions": "^7.25.9", - "cac": "^6.7.14", - "esbuild": "^0.25.1", - "magic-string": "^0.30.17", - "picocolors": "^1.1.1" - }, - "bin": { - "electron-vite": "bin/electron-vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@swc/core": "^1.0.0", - "vite": "^4.0.0 || ^5.0.0 || ^6.0.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - } - } - }, - "node_modules/env-paths": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", - "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/estree-util-is-identifier-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fflate": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz", - "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", - "license": "MIT" - }, - "node_modules/flatbuffers": { - "version": "25.9.23", - "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.9.23.tgz", - "integrity": "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==", - "license": "Apache-2.0" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/glsl-noise": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", - "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==", - "license": "MIT" - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/guid-typescript": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz", - "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==", - "license": "ISC" - }, - "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", - "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-js": "^1.0.0", - "unist-util-position": "^5.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hls.js": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.6.16.tgz", - "integrity": "sha512-VSIRpLfRwlAAdGL4wiTucx2ScRipo0ed1FBatWkyt832jC4CReKstga6yIhYVwGu9LOBjuX9wzmRMeQdBJtzEA==", - "license": "Apache-2.0" - }, - "node_modules/html-url-attributes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", - "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "license": "MIT" - }, - "node_modules/inline-style-parser": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", - "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", - "license": "MIT" - }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "license": "MIT", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/its-fine": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.2.5.tgz", - "integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==", - "license": "MIT", - "dependencies": { - "@types/react-reconciler": "^0.28.0" - }, - "peerDependencies": { - "react": ">=18.0" - } - }, - "node_modules/its-fine/node_modules/@types/react-reconciler": { - "version": "0.28.9", - "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.9.tgz", - "integrity": "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "license": "MIT", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "license": "Apache-2.0" - }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/maath": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.8.tgz", - "integrity": "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==", - "license": "MIT", - "peerDependencies": { - "@types/three": ">=0.134.0", - "three": ">=0.134.0" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/markdown-table": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", - "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/mdast-util-find-and-replace": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", - "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", - "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", - "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "mdast-util-gfm-footnote": "^2.0.0", - "mdast-util-gfm-strikethrough": "^2.0.0", - "mdast-util-gfm-table": "^2.0.0", - "mdast-util-gfm-task-list-item": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", - "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", - "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-jsx": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", - "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", - "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/meshline": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.1.tgz", - "integrity": "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==", - "license": "MIT", - "peerDependencies": { - "three": ">=0.137" - } - }, - "node_modules/meshoptimizer": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", - "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==", - "license": "MIT" - }, - "node_modules/micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "license": "MIT", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", - "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", - "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.15", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", - "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-releases": { - "version": "2.0.50", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz", - "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/onnxruntime-common": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.27.0.tgz", - "integrity": "sha512-3KxL5wIVqa8Ex08jxSzncm9CMgw8CjOFyOQ7SxvG9o0cVLlhTNKXyIQuTbtX4tGPJEf73OER2xrjt4HJSBL4ow==", - "license": "MIT" - }, - "node_modules/onnxruntime-web": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.27.0.tgz", - "integrity": "sha512-ogDLsqIozHZwifPuN37OproAo0byX6t43/bP8GzeZWBWD6MOGExswFAx3up4NS/vvWBOg2u2PXomDt3rMmdQSg==", - "license": "MIT", - "dependencies": { - "flatbuffers": "^25.1.24", - "guid-typescript": "^1.0.9", - "long": "^5.2.3", - "onnxruntime-common": "1.27.0", - "platform": "^1.3.6", - "protobufjs": "^7.2.4" - } - }, - "node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "license": "MIT" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/platform": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", - "license": "MIT" - }, - "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.12", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/potpack": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", - "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==", - "license": "ISC" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-worker-transferable": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz", - "integrity": "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==", - "license": "Apache-2.0", - "dependencies": { - "is-promise": "^2.1.0", - "lie": "^3.0.2" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/property-information": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", - "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/protobufjs": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.4.tgz", - "integrity": "sha512-RJJPTTpvFfHcWLkIa2JFWK4XvtSzS0yEWDmunqHXli1h3JlkbcQZXDZdcWxv+JK3Xsl5/UFDPZ0iGm7DAengYw==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.5", - "@protobufjs/eventemitter": "^1.1.1", - "@protobufjs/fetch": "^1.1.1", - "@protobufjs/float": "^1.0.2", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.1", - "@types/node": ">=13.7.0", - "long": "^5.3.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-composer": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/react-composer/-/react-composer-5.0.3.tgz", - "integrity": "sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==", - "license": "MIT", - "dependencies": { - "prop-types": "^15.6.0" - }, - "peerDependencies": { - "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-dom/node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/react-markdown": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.1.0.tgz", - "integrity": "sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "html-url-attributes": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "unified": "^11.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=18", - "react": ">=18" - } - }, - "node_modules/react-reconciler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz", - "integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.21.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "react": "^18.0.0" - } - }, - "node_modules/react-refresh": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-use-measure": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.7.tgz", - "integrity": "sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==", - "license": "MIT", - "peerDependencies": { - "react": ">=16.13", - "react-dom": ">=16.13" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/remark-gfm": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", - "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", - "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", - "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.9" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.62.2", - "@rollup/rollup-android-arm64": "4.62.2", - "@rollup/rollup-darwin-arm64": "4.62.2", - "@rollup/rollup-darwin-x64": "4.62.2", - "@rollup/rollup-freebsd-arm64": "4.62.2", - "@rollup/rollup-freebsd-x64": "4.62.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", - "@rollup/rollup-linux-arm-musleabihf": "4.62.2", - "@rollup/rollup-linux-arm64-gnu": "4.62.2", - "@rollup/rollup-linux-arm64-musl": "4.62.2", - "@rollup/rollup-linux-loong64-gnu": "4.62.2", - "@rollup/rollup-linux-loong64-musl": "4.62.2", - "@rollup/rollup-linux-ppc64-gnu": "4.62.2", - "@rollup/rollup-linux-ppc64-musl": "4.62.2", - "@rollup/rollup-linux-riscv64-gnu": "4.62.2", - "@rollup/rollup-linux-riscv64-musl": "4.62.2", - "@rollup/rollup-linux-s390x-gnu": "4.62.2", - "@rollup/rollup-linux-x64-gnu": "4.62.2", - "@rollup/rollup-linux-x64-musl": "4.62.2", - "@rollup/rollup-openbsd-x64": "4.62.2", - "@rollup/rollup-openharmony-arm64": "4.62.2", - "@rollup/rollup-win32-arm64-msvc": "4.62.2", - "@rollup/rollup-win32-ia32-msvc": "4.62.2", - "@rollup/rollup-win32-x64-gnu": "4.62.2", - "@rollup/rollup-win32-x64-msvc": "4.62.2", - "fsevents": "~2.3.2" - } - }, - "node_modules/scheduler": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", - "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/stats-gl": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.4.2.tgz", - "integrity": "sha512-g5O9B0hm9CvnM36+v7SFl39T7hmAlv541tU81ME8YeSb3i1CIP5/QdDeSB3A0la0bKNHpxpwxOVRo2wFTYEosQ==", - "license": "MIT", - "dependencies": { - "@types/three": "*", - "three": "^0.170.0" - }, - "peerDependencies": { - "@types/three": "*", - "three": "*" - } - }, - "node_modules/stats-gl/node_modules/three": { - "version": "0.170.0", - "resolved": "https://registry.npmjs.org/three/-/three-0.170.0.tgz", - "integrity": "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ==", - "license": "MIT" - }, - "node_modules/stats.js": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", - "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==", - "license": "MIT" - }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/style-to-js": { - "version": "1.1.21", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", - "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", - "license": "MIT", - "dependencies": { - "style-to-object": "1.0.14" - } - }, - "node_modules/style-to-object": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", - "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.2.7" - } - }, - "node_modules/sumchecker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.1.0" - }, - "engines": { - "node": ">= 8.0" - } - }, - "node_modules/suspend-react": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", - "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", - "license": "MIT", - "peerDependencies": { - "react": ">=17.0" - } - }, - "node_modules/three": { - "version": "0.169.0", - "resolved": "https://registry.npmjs.org/three/-/three-0.169.0.tgz", - "integrity": "sha512-Ed906MA3dR4TS5riErd4QBsRGPcx+HBDX2O5yYE5GqJeFQTPU+M56Va/f/Oph9X7uZo3W3o4l2ZhBZ6f6qUv0w==", - "license": "MIT" - }, - "node_modules/three-mesh-bvh": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.7.8.tgz", - "integrity": "sha512-BGEZTOIC14U0XIRw3tO4jY7IjP7n7v24nv9JXS1CyeVRWOCkcOMhRnmENUjuV39gktAw4Ofhr0OvIAiTspQrrw==", - "deprecated": "Deprecated due to three.js version incompatibility. Please use v0.8.0, instead.", - "license": "MIT", - "peerDependencies": { - "three": ">= 0.151.0" - } - }, - "node_modules/three-stdlib": { - "version": "2.36.1", - "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.36.1.tgz", - "integrity": "sha512-XyGQrFmNQ5O/IoKm556ftwKsBg11TIb301MB5dWNicziQBEs2g3gtOYIf7pFiLa0zI2gUwhtCjv9fmjnxKZ1Cg==", - "license": "MIT", - "dependencies": { - "@types/draco3d": "^1.4.0", - "@types/offscreencanvas": "^2019.6.4", - "@types/webxr": "^0.5.2", - "draco3d": "^1.4.1", - "fflate": "^0.6.9", - "potpack": "^1.0.1" - }, - "peerDependencies": { - "three": ">=0.128.0" - } - }, - "node_modules/three-stdlib/node_modules/fflate": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", - "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==", - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/troika-three-text": { - "version": "0.52.4", - "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.52.4.tgz", - "integrity": "sha512-V50EwcYGruV5rUZ9F4aNsrytGdKcXKALjEtQXIOBfhVoZU9VAqZNIoGQ3TMiooVqFAbR1w15T+f+8gkzoFzawg==", - "license": "MIT", - "dependencies": { - "bidi-js": "^1.0.2", - "troika-three-utils": "^0.52.4", - "troika-worker-utils": "^0.52.0", - "webgl-sdf-generator": "1.1.1" - }, - "peerDependencies": { - "three": ">=0.125.0" - } - }, - "node_modules/troika-three-utils": { - "version": "0.52.4", - "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.52.4.tgz", - "integrity": "sha512-NORAStSVa/BDiG52Mfudk4j1FG4jC4ILutB3foPnfGbOeIs9+G5vZLa0pnmnaftZUGm4UwSoqEpWdqvC7zms3A==", - "license": "MIT", - "peerDependencies": { - "three": ">=0.125.0" - } - }, - "node_modules/troika-worker-utils": { - "version": "0.52.0", - "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.52.0.tgz", - "integrity": "sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw==", - "license": "MIT" - }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/tunnel-rat": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/tunnel-rat/-/tunnel-rat-0.1.2.tgz", - "integrity": "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==", - "license": "MIT", - "dependencies": { - "zustand": "^4.3.2" - } - }, - "node_modules/tunnel-rat/node_modules/zustand": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", - "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", - "license": "MIT", - "dependencies": { - "use-sync-external-store": "^1.2.2" - }, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "@types/react": ">=16.8", - "immer": ">=9.0.6", - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - } - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", - "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/undici-types": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", - "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", - "license": "MIT" - }, - "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", - "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", - "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/use-sync-external-store": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/utility-types": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", - "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vite": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", - "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/webgl-constants": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", - "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" - }, - "node_modules/webgl-sdf-generator": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz", - "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==", - "license": "MIT" - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/zustand": { - "version": "5.0.14", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.14.tgz", - "integrity": "sha512-/8tAspM5LMPr28b3fwLYrtdj77ECpfZviaP75CMTnwO8ISyaE4GDIG/9rDDYq/cH9D2Xw2A2RXglLInmVBQB/g==", - "license": "MIT", - "engines": { - "node": ">=12.20.0" - }, - "peerDependencies": { - "@types/react": ">=18.0.0", - "immer": ">=9.0.6", - "react": ">=18.0.0", - "use-sync-external-store": ">=1.2.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - }, - "use-sync-external-store": { - "optional": true - } - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - } -} diff --git a/client/lucy-desktop/package.json b/client/lucy-desktop/package.json deleted file mode 100644 index 5e9bdc8..0000000 --- a/client/lucy-desktop/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "lucy-desktop", - "version": "0.1.0", - "description": "Lucy — lokaler Sprach-Companion (Hermes-Hirn auf der Box, lokale Stimme auf der 9070 XT)", - "main": "out/main/index.js", - "type": "module", - "scripts": { - "dev": "electron-vite dev", - "build": "electron-vite build", - "preview": "electron-vite preview", - "postinstall": "node scripts/copy-vad-assets.mjs" - }, - "dependencies": { - "@pixiv/three-vrm": "^3.4.0", - "@pixiv/three-vrm-animation": "^3.5.4", - "@react-three/drei": "^9.114.0", - "@react-three/fiber": "^8.17.10", - "@ricky0123/vad-web": "^0.0.30", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-markdown": "^9.1.0", - "remark-gfm": "^4.0.1", - "three": "^0.169.0" - }, - "devDependencies": { - "@types/react": "^18.3.12", - "@types/react-dom": "^18.3.1", - "@types/three": "^0.169.0", - "@vitejs/plugin-react": "^4.3.4", - "electron": "^43.0.0", - "electron-vite": "^3.0.0", - "typescript": "^5.6.3", - "vite": "^6.0.3" - }, - "allowScripts": { - "electron": true, - "esbuild": true - } -} diff --git a/client/lucy-desktop/scripts/copy-vad-assets.mjs b/client/lucy-desktop/scripts/copy-vad-assets.mjs deleted file mode 100644 index 3b4df3d..0000000 --- a/client/lucy-desktop/scripts/copy-vad-assets.mjs +++ /dev/null @@ -1,23 +0,0 @@ -// Kopiert die Silero-VAD-Assets (Worklet + ONNX-Modell + onnxruntime-WASM) nach public/vad/, -// damit die App sie self-hosted lädt (offlinefähig, kein CDN). Läuft via npm postinstall. -// public/ wird von Vite in Dev UND Build verbatim ausgeliefert -> ein Pfad für beide Welten. -import { copyFileSync, mkdirSync, readdirSync } from "node:fs" -import { dirname, join } from "node:path" -import { fileURLToPath } from "node:url" - -const root = join(dirname(fileURLToPath(import.meta.url)), "..") -const dest = join(root, "src", "renderer", "public", "vad") -mkdirSync(dest, { recursive: true }) - -const jobs = [ - [join(root, "node_modules", "@ricky0123", "vad-web", "dist"), (f) => f === "vad.worklet.bundle.min.js" || f.endsWith(".onnx")], - [join(root, "node_modules", "onnxruntime-web", "dist"), (f) => f.endsWith(".wasm") || f.endsWith(".mjs")], -] - -let n = 0 -for (const [src, match] of jobs) { - for (const f of readdirSync(src)) { - if (match(f)) { copyFileSync(join(src, f), join(dest, f)); n++ } - } -} -console.log(`[vad-assets] ${n} Dateien nach ${dest} kopiert.`) diff --git a/client/lucy-desktop/src/main/index.ts b/client/lucy-desktop/src/main/index.ts deleted file mode 100644 index e892e47..0000000 --- a/client/lucy-desktop/src/main/index.ts +++ /dev/null @@ -1,249 +0,0 @@ -import { app, BrowserWindow, ipcMain, Tray, Menu, globalShortcut, nativeImage, desktopCapturer, shell, screen, session } from "electron" -import { spawn, ChildProcess } from "child_process" -import { join } from "path" - -// Lucy — Main-Prozess. Spawnt die lokale Stimme (pocket-tts, :8130) + verwaltet Fenster/Tray/Hotkey. -// Fenster ist frameless+transparent: eigene Titelleiste im Renderer. Zwei Modi: 'full' (Arbeitsfenster) -// und 'overlay' (kleine schwebende Lucy, always-on-top). pocket-tts ist CPU-kühl -> kein /wake-/sleep. - -const PORT = process.env.LUCY_TTS_PORT || "8130" -const TTS = `http://127.0.0.1:${PORT}` -const TTS_DIR = process.env.LUCY_TTS_DIR || join(app.getAppPath(), "..", "lucy-tts") -const PY = process.env.LUCY_TTS_PY || join(TTS_DIR, "ptts-venv", "Scripts", "python.exe") -const HOTKEY = process.env.LUCY_HOTKEY || "CommandOrControl+Shift+Space" - -const FULL_SIZE = { width: 1100, height: 720 } -const OVERLAY_SIZE = { width: 360, height: 480 } - -let win: BrowserWindow | null = null -let tray: Tray | null = null -let ttsProc: ChildProcess | null = null -let mode: "full" | "overlay" = "full" -let pinned = false -let cursorTimer: ReturnType | null = null - -// MateEngine-Idee: Lucy folgt dem Mauszeiger. Der Zeiger ist auch AUSSERHALB des Fensters (Geistmodus), -// daher global pollen (screen.getCursorScreenPoint) und die Richtung relativ zu Lucys Kopf an den Renderer geben. -function startCursorTracking() { - if (cursorTimer) return - cursorTimer = setInterval(() => { - if (!win || win.isDestroyed() || !win.isVisible()) return - const b = win.getBounds() - const p = screen.getCursorScreenPoint() - const cx = b.x + b.width / 2 - const cy = b.y + b.height * 0.38 // ungefaehre Kopfhoehe im Fenster - win.webContents.send("lucy:cursor", { x: (p.x - cx) / Math.max(1, b.width), y: (p.y - cy) / Math.max(1, b.height) }) - // Auto-Ducken: im Overlay nach Nicht-Naehe an den Rand; bei Annaeherung an den Rest hervorholen - if (mode === "overlay" && !pinned && !boundsAnim) { - const now = Date.now() - const inWin = p.x >= b.x && p.y >= b.y && p.x <= b.x + b.width && p.y <= b.y + b.height - if (inWin) lastNear = now - if (!tucked && now - lastNear > AUTO_TUCK_MS) tuckToEdge() - else if (tucked) { - const wa = screen.getDisplayNearestPoint({ x: b.x, y: b.y }).workArea - if (p.x >= wa.x + wa.width - SLIVER - 12 && p.y >= b.y - 12 && p.y <= b.y + b.height + 12) { lastNear = now; untuck() } - } - } - }, 40) // ~25 Hz reicht fuers Blickfolgen, kostet kaum Last -} -function stopCursorTracking() { if (cursorTimer) { clearInterval(cursorTimer); cursorTimer = null } } - -// --- An den Rand ducken (MateEngine-Idee) --- -type Rect = { x: number; y: number; width: number; height: number } -let tucked = false -let prevBounds: Rect | null = null -let lastNear = Date.now() -let boundsAnim: ReturnType | null = null -const SLIVER = 58 // sichtbarer Rest am Rand, wenn geduckt -const AUTO_TUCK_MS = 15000 // nach so langer Nicht-Naehe im Overlay automatisch ducken - -function animateBounds(target: Rect, after?: () => void) { - if (!win) return - if (boundsAnim) { clearInterval(boundsAnim); boundsAnim = null } - const start = win.getBounds(); const t0 = Date.now(); const dur = 260 - boundsAnim = setInterval(() => { - if (!win || win.isDestroyed()) { if (boundsAnim) clearInterval(boundsAnim); boundsAnim = null; return } - const k = Math.min(1, (Date.now() - t0) / dur) - const e = k < 0.5 ? 2 * k * k : 1 - Math.pow(-2 * k + 2, 2) / 2 // easeInOutQuad - win.setBounds({ - x: Math.round(start.x + (target.x - start.x) * e), - y: Math.round(start.y + (target.y - start.y) * e), - width: target.width, height: target.height, - }) - if (k >= 1) { if (boundsAnim) clearInterval(boundsAnim); boundsAnim = null; after?.() } - }, 16) -} -function tuckToEdge() { - if (!win || mode !== "overlay" || tucked) return - prevBounds = win.getBounds() - const wa = screen.getDisplayNearestPoint({ x: prevBounds.x, y: prevBounds.y }).workArea - animateBounds({ x: wa.x + wa.width - SLIVER, y: prevBounds.y, width: prevBounds.width, height: prevBounds.height }) - tucked = true; setTrayMenu() -} -function untuck() { - if (!win || !tucked) return - const t = prevBounds || win.getBounds() - animateBounds({ x: t.x, y: t.y, width: t.width, height: t.height }) - tucked = false; setTrayMenu() -} -function toggleTuck() { if (tucked) untuck(); else tuckToEdge() } - -async function ensureTtsServer() { - try { - const r = await fetch(`${TTS}/health`) - if (r.ok) { console.log("[lucy] TTS-Server läuft bereits auf", TTS); return } - } catch { /* selbst starten */ } - console.log("[lucy] starte pocket_server:", PY, "(cwd:", TTS_DIR + ")") - ttsProc = spawn(PY, ["-m", "uvicorn", "pocket_server:app", "--host", "127.0.0.1", "--port", PORT], - { cwd: TTS_DIR, windowsHide: true, env: { - ...process.env, - // Bench-Optimum aus Phase B2 (docs/LUCY_TTS_PLAN.md): 4 Worker x 2 Threads = RTF 0,44 - // statt 0,67 seriell. Ohne diese Envs startete der Server SERIELL (workers=0) -> - // TTS-TTFB 1,7-2,3 s je Antwort (Realtest 02.07.). Per Umgebung überschreibbar. - LUCY_WORKERS: process.env.LUCY_WORKERS || "4", - LUCY_WORKER_THREADS: process.env.LUCY_WORKER_THREADS || "2", - } }) - ttsProc.stdout?.on("data", (d) => console.log("[tts]", d.toString().trimEnd())) - ttsProc.stderr?.on("data", (d) => console.log("[tts]", d.toString().trimEnd())) - ttsProc.on("error", (e) => console.error("[lucy] pocket_server-Spawn fehlgeschlagen:", e)) - ttsProc.on("exit", (code) => { console.log("[lucy] pocket_server beendet, code", code); ttsProc = null }) -} -function stopTtsServer() { - if (ttsProc && !ttsProc.killed) { try { ttsProc.kill() } catch { /* */ }; ttsProc = null } -} - -function applyMode(next: "full" | "overlay") { - if (!win) return - // beim Verlassen des Overlays ggf. Duck-Zustand zuruecksetzen (Position wiederherstellen) - if (tucked && next !== "overlay") { tucked = false; if (prevBounds) win.setPosition(prevBounds.x, prevBounds.y) } - mode = next - const overlay = next === "overlay" - const size = overlay ? OVERLAY_SIZE : FULL_SIZE - win.setAlwaysOnTop(overlay || pinned, "floating") - win.setSize(size.width, size.height, false) - win.setResizable(!overlay) - if (overlay) win.setMinimumSize(280, 360); else win.setMinimumSize(420, 420) - win.webContents.send("lucy:mode", next) - lastNear = Date.now(); setTrayMenu() -} - -function createWindow() { - win = new BrowserWindow({ - width: FULL_SIZE.width, height: FULL_SIZE.height, minWidth: 420, minHeight: 420, - frame: false, transparent: true, backgroundColor: "#00000000", resizable: true, - title: "Lucy", show: false, - webPreferences: { - preload: join(__dirname, "../preload/index.mjs"), - sandbox: false, webSecurity: false, - }, - }) - if (process.env.ELECTRON_RENDERER_URL) win.loadURL(process.env.ELECTRON_RENDERER_URL) - else win.loadFile(join(__dirname, "../renderer/index.html")) - win.once("ready-to-show", () => win?.show()) - win.on("closed", () => { win = null }) -} - -function showWin() { - if (!win) { createWindow(); return } - if (win.isMinimized()) win.restore() - if (tucked) untuck() - win.show(); win.focus() -} - -function lucyIcon() { - // 16x16 Icon zur Laufzeit (silberblauer Kreis) -> sichtbar im Tray, ohne Asset-Datei - const s = 16, buf = Buffer.alloc(s * s * 4) - for (let y = 0; y < s; y++) for (let x = 0; x < s; x++) { - const i = (y * s + x) * 4 - const dx = x - 7.5, dy = y - 7.5, inside = dx * dx + dy * dy <= 56 - buf[i] = 0xfc; buf[i + 1] = 0xd3; buf[i + 2] = 0x7d; buf[i + 3] = inside ? 0xff : 0x00 // BGRA - } - return nativeImage.createFromBitmap(buf, { width: s, height: s }) -} - -function setTrayMenu() { - if (!tray) return - tray.setContextMenu(Menu.buildFromTemplate([ - { label: "Lucy zeigen", click: showWin }, - { label: "Overlay-Modus", type: "checkbox", checked: mode === "overlay", - click: (mi) => { applyMode(mi.checked ? "overlay" : "full"); showWin() } }, - { label: tucked ? "Hervorholen" : "An den Rand ducken", enabled: mode === "overlay", click: toggleTuck }, - { type: "separator" }, - { label: "Beenden", click: () => { app.quit() } }, - ])) -} -function buildTray() { - tray = new Tray(lucyIcon()) - tray.setToolTip("Lucy") - setTrayMenu() - tray.on("click", showWin) -} - -function registerHotkey() { - globalShortcut.unregisterAll() - // Global: Sprach-Aufnahme an/aus (Toggle, da Global-Shortcuts kein key-up liefern) - const ok = globalShortcut.register(HOTKEY, () => { showWin(); win?.webContents.send("lucy:hotkey") }) - if (!ok) console.error("[lucy] Global-Hotkey-Registrierung fehlgeschlagen:", HOTKEY) -} - -// ---- IPC vom Renderer (Titelleiste/Modus) ---- -ipcMain.handle("win:minimize", () => win?.minimize()) -ipcMain.handle("win:close", () => win?.hide()) // in den Tray, bleibt warm; echtes Beenden über Tray -ipcMain.handle("win:setMode", (_e, m: "full" | "overlay") => { applyMode(m); return mode }) -ipcMain.handle("win:getMode", () => mode) -ipcMain.handle("win:togglePin", () => { pinned = !pinned; win?.setAlwaysOnTop(pinned || mode === "overlay", "floating"); return pinned }) - -// Links im echten System-Browser oeffnen (nicht im App-Fenster); nur http(s) erlauben -ipcMain.handle("open:external", (_e, url: string) => { if (/^https?:\/\//i.test(url)) void shell.openExternal(url) }) - -// Geistmodus (Overlay v2): Fenster durchklickbar machen -> Lucy "sitzt" auf dem Desktop, du arbeitest -// dahinter weiter. forward:true liefert weiter Hover-Events an den Renderer, damit er ueber Lucys -// Bedienelementen kurzzeitig wieder klickbar schalten kann. -ipcMain.handle("win:setClickThrough", (_e, on: boolean) => { - win?.setIgnoreMouseEvents(!!on, { forward: true }); return !!on -}) - -// ---- Bildschirm-Sicht (Lucys Augen) ---- -const CAP = { width: 1280, height: 720 } -ipcMain.handle("screen:capture", async () => { - const sources = await desktopCapturer.getSources({ types: ["screen"], thumbnailSize: CAP }) - return sources.map((s) => s.thumbnail.toDataURL()) // ALLE Bildschirme (Multi-Monitor) als PNG-DataURLs -}) -ipcMain.handle("screen:listWindows", async () => { - const sources = await desktopCapturer.getSources({ types: ["window"], thumbnailSize: { width: 0, height: 0 } }) - return sources.filter((s) => s.name && s.name !== "Lucy").map((s) => ({ id: s.id, name: s.name })) -}) -ipcMain.handle("screen:captureWindow", async (_e, id: string) => { - const sources = await desktopCapturer.getSources({ types: ["window"], thumbnailSize: CAP }) - return sources.find((s) => s.id === id)?.thumbnail.toDataURL() ?? null -}) -// Fuzzy-Fenstersuche: bester Treffer für einen im Gesagten erkannten App-/Fensternamen -ipcMain.handle("screen:captureByName", async (_e, query: string) => { - const q = query.toLowerCase().trim() - const sources = await desktopCapturer.getSources({ types: ["window"], thumbnailSize: CAP }) - const cand = sources.filter((s) => s.name && s.name !== "Lucy") - const hit = cand.find((s) => s.name.toLowerCase().includes(q)) - || cand.find((s) => q.split(/\s+/).some((w) => w.length > 2 && s.name.toLowerCase().includes(w))) - return hit ? { name: hit.name, image: hit.thumbnail.toDataURL() } : null -}) - -app.whenReady().then(() => { - void ensureTtsServer() - createWindow() - buildTray() - registerHotkey() - startCursorTracking() - // Tanzen zur Musik: System-Audio (Loopback) fuer getDisplayMedia bereitstellen, ohne System-Picker - session.defaultSession.setDisplayMediaRequestHandler((_req, callback) => { - desktopCapturer.getSources({ types: ["screen"] }) - .then((sources) => callback({ video: sources[0], audio: "loopback" })) - .catch(() => { try { callback({}) } catch { /* */ } }) - }, { useSystemPicker: false }) - app.on("activate", () => { if (BrowserWindow.getAllWindows().length === 0) createWindow() }) -}) - -app.on("window-all-closed", () => { /* im Tray weiterlaufen lassen; Beenden nur über Tray/Quit */ }) -app.on("before-quit", () => { - if (boundsAnim) clearInterval(boundsAnim) - stopCursorTracking(); stopTtsServer(); globalShortcut.unregisterAll(); tray?.destroy() -}) diff --git a/client/lucy-desktop/src/preload/index.ts b/client/lucy-desktop/src/preload/index.ts deleted file mode 100644 index 3a5c51f..0000000 --- a/client/lucy-desktop/src/preload/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { contextBridge, ipcRenderer } from "electron" - -// Schmale Bruecke Renderer -> Main: Fenster-Chrome (frameless), Modus-Umschaltung, Tray/Hotkey-Events. -contextBridge.exposeInMainWorld("lucy", { - minimize: () => ipcRenderer.invoke("win:minimize"), - close: () => ipcRenderer.invoke("win:close"), - setMode: (m: "full" | "overlay") => ipcRenderer.invoke("win:setMode", m), - getMode: () => ipcRenderer.invoke("win:getMode"), - togglePin: () => ipcRenderer.invoke("win:togglePin"), - // Bildschirm-Sicht - captureScreen: () => ipcRenderer.invoke("screen:capture"), // alle Monitore -> string[] - listWindows: () => ipcRenderer.invoke("screen:listWindows"), - captureWindow: (id: string) => ipcRenderer.invoke("screen:captureWindow", id), - captureByName: (q: string) => ipcRenderer.invoke("screen:captureByName", q), - openExternal: (url: string) => ipcRenderer.invoke("open:external", url), // Link im System-Browser - setClickThrough: (on: boolean) => ipcRenderer.invoke("win:setClickThrough", on), // Geistmodus (Overlay v2) - // Events aus dem Main-Prozess (Tray/Hotkey/Modus) - onMode: (cb: (m: "full" | "overlay") => void) => { - const h = (_e: unknown, m: "full" | "overlay") => cb(m) - ipcRenderer.on("lucy:mode", h) - return () => ipcRenderer.removeListener("lucy:mode", h) - }, - onHotkey: (cb: () => void) => { - const h = () => cb() - ipcRenderer.on("lucy:hotkey", h) - return () => ipcRenderer.removeListener("lucy:hotkey", h) - }, - // Mauszeiger-Position (relativ zu Lucys Kopf) -> Blickfolgen - onCursor: (cb: (p: { x: number; y: number }) => void) => { - const h = (_e: unknown, p: { x: number; y: number }) => cb(p) - ipcRenderer.on("lucy:cursor", h) - return () => ipcRenderer.removeListener("lucy:cursor", h) - }, -}) diff --git a/client/lucy-desktop/src/renderer/index.html b/client/lucy-desktop/src/renderer/index.html deleted file mode 100644 index 4dd41d5..0000000 --- a/client/lucy-desktop/src/renderer/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - Lucy - - -

- - - diff --git a/client/lucy-desktop/src/renderer/public/vrma/ATTRIBUTION.md b/client/lucy-desktop/src/renderer/public/vrma/ATTRIBUTION.md deleted file mode 100644 index 030b322..0000000 --- a/client/lucy-desktop/src/renderer/public/vrma/ATTRIBUTION.md +++ /dev/null @@ -1,11 +0,0 @@ -# VRMA-Animationen — Quelle & Lizenz - -Die `.vrma`-Bewegungs-Clips in diesem Ordner stammen aus: - -**tk256ailab/vrm-viewer** — https://github.com/tk256ailab/vrm-viewer -Lizenz: **MIT** · Copyright (c) 2025 TK256 - -Die MIT-Lizenz erlaubt Nutzung, Modifikation und Weitergabe; der Copyright- -Hinweis ist beizubehalten (= diese Datei). - -Genutzte Clips: Relax, Thinking, LookAround, Surprised, Sad, Clapping, Goodbye, Blush. diff --git a/client/lucy-desktop/src/renderer/public/vrma/Blush.vrma b/client/lucy-desktop/src/renderer/public/vrma/Blush.vrma deleted file mode 100644 index 22d57326d81bcbb33fd25eab7ed609d37b8a98da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118448 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 NK&g@84TBg@{C_?>Uh@C| diff --git a/client/lucy-desktop/src/renderer/public/vrma/Clapping.vrma b/client/lucy-desktop/src/renderer/public/vrma/Clapping.vrma deleted file mode 100644 index 58784e89d398323165f4a36dbbb4ebc3fb8046b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118448 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¨Ccux|EtN5;%ec5;8oCPYb^U~YeYMye-yTK zEdfL2IF`7mfL^|1C+ht)9%>O^aa?eRw%!(rwl^5SF647JO--iuI|hoT`3j*C@s!yW zGiYSM7ol;bFAPwUGB;&)YJIUuIM+D<_NgLXQ?`-*a90xzUg-r3-I2dNaGHAV9xlqb zZ3h3t_wCQ-3$%FbKv7en2D}QAGyYx$T^V>$=s!*u%ID$w3C^Um9^V!Y5440{tVeeX z+epaUHNx71Ga&gK;y1l6WX^F@oEI1b)-ACtE+9?dX`1Bre53@@0wt`|eZNOnV7{X7 z^3_m|dTRUn-GUuO|B>|8F!=gc!uqr}x@W9jMyz!LAR76QKI>Zq`wvU#AJYxcW){o# zrg#eslU?YIdrP4n?@#2HTY|=piL`k7W(a>JVJzQ7XoLL3gBfzz&_}|;tu2LbA`|FZ z*LXPGDP}KT^mwSW-{SU;35Cj)v8+k{lRF#kBY1sk5!iYm{^BelIYTl9lTBvA{_}Bc zkjrP1a(%2&eB1|m$4QyICYl-rGz)uXkA_t`GL}=ik^aeU5MDw3aj>h5>1v**-&@s0 zPZz4eq6|4pEoq<=)V~XB!qqUJQO>yQzBJt0UiiM+8b0qsJa*j$(&urA;7R8M&_%vr z_^%Mb^YbUjrgiIJy;m&jBRRuyizkuI<+C8^cpT$D7IPPK6FlZg7sDynI5vCydBvep z9d7mR0GNULb7SNR*LMFR-NN;78~dA-;s`-zWg>B{4};@zI$d6la=Sm>l+hr-h`CBU;LhnAKFcR&%*jXLCTKh9VQ3IwF<@!m<9`e z#Ia!&JIU&8lY}{*OMuwm{y|lhE}Nbs{PNEqb~hpZ?YxqF%Iy@`4Oj@n5s$y$n?*jK zn!<65LIiKi7)*0Etlx!K})+*C~wUOjjyA?=K|FGlQdoq9VITF8NIIQ1`eBzgS@;_ZY zDqU$0$%x0hHMx-QZ6j#^EX2#NBOe#*O+LO)BaNosuz9AGIlOP+YPMO@UqdH>4Dr`} zZutUwKZ}l?y#$uv`>D2hrf|&1xAa1k7=(x?&pE$DxIOd=ExnWg!VEFXU*RSE;D4N6 zzp)i&H;UOg^FIOy^HcQ8`&Cd88OySZ?Sxxuo9Te{VetDu36rOP7pSzP(;@#hf}0ZJ zgSVOm4yQtBPSZvxR71XPY^UJ$^kMWf;+tP5N|+scD2Oa;AYmtEa7|yra&pHAbt_Y; z&!Pmd+K+tHoHjx0@hS9Jc{qGVKJU6psKi{#YiJ>e1!>J&E|=W;pRg!pyr= z=)wdiQmY{bE)2g1L+i-C#hu)LlTsn2J%(*u+fF$BA!JbEHkfr2@nyB2r2do@;q_(U zZi@A8f&x-1F50*B=W{`GrU54t=0S(iAs6RO-@RKEG~xG|L!0+ z1{#yG6#2RrV&)$*hSpfECt=-zAbAtZ$n44Vo<|~SteOkM65^Oi?{cbXS3vIjPJ&}| zrHm~Lq1glTN%=T$aP!0d@r(m?J+Okz8MPeh>toqc=tl!HN0V8lF;E*NVcw=DbieLQ zQuuEj6uQQ;@h45Gp3Q9XpYb|)ZfZQMah7c00Ox;vp|Pz-Z^e~TP?qejksPJ#(b z#O%%sL(CGKOokTGod^>%#cb>-4>ILq zG?%hB4_2bSd&9|eE{#8{*xgVHv)fR=`C=Pp71wZ=YO>(U6U0B}A0!2@S~;V+>F^)o zU7-U$kyH~?qW?S|(m&(FLXaCoSgeH@!jI#hYC=-3YUYaPSRC{A({r@U7j2`Pd945Qe;t{vQ(p`3y*ErpI( zk*sr(r676ALXT(ZM_{;1I15X?I(}od%6R1$d*PINB)c&5pht9Rt9#Q3%(u0UV1G_~ zkmi^e&aEg9Zdl;`a(T%epK8d39xaB*fG9R*YYJDLQmd$ME`@t7k<4a+5ee8ZjXVCP z0485W{kl~h2@31vPI#q49j@mWdR=7f8cR~XM+TD&B+Rg>jWpB`BwIEmK*ceUbYAUA!HhStCDe+C!db+mcE9g^Kh~;HJLVp+*+_6vd5qwB6JS@HZFtk=lmi0 z3F_N)yy&zC@gzlO0ThJ9v5)qabhP$D5}v;Xrmn;NLRUW;et$G+md3#D7zrCcbP|1N zyp6mN&xhQ#sQ)nZq@9^^va5Un=qurDnn^?Bzk_KHJKc0BHMZ&wo z62@iQ(TPbxVb5+oBaYgr z|IST-cZbAGK3$EjFLoxgNHoY2k-v#hr8eR*WY4%5_!5VFiK+(uvCWNa*%t{bt0c_P zq#vDr+KE(j#emvo3A2wsN|MjM;y&z7gN^kuOvS03n=iesxT{$T)xRUz-;6s7zM{Wk z@Zk#hwmOn+Ejvl}n7`*bRnwsMMhtt~tc}^GLXs~JhZC11EUQ>V8@%I4mf9kChP=le~w^!S#47Q=j#fgnTd~CyvQssIr8qAH7ZP>h>r6$t0*+E@o~M z&yuSXKXc2Mr$X?{7}hbalGI&q=B7FR|NL~e*!v-Qr>{+3?oEW0?P4~|tBefuZscCH z;`e9``bG3a8eVi%jpl%-QjoVD1;g+#mlU zgW9c$?k*`r4wtZ1SMHJa%NhhslfV%57rpadlGP!G#M2-Ff>6I;3AO$7ST-?4qFvfbUbGC}xI{1+y>Rt&Du63;#lsHEp}o5{4s0nm+kbK8n4==z0C|k02 zo#x#{26I}FivNGz;TYXr@S1F$_KOctk7pHw&(gW*NvTk@^B>TU8yv<_3&SpwKe~lC z!R!0}sb|m%mpU>memJNVBfj#fglZ+;By}BnFm$1u zX)ej2cPmhHVlf+AQn&qw$j1d^ z;Pw#2lg`9ZAMt*oXY2x}eo2|%>kMkXu%4XSW({80Z#DhRq91um!Y`TOybBp?Ji3df zcLT}3V+sZ6$6OAjRHNV)>G-J&M{s=Q_=DW$c+!GM(;;e!2)pkfGki zX-E*AQjkk>6MSH#o0M(-7))1R&m%6;|9>7mYuxQbldgx7fxm)4@DS_s)tS^iE{zmS zoB`H|*RI~_N8`^VkuQOBKpXM#AKuu{7ab?6HjZ!%@w$^P68h{;6{*P>2WwG3SMxlG z<{9M?6&)Wqhj>=L&kE|Wuz+kEHVG={V}6ZG0)3lVL(-2rfdKVQBU;kvzv?qY@x%u1 zrpwUZlt7E5H3So+A#DU67sS!~Hv5Sp#09FmFfYp{lkPrNPXb)5Vcvesr-5Snde1dt z8EpVhC&<}vR|PGQeJ5T6p7L8ap`UWgX{vbgfs~bW@Oqe!dHl#8YJTx9i44^Q(^NU@ zcFLfqL+eQI?BVcYH{uKF;dIsdJtQ~C9Yj3(#ZOeyhK={h7p(!XrWEy{D~stW+iS$Q z%>Xn6a&~juUTXjJ9x>aj0XwqgY#B|Vnk}{D`*eG--h%bOEQZR$_mO+l6%

|_5q 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 DbYGd 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≷~__n=cpe!Vba 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 z z(lAgf*eh%d3FHH?d`d+aG(X-ec->sWcP8WhC9iO}{i;Av+?>zLGco?_umSoT?ib>^ zc=565e=j;jf_GS<5S8c5zZWQ_l2SPgTv;SU|C_{n7h}F_oC5T26bb8BPvEA9aJ{>o z0>&IE5~c@D$f=!hdKehwMAD3`A z*jOMW|DMm&vHx>bVQ}s4UIDZMcqsCx_t({+qq#>goVS|WM=7P?QK68Kx=R@Rb`u}C zMk!rMT?X|Vb_j_x5_qhyQgT86;f4OgMtujzn;4|+L+62cYpSroV+gYjslPAm+6c2c;Levi>d zI3LrEfl=uvguRR3urK#9f3kcl{9aiqJngT^EpMX#TN(|ct&Rzw#vAa3*Ob!mQ(NG~ zgCjz6tTjJhf%`$$ZG_OwV!UL9-r7XMjKD&n?=NS51ogS` zN+dYnFBI&)PveHDe-Y}D5b9niJlX8RCt!9Dd0-^04KW>BN zH{8}h?$|xT#4{`T35Fc0$WP$KOzL+0K#r>PDYvBHgJwjg|%tK?8(&ePp5Oy|S z(CoREZ$$pg8?_qV#ODh$qQmfh0*r5dt%iF#dxQyNSM%{`|K^?6LfEA}!sZFVyb-@w zz72!mpL>Np_Di?}$}_eq96W~Z6WpK8V0vsa-+}u6Z9ncu z3EnS=X|wqvluv2#I{3O4_3w!vw?zGzs2c|R7VQJfY8t7(RT7Qrg^O z1=vL82`B1e_%DB@)ZH%x=C|$?TJCJ&Q$lfkdcPXq3)>?^gsa2kLGets7r-?iZ_4B=-0)m>0 z1k#N6gJQYKn@ITZu2AT@W*QGe`+m?A4tFN(6Z$Ql$FHG$#`!E_SKss_;T0LM>LkW{ zPv^1DKkUf1g57ZG6xyqSFPoEYPc*I;fdQ6RT=r!Jj<&?<+7hT^xE?WTA*&f-OW;>$ z=z;ob(%X;S{n3j|I(Ssjx`697Q45*rke)=y>nA+Di2ROQz&=@aC!0Q-id)b>zNwne z!mitpac64i^h%W1Utg9msw+AD)?f7-v4e&$>yzG@#2zeBC7^v+%6r6GUD)ZUv_16XL2&SQS}z_LH~Ko53EU} z-D}k${C?)wxvT-t4Bc!0SoIt6=Z|w)-A^kLxbLaz7h+>;Uv_4sHL2dC$G+nC3$|nX zpG*A~t)a4GCOs$r2H_ z{_tm3A9|2qQ!l6NpyHM%L4nPs?XV!H}X`Sy3 z)}~m8Jef|}C-hI5qi3?(Lz<-ab2}bgiuuY}uI$ojb+X>6Hy@4qRnl=5d$d=J#2cFM zwns6abisvvS#L<#l_|{pD&{{6r?K8y9m)QnJa~ih4kMG8Ua~#;b~1u!Ov3))Sr5H8 z4rEvQ8IoM0kW~N1vU5@Wh_Er2Ow&es%*U}Q8!U+wsX=<9y>}PKu(Kyj$UU`F;C~MD zg%M-f=e@?H?e{FGM}9ir8qXXYjLGoT-r!n`P*(>y(ym27~E&yc}$8NJn&9Elwvyg~g)_%WB&Z0$;7zKn93iRIJY&SNvPyP`Xo zM@J%l^v9Q}_pl*bBCgT%SbxW^1uUmccj8pshNdCEU&3OR{;U@nd-kN$4b;cwzXRBH z!Jgo$QYRmjPoI(?rsmj}>`FT5^j<>wNh_G%m44*vS~n_|0Er%!CZ-_n@H&{Ojtn41tFoLHAa=A1VY8MFBzeQl z1rhy=deI6Nwr3y_R-F)@VSKkneHlwW*q@jNT*NU9{Y6CpJ2jy%IgO`tPGEaEiGD0D z#g@cXYd{6+=i1G4ncaXMsazXEL?Y6bz9c zEB3mx6WLazDe9dNj{G)QJBxju){#UjYJ^~vN3$coM{QzB95??E3K6$epgyd$Aeuuu zLNCP57Bg5^Z3}XxcqlBc#`*W(sjRP>8M!o|59p!3y*e|Q9Z+^4+PKaWhS)+eiT&)+ zfs`(G!8h|ze#VoS`$&Ate;PxS0ANoC!&1>vLdJXyk{f}b( z(G!?Qr;cQh%_q2e4CA9=^fhT9d5E(+wKL8tD@}CNsM$orrYm8T3c`+dgq& zZ?1PHbDtf6Zm3W8AwKL;lMSiZQZMvJ{!BixnBAJ$lel?1sdA7%){|GT@s@o^!}fC3 zCgjie!c{EkUw`r@;e|>IzhCwsj5VGZNT#kB%4QHgG{5i&BUA3}ku~vmRaLreqVXKhTBeST>z6$Z{&@Viw zALgs}WzvGUOJZciH=f-C^HD3asotwfF*~J&%ZDqZko;^~)VoUjVcNpoMq)m>|8_dj zp<2|s`<9QHtdPS0#WAxRc}tK&I)7;=C8Mv4YbQV9 zm)9z!)w6cdyx-Tw7S=zafs=*}!`#F(2`M z7kyoMLp;}|fj``c`Ma`R^w5?Y;-}*c{2tct_h1+OcJzk0a7F`n!t%1xUG(OL8)CH7 zz>i@0D2LrtKA=wg=lPJQZBa-ogLcz{%j!g@$_IRNv_guH-c6Osb>af~10J zPcN*g7d;N$<5dX?$*?G&<`~@+Klt6{-7vo!?7D|e`gButO1;gUvlUWKV?K@Yy(zvZ zzr$yyE2Lf%^Qm7-y~u;^@tuhZDOSFl?%Y%-YNb8kj`)AmJ-g_afE(h+_YGVN>C?TH zN0+s|CjPnijF&D){ts}R50f8}TF6jH&6WcpZ#i=$gL z${iczQlZs0s_T1PjB7P4zb=&dawy(^}8*x8n z%AjcKP*)QT(W5rs}$RRYT=p=3h8EiCUstNN$hd<8_(#D_E3{f zTTL&BF)_b+wGrkQ&Zbj6^$TLZg5TU9@sfaax^??`u{`?^&(X*H8B3%4kDn8tF8Rk7 zXey+31JY^yl=EWc(7(LDu0nEg$)G=~FNpRwzxYBkh17OqCM}tDNep@MjeqZ^kfw)b zQu{HN#EtE~^8m!(M`qBL-4{f4-(Nfk`(M!~jrzSlD>{8^<(B{CQgO#L`l{iqs4#9* z?*CUV9Y35#KjfSfr>FnpM>G_Y|Cx09>C<`f82iot87d@)>I`bS^rCp>>JJ{%Ng-8F z&ZMHrB{6R8cYd`i<_o7}((-nf#9M2=^J|EGbTjE$c2TV9@q>5otdN`=GbwMlB(~oC z%6s)j{x@gQQ-dnSS^A&({Xv*7Je^Hnj;j)d+aLL8N0hhScA7DyTGW63mYbmeS@=Ac z8Y^nW6TM#YG;f7;ZF3$q$+;@_5gTzo8Lnpy*-7_r!S~4?KIOwgG2dvgi<%W&7q4x7 z%tON!lKr4vw4(aDxT5D{esw*rhfUZ?Wjn5kNqGMD57vKkCyyGUefrfs<27iXXK(MI zb!At?!70!A4?oNY*W}VyZna|P6)$;=mqJoRY^T?jJ$Ts(-3VwEgmd zXM#ei+LuN9-l-6God3)_4NyoCAsKY!`wOCNXjE=>5VQVuyeR-iZGBQCdFr|5h*R z=iKE>Qjq?Te7fd*z4-mlU2cT_W9{_a)Np*AxTw=Zz9E~tg`6m?iJ$J5qRDh{bS1Xbh>uMd9n8KA0DBH_Bb?^elL{7CsWnR*MF8v zt4^iTVbjlw7joN_TmFWFOl^j6 z(fXQ3dF>;)^wlGgzDuU!*97hI%azE_&++uHbVjrdX$%~YOPg7XKbYN|rq_Q6!X8S&Ly)wFAa7R?Ty z#0Ow}(kHN%<~3{6ODARgA&&nar(UJ=Y}?XyHp6%{#+xxCuG4-ibm@Tk_WTaUlZkOR z=&>1kwBlnoUW)PF*x_~b4%ed%gS&8boF63hsi&)a^y#C=mV6@4S4wx))7QoN^r5Rc zuc^m;T2ejzmak8b7Mk-+#Fnx3v`d~oU0h|(w;-9(TZe=HiF9=w4d``r^DUzmGWW z^)0%3fB}tJsmpaA;ClFJ{9fOHj?K{H{#af=)r>b%*9)Z`H6^AG&AOdSfsm~n>k@V{?bXhJoCL6rm=@xIAFYOT}HpN z7Ljbrw0QMpq0;WP`sU zzZ~9Don|Y#Xey}kTXDa+-E;cQ$%48UJF`>2FhAAvHofCzK+Su#as?gdaW7DO-^HeGqsjZ)6k(VmkEy*l~T>E zT3YX*L!VE;YrZM27v$E^7jv~~Lceibf%%yp4OMh`h9)gtHj6L8cr&;6B|6wjoyyGu zcs%BJ!3oI3q`&z~R3!Fc=a zMcV6|8lAi-kT1@{{c;a3(qZq^=n-fj;e{MoF&_ zZio7FA4zRq_vdSWMaNFt%7c9 zuR*^!&gU^mk4{r1z4%6h=05Y}H<8|o*HzSGhbDd3Zx-K<{i~XLnQm;-q+3f|cmevK zlxJ0R9?EO~f?52(`GI6|na(ZKq!Y%w^7$x_i|a4b@!vJ6v%U-OgY%u~KQ7Zp)3j)v z^K|Zo^QRM14GrC(O`Uu&|BL!!a{4OO4Q@-XUmeVQp2z%>`wjY|w;r8g*Mq-8{UrnH z=$bM;>M*Yhe~bBsHfr_MeY8HEaj7FO!+iAhBXu;Ooj#qAYsGh8$Nb^>8}vh{9^J-m z_*%?Im|wk4M_<#W56pXW?P{EF55GoVooh>l-vhWc&X;_~U!?`z+R}HEhw-K8|DFV0 zp|3J@=vH+{+`)_aq{>?Qz*dKnOyDa}e|>h=(6S}k^u5(M9*z1de!NVpCu-4$tEO`q z_Rns370u|ONn<*Ba39nM(!Y{!S*t-mz3|~HaJ^*Rs|s2>MT5?EpT`~Y(Vr_SY2QN{ z)Y^Ow|A+Z+txJ`3|2+-rlkCMOp*&n&D(Sy?4VvD~hnrz}@V!bJ{#=7@>E^}vVfkU@ zWg7Vx`Tfe7PeXox4y&d2KWfuDUm3SX{T;4xorX-&rF#{9xDERAUxoG5|ENB#>T1rL z(4X1MZ_)7Pc688feSYE|`j?frX#Asg6inOk6vTN`Z&H~}J32kqg#Wswl%AshOV!b* z4yUYm67m}wuG5@5y0o#Z7axcGZHc%_+fQjriwuVHshDrMpH)lkb#$mM+S_iV=l82> z>iAxZzS5e+qtRYhJ66#HJvC`(GY{^8{BknBNVof|(bof4@E@4(@ACO9tv>!w?6yt8 zr*2Y84M}I|(qaEZOYe=mrxNoa3(9G;^KY?n=~ljX73LFWF#0&|hj^iH0w2Ew_oK$C zs9O4WamSP-zH1@w*IP_!uJ$*vQ+O&5orC!V@icuftVJx#+rh)fqW?7A$-hRwCM|Eh z$sIf&He%-v{xt>BmL%lzEw^6~S>JIa-VNhf{~Z3sr-=;NJd8{Tl}io= zIlQ4y6WL4$kzOE%^yn~CX@UPOPjTuM^Q=5;a6B=kW? zG9Kq!`~GI}?XQ~2zCo7cOC+AZ9g)pf)Vv@+k6Vxp>*bQMVK%>F_mWHHDHAZnmSDM8p`AfGu+A!_7?o#qv2xHf>L|Fe4Ow{&dZJcFw?Hj?A7{=uc4a%nx@ zs}MZy8M*)Q84Nfqm!5>D@Vu9g$@+B+mYu`+=3El*e)197Z@C>JuHkvV;fcK2r-2+P z48wIrx#aOXfnUgPAl9KvVE99fkGduD8negb=i3a@xLV3{()Y6nMhE{p@0Eo2LOdfAaZm4?OGtlFJU7_)fEd}02Gf^vDe-C? zpV|8k$y(@*=W_A<@{I(Z_T)Ax>{0;m4$tpZr1Kd|9}!)9BVvC*F3mW)lTTUwhWr}p zOGe^(zMBVSh}kY%Ja z+j9qhdEx`nZXG}j$6^16X7W2OFG-R34bGyxD$l0!Aw!W~n_6%?A(zzgU5R@Cr{wJN z0w_d&ulbtHFIF~^ySAzD68CpC@l^gG>jg>ay%!>jFrNRO#yvm2CH`k~z$;BI-FTVC zhmUG<*_WZ-$ZCw+7IQsEa_bmbk0 z1kX>SJ)9E$lFQTo0K@a6+aq`I$1Q)!g`m%{5OL$w?L7b5Z}P9W8f2I+xcqoKFM0Hr zJjOFFBlj93CEB=$*Q`{Rjf@>a+#g0tg;VzO zoCG!5)#EZ!doNNN;E>M)r~D%~y9_5^@cW(NJGo}u5Arw5ju_&3>^z4ZJox=5l2mR( zwvLudTqBpe)V?QQdUYc&@x1q-id=50@s1R04IyFE(LVa;@lO05Ih#9%+;zh9zYFsC z2e0=;|K1qVi2WO#w1b;neUIxS4kQfw?^v44r^b9BhJ9>F=2W@#I5d|J6Iw{WDV<5X zX?XtjU@o7P@`;!kTan6%IA30q%RLrrOo{$BvPebcjEH_W)j;;5JzgIc9-;ztUnTfn${cYkaP;A8#^N#EB`vQ35^QlOrWy@;Qr-kVA zJcx);QYtCCX%tHOd|C?awD(ZjrD69u$3u~k&DZ=|*)x<1so(Ma{rP@9&vWNF_nv$1 zz2{-Bt6vcc$Uma|Zz47}-enG3ycassddK(OK|E`6pAl5@nWtAnxC)sRG;V&ttdSYY z?4tbrCa2+r(~p@F+wtU&4dJ%AW}=h*3+6zB3G+5IgsaZW!T8f}7&Av}#+&MY@^?NC zU-*e>?{R19=)P_U?-074`N}l-1Ta3`Vs23LAsjiglSzpRV5B~Zxt)%OFjdsWgi8A| zI^V?Ht#yY`webhj{KSKq_EpRktSv^{DZR`HUmxc3b1^r!v;+g1e=(6?{TP*NVs5S0 zVQgGU^1M8NS$sjvUEEWO%Xxi_^w7PGeZ81VZY;%v+P|3(ru&$z8ZqadUWQ8#{bt0Y zVwpSnV(!{M<;cI$$3!U}WTK)e|A!UW|FNG@$WLK5?G|&UIu-clL_bsOo5(aqin%8g z7aQ99nedcoMkhtgnV&7gv;|V^%#sKuJ(uDE%qT--%B<}fFm>y5} z*;Qyh$$!i2u6-&D$q3;dd-G9wj1fp?tN?Xd|MkbnVNj+q_=jsjAlVxSLget>eq)%q zSqHWfj~CNDTN5Lw@?Q?-^!|Z-9%?EHV7iGPJf-#L!!dNZYJ(wc{ulw>WFH=Ckj0Vr zra^F53}_Lzx5;90?=;xZdjK4XH8SX)XTvmDFgTw4?6hC(L+=MogJTX!aFBRcv@F&a zPJFzM6+t#|&YSM=*F3yKLlP;#orw4+MdTcuEWpv%VWb)%=|xA-;BjhwhdF zP*(Q=O|sYSYw^+koB-VRxx!guo$Y+ooMZ&uo^~+lZ+oQh@ui&+v?9 zkefCU_7#lB^<*E%Ui|{ux#QqjoCR*mqx}-aFJL})94PC}!57&SKgHo2C@s>2hnofH zO!lq$`afV|p#z?0KY%T*59TV!qXKIJzRoJ}ndIU6=;2rrGY35D1BE{+{}ine&)e{ENv8mMTOFZ;z7G%OrU<)5U>!{0j$!MHOVl!#?Lc-YZm z2!hNYh#+>b;$c^oAt=U#zye~m={(#PX$Zwq;h;r4)Q*omy#iP|!4bMCe=~DFMm!Y2 z5_E=p#7~Cv(WG1e-f`|wKzzrTkAb%YF!iVlTq1t_i-%6p0`M5J0sM(CT;<_I8v*Fb zdxIYFJ8M2J>JY%p>8s!aag~xBj_EXlk?YOj8`ZD&XaK5ThrT>k`kKJ9 z5lSFM?Ni5-$L+IB;8VK_yrSpkX>#aRY7EDJOa?Kr@HZc?J~D#k`WEnj(!08fj~}Fs z;GfYBFhKd4d+|{Bq9JUt3W7+gZ&I!-PB=XcMis@u59-h2XENAH@p>a3W`isFuU==! zVBWf^uxWK6RMGlU<%ZFJjG(zz2yIl}Q)+S;-)98DOJ+hh z@#{fy81RM0Gm@cq#Mf@|(fhCwyxTbsDu{1gr13G+2%hy=LKd;HwH)rBYYd?w0x+fa zfN(jqiZg~$@3sFMA6IXYLt8&%m@cgkj`Vzcwj8!p8^a`>$q+*P?^tS2d1E*?dMa14K}I6i5JDhU?OFyGw=bw%26Kcy4? z`d7Qo_Q9-M+K_$aD`?RA*s%%A=fP5;?g`={_e>e^J zS7Sh*b_4j)_ix9@;Yc}SD4RY5Wa#^^JNP(Q#|Z2m*n$Dcn?WWI z$MFTAr0oy4Nj@|!cz8U{5bmpofe~@33=f~rH3Wy-kFmzr+mq-PMw##J4mRaC)67d^>+bl0dBZULKEmn8GRV=aK;8YrS%qs%HW<^=k0^ zZ~dKUe3LPPQYi=Mr}pvFlR>4M1~9s~9I|P?vikW4HWcc>UD?;LoBYi->w2JU!DMh> zp@RJ5bRO2V6Vmf1z`}AZw6CJ~!#cs|_yqX%YYH|J>+APG=7h=6;i!rc$H?Akkj9n9 z25{tPJuD-Axm&4#nVZcZ>ssl5^^@uuj{Y@sp~56y`1kypooED}?4tQLqgSX=PwmsC zfvJ{@V4v|9;fF@LkMTtnOBc+C)h&%eDU$cy1uEDWGY=-qXA5~WUi|w+88^(D1B+eh z93tuCwuE7LTFgN3`&q&%H2%tu8it`Sg|K9tuF#Ce-wsv@EB$A~G%;sUL+ugiu86$e zneh6@(b<37%Wanex{fykQ`HlaN@`Ej+45)h(J65zR(6)h73C)2P5)pWPy91q4%amrgZ1u75J~A>P?p2i9*XDQJ`*}A zzi%3H_;i5c)A!DR9^$ESa=0X$Vj$XSK@h#aLqi^K*_lAIkuvlU%i74}mJAa(YNP-o zDE-tXIpp0p2Jb23p^%A6kzr-J}o)x5xr>R;o=!!f7H{(Z0q zwv+zatmL6XwIP)Gh+qwIbUmFb*A~ENyRHA(E1TMR=;9@SfU}#yfxh2C_J_w$0qh>? zNdNF7`}`RnBTpE?R@XUjoXQ_X^HmVvm_)hKmKpOZMi9rD;Ju= zyO(bz+vxpgP4d{HX9@+|zDQh&FSW^|aIPslU-DkEiCDW^4$ZYqph#UE?o)c7O!ydZ zTL711UEng+e{+&7HdIW5&bWAZMDiV|D1(uJ?b#3e-s!-&`_EwkaqP?iX!O^GLoyGcndY}&#Zm}Y^}u}6 z|L4CNH))*Hq7PRUPJ$=ttNTuAy!}ic;x`_LBI5BIr7`M?KAbN&0e-~a)=J~#R(;s~ z?+MsU+(z?v9L?V&pGcsJ=C{l7Qh2gX55C-Ng*Q~cS=IxvL97eRx(9Hd^4F^FgP|?j z(3JlTKGFQSVb3oZNwR%>qbx3={TyY@pAhUj1v=kRJQ?yYuZ{l+sYj=P3e5wv$zQ+! z`!5(?qy;0#N~1IR^ZV5MV8=Rb=(Fg7le9hwwIh3EogQeqwSgAp?~gL*oH`ZQ?RhYW z#-EoHc-Zen|GSBf03OMA-D@6-wvhckXEQic|3#6$bdtVgwk`vfUj>Nx-Z z^Xc+omG~fH2zz2j1SZg+C8|G+k46n*#rI;+$x6)0?JL4{+VbqzgfuL)7IVK(<)fV^ zpM7~V2SaVeoMLP))@#bJ>yPB3?lv*!=aG%;MSaZH@ww=bCg!Zlve3Dun@MlY#K*_z z`S%Pwp!l6JdYpx6m&m_Rla6Orb}&6rIr#OKn5!O4_vWHLF%w<#(S`hD50fZPuJ}EZ z;Z=yA$Uoq4{~(^|d&8`GUW~%GV$Oe2GJdRi%LEK5#`~|uT!~u>9`kv}nEon2?{{Ku zFQj6&=mQhDBoD1A9$36Z2HxX+WpXUDQHk;ksLev(P2G&~;!N~CDdyfB&q1+vALF2z zf%^)?oMlc9UU2xsTsV`71{q>bM>7i}rvG9lF33l1@^?5$XJBc54|83y7+2Bz6X?H~ z-vhguTZLtKgW_Yl$)=&rxgKWeoJ!0{BLB!O@=wqE$=n!Rhc#j`ce5u6uS}-)(gIYm z7jyUTCEyG4rzBfm!WWui?zwF;Dj$_*W&WH&zMhz?;%DPsT|O(@U4>gr#hlmnLYyxc z#!i@7iPkqo+_@`7c+hJstKZ9^r;>;}?VgX_N;<6lsCHa7Bbd7#k%J*?R&loMnL!R%*eum zE>(7^JKZO;6>+OqRie;ZgT2#{hC$^bPWI~wv>G>(O+90W;g>~R!>KB~_FREIeA5$M zHj26Lc`5kk(?{mpe8;5<<-!Y0)Phjk6>JPhE9I&AMi`h-Mi{vFeDh5YP ze9zR%armD6M^@KkaG>!c^XKSUEJzk}&Si;su(*p+>^y~P)SfUi4P|~vv-2&F<3k~} z_tH$fV=b-a+lioRUKYAs>%)u@I$+gl>d|lT-m9@CT-e;O20(hQo6@G zdz>meeT@s2{tG_lzeCwsm);Wb>n!K2Eb*aLhlwoX}O(Y%~ zEauYsEAhhvCDy(p97jzMbJD_U+IJqpK6luKi_EBhu2ti1>%nX>-ve(rin*0iHMqW5 zft_CMh9i8%+{oH$jGiaQUhZ*3g#%(PG_)H3$>OmC3+>Q>vBu*T`u7onm+ld9CO^{AYN;x_-Rchcu|(Wurwnw^P-nvr z{evmGA}+8i1Ctl3vmsCJppAiui!{%`y$4lU={L7Ac&>oi|X~LB!ea z%*K2JRd#({D;jSSaUWH3@k6aDJ5;tA2fRgGTY5gKtx{vZMKq!9E)f^D=n&=))nF&d zHy|%i#P#)*;N)TrR`+-XZlV2{wYH_Wf4Bx4+FFcXl0}@ETN$E^IvaR55A8{Q8`R2h z(-1Yb`*toKIVR#{Y)WxLl?r?AbS{2v5pn&;597=0!&zCWJZ!!yqWi;#@$Bv4>@Up2 zC2b;Z&In3BO@*DlAP>LM`+5Oo*hBGCH@?Zi5tQDjBq~RX1{-xO3%heg+%B~W)Tti9 z9#(;E zpTie%!Ca1@42PTOvi9pPVBoG`Zt1PV+k5}+oz2ULlt?puXk=?T!b@fYNV(0Y8@DxB$>05=!+L${dDf6ZHk$Gj3?<+?wh zNzXrDUxi&45};PI2PVDZq4wk3y5Umg6bN>x1;YdMywD9}tx~`VE5VQ0d!jq4<)*;xUnTI4SkG}S>UpGs z?(z({8%_7=wywtwm(pPFYcVLslKuI1J!Xzf2PNelFpGHR=8bqoEdxr2*g+}rr!VU< zVO%;CuJeaE#8$d%5v)_8b!iryru6o`cEa}|iO_rT0}Q6}YyDY)r!r$f=Ya-(+ezmw z0&Vfkr)cn=poJT@(t4oP4i8+3fsx0@;VVB{pA@*_|TTrT%;=zXq zn&wgYEq8|FyM#*Ed*y@hvm>oXPwmIdyA3dQ63bi~L+3UAiNf1Xb)Yaymx&kry+0j- zYjw)uN6T5^r43~NZ08AdK24>cb{XQ_qB3tEa&^;`@_4u{S;oTJ3*GRuivv^2SK%9EjV0P~sdz=Rv}} z&~ryNJkvfY`TPHl);>?n7@G}~wq2JDqxU0nJn`J)EC~GhOkz&_@`5L7_GW>*@PT9! zvGWQq^l-?A2zyTQhQ8lo>5Dt8a^XvVds7FM?~&FP41AmmE0Uy|CK9{%`(pgLT=+0x z-egVeMgQ%vdzcGb68KG%iOYv?LH_kzNbnlhG>uqb;fv?z=E6aPcTJtdZe_mccpw)P z4&*jv69??ug88HKATFD4er`YQ7qo6gt1o%5>e>6*>!?2$wQR-gPkFHQ{*wfwj@^N2 z)c;<$R$=+Y1Za`%fvKdw4nJ4ogtu|vkgtd#Bu`!$D^SKE7I@=E;nyAHZ;;sH-qA7O zoIM#QZlm;0Ekl>q1CZ5ih?~9W{@LPX*cfsEJU1ERI8SPi`^)h6qXWQM8DcX%&xu=( z&sRi)WT`&h@FD#)wZ-(a(J(1j8_Tzle{HoLT1Un}&xi@wyq)gPzP3Z7XEE@WHxAAG z$=`lr1;u@hg;|~>(USD>=m~oqrxFLB&ZuB%0Im0R9dM~!JV5ebY^U;z#;n2|+XUD> zd;lKM_*FL63GII-K-G~>@-fqX)(9sY+?@cH?>gZyalJi_XFC(%H2GQQk^V%>I%0K3 zJR~>qu`ZbIJ8hzKYmZ~0CPfY3?4t8|YnJ10lW2%@H25#xXU4e2xE-S4%?E3AcOid% zx)rK=?S)^hYfyUW-}6B8Q08P9lHTaWF6s<|X0uEiOPj$ox-ME($`Xn z55|AWfsp!%5)YF1tO6gjf0zU26Q@doiCb&D@xrVe2)B%oOr-Hde}y;N{mF(I#mSP@ z#LDOAG@P3v@g`;l`JzNK7et+W zi6-&AnZ7um%>~2M4^2O*Je$0HvCuu2_Kq($-6g&;!57C1a$$kq@227O{(W6v%reV` z5a%CF^28U0`=XatE-1f|k&GgK+wOy2a=GxUKvgoI_))zNR=m!Ecj;OZAL8_X_wG9@R$X*!n z(jT=;3!!#OkHrd_4>TNiV8Yiz*m{*Oj3D{{=kX2{EiQr?uZ9Z~Nd8w??7~>%Lr_35 zqwkRX-%bofSBgF8)#)KTLHf4Eem9COO5op^AmKlxk5)mu(a)g-gkMEM5phUi07i~2 zhEl&3!uH){|2+1`uZ4wRed33O8|B~n)Elp_&VlqJev(1d{vB4Ea7<+eNGS+`qw%ag zU;|zZOow{c&9H^|w&P|jT$2gkE=>j?Hc9rwiLC|Dkk(`oK=tbz6OLV@E8)-EcA?mr z{9X1jD51TW?j36wvp=ES$lr-*2msa&Nla`l#RpSKz}6W}aD7q~6MQ9U}oMTvd7FK&_BKkB4_pqN05H)*&c@LGAiKeqlZFUSL$y+5gzX>g%waO z-0wy5)wl=at{#T^{7hjM&F@aFBD`Tx2BNe&VYnxq58V}lmll=7!QN)!WU>cb^u*}4 zwG1{X9uqG12;;c^U^J~Lh4PFt;X`lof7JxzC;w8=eN!yF>O=9#J_ciYZYlUnN`)%K zn}S5>+*=CV@EV~n<^Owa2%5|;2Q#H+;bux-TNsKiZRK$DcbhPJEzLJuLNVlHIgB&7 zE^K$F{cGhgjC87iV@dxAOV`l+rXPl5y({1i-V<69+a3$W!qF8F>vc=`+Kud=@-Wnr zRKSe2{|e(*lYcWK9NVE15~RNfUpr9wMn>RFuPPW1KZU*2URLMB@px|~$d3Ikj9p3o zPn$5j7Fq%C*$2WK)PARf#F%oZ4E7bB6fWCL+l=*tpFd2d<^SrKBRzr}Rb@xnUjI%R?lU5JdVvIMNME zO;TVyuNvHl=VrNK>)aHmR;z-Y#6=};Xl70CC;$Kb1+Uz&c}EJ&Y%GHsdTv$khI{N% zAV#JVqKM7UxnZMg3RqZHKnC&Bi*86k2Vs3*Ib;#P9_5Y;GE(5P-C=l6TsUDZ2F_1~ zLnT>og371Vwib1dr9!`QG6<;rM--_(Pg7xl)+DQl4P(|~b#y8i4y1w%@zIO!_*o$p zax(MCh9-OP(i%K?G8x`4KMLhE{ulptM%U>{@GRgdoF{z`y1WuoF2;do%@EX}`M$Q9 z&V_5nz!bm9XhQZ$%2peco4+5_Us~Y&^>p9l{35*YAQI{#>~JT^8^>FSY7KiK!Fe^F zUPk+MM%GxX83lz?mg9gU$>+@_SpAs(r{gpSXOsLt+P(}cG7bPQ$q17@X?~5c#h5O# zXP!>MFw)mGWS?|<#lk$VkvN~mKT~A~H0_Rq31bwon##8;#u3MN#KV;q89XH-{n@(` z)3f5hoE?h0NxtqaT88H012ELj7&R#UD6ut~+ed+Cz*1CmqVay{Vk~Qng3s(?)FJz# z=#&kf-L)USSr#K8sD@?KfByqab^i4L diff --git a/client/lucy-desktop/src/renderer/public/vrma/Relax.vrma b/client/lucy-desktop/src/renderer/public/vrma/Relax.vrma deleted file mode 100644 index 8ab2fa1b8580f71930768c0d27d368f1a911f280..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118448 zcmcG$cR0NmhEEt0F68 z?-dz|tjuKmt~;;y>*b|h==c5PuddE{T<4r?pX+(z8!fi(LQQwy$AL0 zH$_kG;o%h$5*Qq!XEkh!o_mItO+$;S`X$GzJf)C zuYf*O!BUd^pSpFKije$Ydv$4DODf*2B^B@2l8Se1NyU4%q~cv$Qt`emsd(pBWylKl zZfV7Px3uEDTUznnEvHRV7|U8*RmVx3uEDTUznnEvtC%mQ}oW%PQWx zWfkw;vWoX^S;c#|tm3^}R`K2~t9b90RlIkbRJ?baRJ?baRJ?baRJ?baRJ?baRJ?ba zRJ?baRJ?baRJ?baRJ?baR=jtcR=jtcR)BX8@2n>e@Ea=+^$QI6-i7q=l?McP`F|%u z`kfHKmA5|}M3U(Sju>*-R4U&iY>RIW92Fn9N{7ZP~MX0)rf5T8H{|yTc z3@rem?b)SofvS--~Mgr7009@Vcwsu`tFzg3Z{F;xonTY;;3O{Gx36`!ho^fO9T`Tpiy zWmtr&OY|F588)FRfq#Q4!zxtmqTis(unSc!{2NpmmZ9n!{RUNrZK#UkU!zn#ke?<0 z+YPF^8b5<@&%arzEX(+ff!L)CBjHA;1VE+viM+LP)^TnhDD+g15`Db#OmL*=!lP`|Ye zmH(AO{nj>Ap7b+HC86KQungN!N$5AIGHgS2_xug24BJp$Cx3$~!!}em#9yOSx35yt z_^k|87pk98Do(#ys|?#varzCa4BJrMwtj;u!!}eGsNbN1S$Q=rE3c+y<<+!Fc{OcPUQL^nSJNit)wD@@HEmK}O`DWg(GfLE|QG!R>zdV>S}dN?@Q8%m8#B}T?r?~V5g z4#EB?4oQ)Yz;E&;FE#&qwTaI(9lQd3RGm;uOJj`M$oHS8oPSL!0sQ@}^MCVA%(2w| z*9U%8f$|+(YO=)S=MU*77A1oEulbh7cxm{NyTtN)Ui@Q#%;I|z`eT5p`S*zb#{hG) z@8R{20hXrUW7!`ABodSFk>k%1GTC=O{d0t=^t)I5Il^3mHuwu=m!Ujk(-PnQ<29tl zmS*KM5UJF{tRzDH`5I`#CGp_T5oTuQAmgS6a77~kcMmP(Zc{w8-DzKap z&cfWRoDt5#(zKir&QfAh&Io5Ila({VVYn)1gtNpTYOJa*y(Wfw1*j@gEH0<$IS=gH zb>#Tqu_OQfkgxi!Z`fFQK%gJ~Ezn;-+u^$PjnGrp=RrswM=FPZuM%f9L) zdcJ-^CDZ@<*pI*Q_wo+44-EVPi`So$-}aOT{0PUCRr2dz0iIqHyZMEL%KiU&HlS*p z{4?51)ngs&<>@C6#U};-ds?9C#{4s9Kycthe4_9p57nMk+i~y<4fXf>c?s1O|A*nS z*HASMewb9oB6w~2J|S>|SFmmH*njq?>Z$!RsM?h! zNGG%}_n((mwdwvD?dugP_mBq%{irxqtMH#0rI%K92EUI7emBiCY3(1 zstxjeLfN*gx(oj}{vXTy#HI8)s_gw2pHk+m>OcK3_Ae=_Y@tLpWgE1rjQDZ?72D&N6BDE095 z^Y;w)!p6lgNoUi}mcwySJ{BQ*JypRSzmWa#aLa0#ac5&AOJj*8{xj`tJY01r_<@7; zAG8BT-oLk0ii?r4nWcrX%v{ph(AWseEi*H`f|uqe`!_!al~t;aSc;#Djm*N_+|oj3 zW?7n#$-nuOB&f1^n46hk0dG>WEs3SM)Y8~OW>Rv@zoeo%my=36W#WxZC8lN;_(|2+ zNFtG8sUwk?{wyT3e>O8v6=(iaN-EL(k(kVX;`pC(GBGkSH

8kh&WhTl_|77C&+Q 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 diff --git a/client/lucy-desktop/src/renderer/public/vrma/Sad.vrma b/client/lucy-desktop/src/renderer/public/vrma/Sad.vrma deleted file mode 100644 index 32c9197b27e6ddbd40dc904eba0b9c63e564f06d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118448 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 diff --git a/client/lucy-desktop/src/renderer/public/vrma/Surprised.vrma b/client/lucy-desktop/src/renderer/public/vrma/Surprised.vrma deleted file mode 100644 index 23b8904e7165ac62f100186324c50ceccf41aca6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118448 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
-
-
- - Lucy - {!overlay && {error || STATUS_LABEL[status]}} -
-
- - {overlay && } - - - - -
-
- -
-
-
{ pat.current += 1 }} - title={overlay ? "Ziehen zum Verschieben · Antippen zum Streicheln" : "Antippen zum Streicheln"}> -
- - - {speaking && lastAssistant &&
{lastAssistant}
} - {!ready && ( -
- -
Lucy waermt auf …
- {!overlay &&
Die lokale Stimme wird vorbereitet — einen Moment, Commander.
} -
- )} - {overlay && (ovLinks.length > 0 || ovCode) && ( -
- {ovLinks.map((l, i) => ( -
- 🔗 {shortUrl(l)} - - -
- ))} - {ovCode && ( -
- ⌘ Code-Schnipsel - - -
- )} -
- )} - {overlay && ( -
- {busy && } - {error || STATUS_LABEL[status]} -
- )} -
-
- {!overlay && ( -
- {busy && } - {error || STATUS_LABEL[status]} -
- )} - {micBtn} - {ready && ( -
- - -
- )} - {ready && ( - - )} - {!overlay && ( -
- {inputMode === "vad" - ? <>Freisprechen aktiv{vadListening ? : null} · Leertaste geht auch · Hotkey global - : <>Halten zum Sprechen · Leertaste · Hotkey global} -
- )} -
-
- - {!overlay && ( -
-
- Gespräch - -
-
- {messages.length === 0 && ( -

Halte den Knopf (oder die Leertaste) und sprich. Lucy hört zu, denkt mit - Hermes' vollem Gedächtnis und antwortet in ihrer lokalen Stimme.

- )} - {messages.map((m, i) => ( -
- {m.role === "user" ? "Du" : "Lucy"} -
- {m.text - ? (m.role === "assistant" ? : m.text) - : } - {m.role === "assistant" && m.text && ( - - )} -
-
- ))} -
-
-
- )} -
-
- ) -} diff --git a/client/lucy-desktop/src/renderer/src/components/AuraGlow.tsx b/client/lucy-desktop/src/renderer/src/components/AuraGlow.tsx deleted file mode 100644 index f1ad2fb..0000000 --- a/client/lucy-desktop/src/renderer/src/components/AuraGlow.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { useEffect, useRef, type MutableRefObject } from "react" - -// Status-als-Licht: reaktive Aura hinter Lucy. Farbe = Status (hört zu / denkt / spricht), Intensität -// pulst mit dem Sprech-Pegel. Liest audioLevel per rAF (kein Re-Render pro Frame). -type LevelRef = MutableRefObject<{ current: number }> - -const COLORS: Record = { - warming: [120, 130, 150], idle: [125, 211, 252], listening: [56, 189, 248], - transcribing: [167, 139, 250], thinking: [251, 191, 36], speaking: [52, 211, 153], - error: [248, 113, 113], -} - -export function AuraGlow({ status, audioLevel }: { status: string; audioLevel: LevelRef }) { - const ref = useRef(null) - const statusRef = useRef(status); statusRef.current = status - const phase = useRef(0) - - useEffect(() => { - let raf = 0, last = performance.now() - const tick = (now: number) => { - const dt = Math.min(0.05, (now - last) / 1000); last = now - phase.current += dt - const el = ref.current - if (el) { - const s = statusRef.current - const [r, g, b] = COLORS[s] || COLORS.idle - const lvl = audioLevel.current?.current ?? 0 - // Grund-Puls je Status + Sprech-Reaktivität - const base = s === "thinking" || s === "transcribing" ? 0.45 + Math.sin(phase.current * 2.2) * 0.18 - : s === "listening" ? 0.55 + Math.sin(phase.current * 3) * 0.12 - : s === "speaking" ? 0.4 + Math.min(0.6, lvl * 1.8) - : s === "error" ? 0.6 - : 0.32 + Math.sin(phase.current * 1.1) * 0.06 // idle: ruhiges Atmen - const intensity = Math.max(0.15, Math.min(1, base)) - const scale = 1 + intensity * 0.18 + (s === "speaking" ? lvl * 0.25 : 0) - el.style.background = `radial-gradient(circle at 50% 42%, rgba(${r},${g},${b},${0.5 * intensity}) 0%, rgba(${r},${g},${b},${0.18 * intensity}) 32%, transparent 62%)` - el.style.transform = `scale(${scale})` - el.style.opacity = String(0.5 + intensity * 0.5) - } - raf = requestAnimationFrame(tick) - } - raf = requestAnimationFrame(tick) - return () => cancelAnimationFrame(raf) - }, [audioLevel]) - - return
-} diff --git a/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx b/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx deleted file mode 100644 index 229530f..0000000 --- a/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx +++ /dev/null @@ -1,357 +0,0 @@ -import { Canvas, useFrame } from "@react-three/fiber" -import { OrbitControls } from "@react-three/drei" -import { useEffect, useRef, useState, type MutableRefObject } from "react" -import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js" -import { Object3D, Vector3, AnimationMixer, LoopPingPong, LoopOnce, AdditiveBlending, DoubleSide, type AnimationAction } from "three" -import { VRM, VRMLoaderPlugin, VRMUtils } from "@pixiv/three-vrm" -import { VRMAnimationLoaderPlugin, createVRMAnimationClip, type VRMAnimation } from "@pixiv/three-vrm-animation" -import type { Emotion } from "../lib/voice/sentiment" - -// 3D-Avatar (VRM). BEWEGUNG: echte Mocap-Clips (.vrma) je nach Zustand, weich ueberblendet -// (Relax/LookAround im Leerlauf, Thinking beim Nachdenken). Darueber gelegt: Atmen + Sprech-Nicken -// (additiv), Lippensync (echte Vokal-Mundformen), Blick (ohne Schielen), Mimik, Blinzeln. -// Faellt sicher auf die alte prozedurale Bewegung zurueck, falls Clips nicht laden. - -type LevelRef = MutableRefObject<{ current: number; aa?: number; ih?: number; ou?: number }> -type EmotionRef = MutableRefObject -type CursorRef = MutableRefObject<{ x: number; y: number }> -type NumRef = MutableRefObject - -// Welche Clips geladen werden (Dateien unter public/vrma/, MIT-Lizenz, siehe ATTRIBUTION.md). -// Die .vrma sind GESTEN (kein echter Ruhe-Loop) -> nur fuer klare Zustaende/Einschuebe nutzen, -// nicht als Dauerschleife. Ruhiger Leerlauf laeuft prozedural. Weitere Clips liegen auf Platte bereit. -const CLIPS = ["Thinking", "Relax", "LookAround"] as const -const BREAK_CLIPS = ["Relax", "LookAround"] as const // gelegentliche Einmal-Einschuebe im Leerlauf - -const REST: Record = { - leftUpperArm: [0, 0, 1.2], rightUpperArm: [0, 0, -1.2], leftLowerArm: [0, -0.2, 0], rightLowerArm: [0, 0.2, 0], -} -function setBone(vrm: VRM, name: string, x: number, y: number, z: number) { - const b = vrm.humanoid?.getNormalizedBoneNode(name as any) - if (b) b.rotation.set(x, y, z) -} -function addBone(vrm: VRM, name: string, x: number, y: number, z: number) { - const b = vrm.humanoid?.getNormalizedBoneNode(name as any) - if (b) { b.rotation.x += x; b.rotation.y += y; b.rotation.z += z } -} -function applyRestPose(vrm: VRM) { - for (const [name, r] of Object.entries(REST)) setBone(vrm, name, r[0], r[1], r[2]) - vrm.humanoid?.update() -} - -// ADDITIVE Lebendigkeit OBEN AUF dem Clip: dezentes Atmen, Sprech-Nicken, Vorlehnen beim Zuhoeren. -// Kleine Amplituden -> ergaenzt den Clip, kaempft nicht mit ihm. -function addLife(vrm: VRM, t: number, speak: number, lean: number) { - const breathe = Math.sin(t * 1.6) - addBone(vrm, "spine", breathe * 0.012 + lean * 0.05, 0, 0) - addBone(vrm, "chest", breathe * 0.01, 0, 0) - const beat = Math.sin(t * 2.4) + Math.sin(t * 3.7) * 0.5 - const nod = speak * (0.018 * beat + 0.012 * Math.sin(t * 1.3)) - addBone(vrm, "neck", nod * 0.4 + lean * 0.03, 0, 0) - addBone(vrm, "head", nod, 0, 0) -} - -// Fallback (keine Clips): die fruehere rein prozedurale Bewegung, leicht abgespeckt. -function applyIdleProcedural(vrm: VRM, t: number, level: number, lean: number, speak: number) { - const breathe = Math.sin(t * 1.6), sway = Math.sin(t * 0.45), weight = Math.sin(t * 0.32), weight2 = Math.sin(t * 0.21 + 1) - const emph = Math.min(1, level * 1.6) - const beat = Math.sin(t * 2.4) + Math.sin(t * 3.7) * 0.5 - const nod = (emph * 0.05 + speak * 0.02) * beat + emph * Math.sin(t * 1.3) * 0.03 - const tilt = Math.sin(t * 0.7 + 0.5) * 0.03 + speak * Math.sin(t * 0.9) * 0.045 - setBone(vrm, "hips", 0, weight * 0.06, weight * 0.04 + weight2 * 0.02) - setBone(vrm, "spine", breathe * 0.03 + lean * 0.08 + speak * emph * 0.03, sway * 0.03, -weight * 0.04) - setBone(vrm, "chest", breathe * 0.025 + lean * 0.025, sway * 0.022, weight2 * 0.012) - setBone(vrm, "upperChest", breathe * 0.018, sway * 0.01, 0) - setBone(vrm, "neck", nod * 0.5, 0, tilt * 0.5) - setBone(vrm, "head", nod + Math.sin(t * 0.6) * 0.02, Math.sin(t * 0.27) * 0.035, tilt + Math.sin(t * 0.5) * 0.025) - const armSwing = Math.sin(t * 0.8) * 0.05 + speak * Math.sin(t * 1.6) * 0.045 - const lift = speak * emph * 0.07 - setBone(vrm, "leftUpperArm", -lift, 0, 1.16 + armSwing + weight * 0.05) - setBone(vrm, "rightUpperArm", -lift, 0, -1.16 - armSwing + weight * 0.05) - setBone(vrm, "leftLowerArm", 0, -0.18 - Math.sin(t * 0.8) * 0.04 - speak * 0.07, 0) - setBone(vrm, "rightLowerArm", 0, 0.18 + Math.sin(t * 0.8) * 0.04 + speak * 0.07, 0) -} - -const EXPRESSIONS = ["happy", "angry", "sad", "surprised", "relaxed"] as const -const EMO_TO_EXPR: Record = { - neutral: null, happy: "happy", angry: "angry", sad: "sad", surprised: "surprised", relaxed: "relaxed", -} - -function VrmModel({ url, audioLevel, emotion, status, cursor, pat, dance, onError }: { - url: string; audioLevel: LevelRef; emotion: EmotionRef; status: MutableRefObject - cursor?: CursorRef; pat?: NumRef; dance?: NumRef; onError: (m: string) => void -}) { - const [vrm, setVrm] = useState(null) - const smooth = useRef>({}) - const blink = useRef({ t: 0, next: 3, active: 0 }) - const speak = useRef(0) // 0..1 Sprech-Lebendigkeit - const lean = useRef(0) // 0..1 Vorlehnen (Zuhoeren/lauter Ton) - const gaze = useRef(new Object3D()) // weit entfernter Blickpunkt (gegen Schielen bei naher Kamera) - const headPos = useRef(new Vector3()) - const camPos = useRef(new Vector3()) - const camRight = useRef(new Vector3()) - const camUp = useRef(new Vector3()) - const patReact = useRef(0) // 0..1 Reaktion aufs Antippen/Streicheln - const lastPat = useRef(0) - // Bewegungs-Clips - const mixer = useRef(null) - const actions = useRef>({}) - const thinkW = useRef(0) // 0..1 Einblendung der Thinking-Pose - const sac = useRef({ x: 0, y: 0, tx: 0, ty: 0, t: 0, next: 1.5 }) // Blick-Mikrobewegung (Sakkaden) - const brk = useRef({ name: "", w: 0, t: 0, next: 15, active: false }) // gelegentlicher Bewegungs-Einschub - - useEffect(() => { - let disposed = false, loaded: VRM | null = null - const loader = new GLTFLoader() - loader.register((parser) => new VRMLoaderPlugin(parser)) - loader.load(url, (gltf) => { - if (disposed) return - const v = gltf.userData.vrm as VRM | undefined - if (!v) { onError("Datei enthaelt kein gueltiges VRM-Modell."); return } - VRMUtils.removeUnnecessaryVertices(gltf.scene) - if (v.meta?.metaVersion === "0") VRMUtils.rotateVRM0(v) - v.scene.rotation.y = Math.PI - applyRestPose(v) - loaded = v; setVrm(v) - - // Bewegungs-Clips laden + Mixer aufsetzen (additiv-frei: voller Body-Override durch den Clip) - const mx = new AnimationMixer(v.scene) - mixer.current = mx - const aLoader = new GLTFLoader() - aLoader.register((parser) => new VRMAnimationLoaderPlugin(parser)) - for (const name of CLIPS) { - aLoader.load(`/vrma/${name}.vrma`, (g) => { - if (disposed) return - const anims = g.userData.vrmAnimations as VRMAnimation[] | undefined - if (!anims?.[0]) return - const clip = createVRMAnimationClip(anims[0], v) - const action = mx.clipAction(clip) - action.timeScale = 0.85 // etwas ruhiger - action.enabled = true - action.setEffectiveWeight(0) // startet aus; blendet nur bei Bedarf ein - if (name === "Thinking") { action.setLoop(LoopPingPong, Infinity); action.play() } // laeuft immer (Gewicht 0) - else { action.setLoop(LoopOnce, 1); action.clampWhenFinished = true } // Einschub: einmal, erst bei Trigger - actions.current[name] = action - }, undefined, (e) => console.warn(`VRMA ${name} nicht geladen:`, e)) - } - }, undefined, (err) => { console.error("VRM-Load:", err); onError("Avatar konnte nicht geladen werden.") }) - return () => { - disposed = true - mixer.current?.stopAllAction(); mixer.current = null; actions.current = {} - if (loaded) VRMUtils.deepDispose(loaded.scene) - setVrm(null) - } - }, [url, onError]) - - useFrame((state, delta) => { - if (!vrm) return - const st = status.current - const tc = state.clock.elapsedTime - const target = audioLevel.current?.current ?? 0 - const spk = (speak.current += (((st === "speaking") ? 1 : 0) - speak.current) * Math.min(1, delta * 4)) - const attentive = st === "listening" ? 1 : 0 - lean.current += ((Math.min(1, target * 1.6) + attentive * 0.5) - lean.current) * Math.min(1, delta * 3) - - // Bewegung: ruhiger PROZEDURALER Leerlauf als Basis. Echte Clips blenden zustandsabhaengig ein: - // Thinking beim Nachdenken (Dauer) + gelegentliche Einmal-Einschuebe im Leerlauf (Strecken/Umschauen - // alle ~20-35s, dann zurueck in die Ruhe). Die .vrma sind Gesten -> nie als Dauerschleife. - const mx = mixer.current - const thinkAction = mx ? actions.current["Thinking"] : undefined - const calm = st === "idle" - const wantThink = (st === "thinking" || st === "transcribing") ? 1 : 0 - const br = brk.current - // Einschub planen: nur wenn ruhig + keiner laeuft; Timer zuruecksetzen, sobald nicht mehr ruhig - if (mx && !br.active) { - if (calm) { - br.t += delta - if (br.t > br.next) { - const pick = BREAK_CLIPS[Math.floor(Math.random() * BREAK_CLIPS.length)] - const a = actions.current[pick] - if (a) { a.reset(); a.play(); br.name = pick; br.active = true; br.w = 0 } - br.t = 0; br.next = 20 + Math.random() * 15 - } - } else { br.t = 0 } - } - thinkW.current += (wantThink - thinkW.current) * Math.min(1, delta * 4) - thinkAction?.setEffectiveWeight(thinkW.current) - // Einschub-Gewicht: ausblenden, wenn nicht mehr ruhig / Nachdenken startet / Clip fast zu Ende - if (br.active) { - const a = actions.current[br.name] - const dur = a?.getClip().duration ?? 1 - const finishing = !calm || wantThink === 1 || (a ? a.time >= dur - 0.4 : true) - br.w += ((finishing ? 0 : 1) - br.w) * Math.min(1, delta * 3) - a?.setEffectiveWeight(br.w) - if (finishing && br.w < 0.02) { a?.stop(); br.active = false; br.name = "" } - } - if (mx) mx.update(delta) - if (thinkW.current > 0.05 || (br.active && br.w > 0.05)) { - addLife(vrm, tc, spk, lean.current) // Clip-Pose + Atmen/Nicken obendrauf - } else { - applyIdleProcedural(vrm, tc, target, lean.current, spk) // ruhiger Leerlauf - } - // MateEngine-Idee: Kopf dreht sich dezent zum Mauszeiger (Augen folgen unten im lookAt-Block) - const cur = cursor?.current - if (cur) { - const hx = Math.max(-1, Math.min(1, cur.x)), hy = Math.max(-1, Math.min(1, cur.y)) - addBone(vrm, "neck", -hy * 0.06, hx * 0.10, 0) - addBone(vrm, "head", -hy * 0.08, hx * 0.14, 0) - } - // Antippen/Streicheln: kurze freudige Reaktion (Kopf-Wackeln; Laecheln in der Mimik unten) - if (pat && pat.current !== lastPat.current) { lastPat.current = pat.current; patReact.current = 1 } - patReact.current *= Math.max(0, 1 - delta * 1.4) - if (patReact.current > 0.01) addBone(vrm, "head", -patReact.current * 0.05, 0, Math.sin(tc * 18) * patReact.current * 0.06) - // Tanzen zur Musik: rhythmische Ganzkoerper-Bewegung, skaliert mit der Bass-Energie - const dl = dance?.current ?? 0 - if (dl > 0.03) { - const bt = tc * 5.5 - addBone(vrm, "hips", 0, Math.sin(bt * 0.5) * 0.14 * dl, Math.sin(bt) * 0.07 * dl) - addBone(vrm, "spine", 0, Math.sin(bt * 0.5) * 0.06 * dl, Math.sin(bt) * 0.06 * dl) - addBone(vrm, "chest", 0, 0, Math.sin(bt + 0.5) * 0.05 * dl) - addBone(vrm, "head", Math.sin(bt) * 0.05 * dl, Math.sin(bt * 0.5) * 0.05 * dl, Math.sin(bt) * 0.05 * dl) - addBone(vrm, "leftUpperArm", 0, 0, Math.sin(bt) * 0.3 * dl) - addBone(vrm, "rightUpperArm", 0, 0, -Math.sin(bt) * 0.3 * dl) - vrm.scene.position.y = Math.abs(Math.sin(bt)) * 0.05 * dl // Huepfen - } else if (vrm.scene.position.y !== 0) { - vrm.scene.position.y += (0 - vrm.scene.position.y) * Math.min(1, delta * 5) - } - - // Blick: weit entfernter Punkt in Kamerarichtung -> Augen parallel (kein Schielen), wirkt "auf dich". - if (vrm.lookAt) { - const headNode = vrm.humanoid?.getNormalizedBoneNode("head") - const hp = headPos.current - if (headNode) headNode.getWorldPosition(hp); else hp.set(0, 1.3, 0) - const cp = camPos.current.copy(state.camera.position) - gaze.current.position.copy(cp).sub(hp).multiplyScalar(4).add(hp) - // Augen folgen dem Mauszeiger: Blickpunkt in Kamera-Rechts/Hoch-Richtung verschieben - if (cur) { - const e = state.camera.matrixWorld.elements - camRight.current.set(e[0], e[1], e[2]).normalize() - camUp.current.set(e[4], e[5], e[6]).normalize() - const cx = Math.max(-1.5, Math.min(1.5, cur.x)), cy = Math.max(-1.5, Math.min(1.5, cur.y)) - gaze.current.position.addScaledVector(camRight.current, cx * 1.8) - gaze.current.position.addScaledVector(camUp.current, cy * 1.8) - } - // dezente Blick-Mikrobewegung (Sakkaden) -> das Gesicht wirkt nicht eingefroren - const s = sac.current - s.t += delta - if (s.t > s.next) { - s.tx = (Math.random() - 0.5) * 0.22; s.ty = (Math.random() - 0.5) * 0.12 - s.t = 0; s.next = 0.8 + Math.random() * 2.4 - } - s.x += (s.tx - s.x) * Math.min(1, delta * 10) - s.y += (s.ty - s.y) * Math.min(1, delta * 10) - gaze.current.position.x += s.x; gaze.current.position.y += s.y - vrm.lookAt.target = gaze.current - } - - const em = vrm.expressionManager - if (em) { - // Lippensync v2: echte Vokal-Mundformen (aa/ih/ou) aus der Audio-Analyse statt nur "Mund auf". - const lv = audioLevel.current - const visTargets: Record = { aa: lv?.aa ?? target, ih: lv?.ih ?? 0, ou: lv?.ou ?? 0 } - for (const v of ["aa", "ih", "ou"]) { - const cv = smooth.current[v] ?? 0 - const nv = cv + (visTargets[v] - cv) * Math.min(1, delta * 14) - smooth.current[v] = nv; em.setValue(v, nv) - } - const want = EMO_TO_EXPR[emotion.current] - for (const name of EXPRESSIONS) { - const tv = want === name ? 0.75 : 0 - const cv = smooth.current[name] ?? 0 - const nv = cv + (tv - cv) * Math.min(1, delta * 4) - smooth.current[name] = nv; em.setValue(name, nv) - } - // kurze passende Mimik waehrend eines Bewegungs-Einschubs (Laecheln beim Strecken) - if (brk.current.active) { - const expr = brk.current.name === "Relax" ? "happy" : "relaxed" - em.setValue(expr, Math.max(smooth.current[expr] ?? 0, brk.current.w * 0.35)) - } - // Streichel-Reaktion: Laecheln - if (patReact.current > 0.01) em.setValue("happy", Math.max(smooth.current.happy ?? 0, patReact.current * 0.85)) - const b = blink.current - b.t += delta - if (b.active <= 0 && b.t > b.next) { b.active = 0.16; b.t = 0; b.next = 3 + Math.random() * 4 } - let blinkVal = 0 - if (b.active > 0) { b.active -= delta; const p = 1 - b.active / 0.16; blinkVal = 1 - Math.abs(p - 0.5) * 2 } - em.setValue("blink", Math.max(0, blinkVal)) - } - vrm.update(delta) - }) - - return vrm ? : null -} - -// Hologramm-Beiwerk: Projektor-Sockel (Glow-Ringe am Boden) + schwebender Kristall daneben. -// Reine Additiv-Meshes -> berühren die VRM-Materialien NICHT (voll reversibel per Toggle). -function HoloRig() { - const ringA = useRef(null), ringB = useRef(null), crystal = useRef(null) - useFrame((s, d) => { - const t = s.clock.elapsedTime - if (ringA.current) ringA.current.rotation.z += d * 0.3 - if (ringB.current) ringB.current.rotation.z -= d * 0.55 - if (crystal.current) { - crystal.current.rotation.y += d * 1.1 - crystal.current.rotation.x = Math.sin(t * 0.8) * 0.3 - crystal.current.position.y = 1.18 + Math.sin(t * 1.6) * 0.04 - } - }) - const cyan = "#4fd8ff" - return ( - - {/* Projektor-Sockel: weicher Glow-Disc + zwei rotierende Ringe am Boden (Fuesse bei y=0) */} - - - - - - {/* schwebender Kristall neben ihr (Schulterhoehe) */} - - - - - - ) -} - -export function Avatar3D({ url, audioLevel, emotion, status = "idle", cursor, pat, dance, controls = true }: { - url: string; audioLevel: LevelRef; emotion: EmotionRef; status?: string - cursor?: CursorRef; pat?: NumRef; dance?: NumRef; controls?: boolean -}) { - const [err, setErr] = useState(null) - const [holo, setHolo] = useState(() => localStorage.getItem("lucy_holo") !== "0") // Hologramm-Look, Standard: an - const statusRef = useRef(status); statusRef.current = status - const toggleHolo = () => setHolo((h) => { const n = !h; localStorage.setItem("lucy_holo", n ? "1" : "0"); return n }) - return ( -
- - {holo ? ( - <> - - {/* Rim von hinten -> Silhouetten-Glow */} - - - - ) : ( - <> - - - - - )} - - {controls && ( - - )} - - {holo && (<>
)} - - {err && ( -
{err}
- )} -
- ) -} diff --git a/client/lucy-desktop/src/renderer/src/components/ChatMarkdown.tsx b/client/lucy-desktop/src/renderer/src/components/ChatMarkdown.tsx deleted file mode 100644 index ce4f52b..0000000 --- a/client/lucy-desktop/src/renderer/src/components/ChatMarkdown.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { useState, type ReactNode } from "react" -import ReactMarkdown from "react-markdown" -import remarkGfm from "remark-gfm" - -// Chat-Markdown fuer Lucys Antworten: Code-Bloecke mit Kopier-Knopf, Links oeffnen im System-Browser, -// gaengige Formatierung (fett/listen/inline-code). Die STIMME liest davon nichts vor — cleanForTTS -// filtert Code/Links vorm Sprechen; hier geht es rein um die lesbare/kopierbare Anzeige. - -function CopyBtn({ text, label = "Kopieren" }: { text: string; label?: string }) { - const [done, setDone] = useState(false) - return ( - - ) -} - -function nodeText(children: ReactNode): string { - if (children == null) return "" - if (typeof children === "string" || typeof children === "number") return String(children) - if (Array.isArray(children)) return children.map(nodeText).join("") - // @ts-expect-error – React-Element-Kinder - if (children?.props?.children) return nodeText(children.props.children) - return "" -} - -export function ChatMarkdown({ text }: { text: string }) { - return ( -
- ( - { e.preventDefault(); if (href) void window.lucy?.openExternal(href) }}> - {children} - - ), - // pre durchreichen -> der Code-Block baut seinen eigenen Container (kein
in
)
-          pre: ({ children }) => <>{children},
-          code: ({ className, children, ...props }) => {
-            const raw = nodeText(children).replace(/\n$/, "")
-            const isBlock = /language-/.test(className || "") || raw.includes("\n")
-            if (!isBlock) return {children}
-            const lang = (className || "").replace(/language-/, "") || "code"
-            return (
-              
-
{lang}
-
{children}
-
- ) - }, - }} - >{text} -
- ) -} diff --git a/client/lucy-desktop/src/renderer/src/config.ts b/client/lucy-desktop/src/renderer/src/config.ts deleted file mode 100644 index 3ad0584..0000000 --- a/client/lucy-desktop/src/renderer/src/config.ts +++ /dev/null @@ -1,58 +0,0 @@ -// Zentrale Endpunkte. Hirn + STT laufen auf der BOX (wie die WebUI), die Stimme LOKAL (pocket-tts, CPU). -export const BOX_URL = "http://192.168.178.151:9001" // MC2-Backend: /api/voice/stt, /api/voice/chat -export const TTS_URL = "http://127.0.0.1:8130" // lokaler Lucy-TTS (pocket-tts, vom Main-Prozess gespawnt) - -// Persona/Anrede: Lucy spricht den Nutzer als "Commander" an. ECHTE Umlaute erzwingen (sonst klingt TTS grausam). -export const SYSTEM_PROMPT = - "Du bist Lucy, eine gesprochene Assistentin, und redest den Nutzer mit „Commander“ an. " + - "Antworte natürlich, locker und mit etwas Persönlichkeit — du darfst ruhig ein bisschen chatty und frech sein, " + - "aber bleib FOKUSSIERT: in der Regel 2 bis 3 Sätze. Beantworte die Frage direkt (gern mit einer kleinen menschlichen " + - "Note) und hol dann nicht unnötig aus. Keine ungefragten Meta-Kommentare, Warnungen oder Wiederholungen. " + - "Ausführlich nur, wenn ausdrücklich gewünscht. " + - "TOOLS: Du DARFST und SOLLST Tools/Skills nutzen, wenn sie wirklich helfen (Live-Daten wie Wetter, " + - "Gedächtnis-/Gehirn-Zugriff, echte Analyse). Aber NICHT für Triviales, das du eh weißt (Uhrzeit, " + - "Smalltalk, Allgemeinwissen) — da antworte direkt. Ketten NIEMALS mehrere Tools wild aneinander oder " + - "probier herum (kein SSH + Screenshot + Shell für eine simple Info). Wenn ein Tool länger dauert, sag " + - "kurz Bescheid, bevor du es nutzt (z. B. „Moment, das schau ich kurz nach, Commander.“), dann liefere das Ergebnis. " + - "In Terminal-Befehlen IMMER vollständige URLs mit https:// schreiben (z. B. https://wttr.in/...) und bei " + - "Netz-Abrufen ein kurzes Timeout setzen (curl: --max-time 8) — sonst hängt der Befehl oder wird vom " + - "Sicherheits-Scan aufgehalten. " + - "WICHTIG für die Sprachausgabe: Beginne mit einem KURZEN ersten Satz (nur wenige Wörter, z. B. " + - "„Na klar, Commander!“). Fasse dich kurz und komm auf den Punkt — JEDES Satzzeichen (Komma wie Punkt) " + - "wird als hörbare Pause gesprochen, je weniger Wörter und Satzzeichen, desto flüssiger. Vermeide vor " + - "allem lange Komma-Ketten und Schachtelsätze; zwei, drei knappe Aussagen reichen. Also lieber " + - "„Das Backup lief durch. Keine Fehler. Alles stabil.“ statt „Das Backup ist durchgelaufen, es gab " + - "keine Fehler, und alles läuft stabil.“. Kurze Sätze starten sofort hörbar und klingen sauberer. " + - "Halte den gesprochenen Teil in reinem Fließtext (keine Aufzählungszeichen, keine Emojis). " + - "NUR wenn der Commander ausdrücklich nach Code, Befehlen oder einem Link fragt, gib diese im Text aus — " + - "Code in Markdown-Codeblöcken (```), Links als vollständige URL. Diese werden angezeigt, aber NICHT vorgelesen; " + - "sprich dann nur eine kurze Einleitung dazu (z. B. „Hier ist das Skript, Commander.“). " + - "Verwende IMMER echte deutsche Umlaute (ä, ö, ü, ß) und NIEMALS ae, oe, ue oder ss als Ersatz. " + - "Schreibe Zahlen, Modellbezeichnungen und Abkürzungen EXAKT und normal (z. B. „RX 9070 XT“, „4 GB“, " + - "„25 Grad“) — schreibe Ziffern NIEMALS als Wörter aus und interpretiere sie nicht als Komma-/Dezimalzahlen. " + - "Nenne beim Sprechen KEINE Zeitzonen-Codes (UTC, CET, GMT o.ä.) und keine technischen Zeit-Zusätze — " + - "sag einfach die lokale Uhrzeit natürlich (z. B. „Es ist 19 Uhr 21, Commander.“). " + - "Du kannst optional GANZ AM ENDE deiner Antwort einen Stimmungs-Tag anhängen: , , " + - ", , oder . Er wird nicht angezeigt oder vorgelesen " + - "und steuert nur deinen Gesichtsausdruck — wähle ihn passend zum Inhalt deiner Antwort." - -declare global { - interface Window { - lucy?: { - minimize: () => Promise - close: () => Promise - setMode: (m: "full" | "overlay") => Promise<"full" | "overlay"> - getMode: () => Promise<"full" | "overlay"> - togglePin: () => Promise - onMode: (cb: (m: "full" | "overlay") => void) => () => void - onHotkey: (cb: () => void) => () => void - onCursor: (cb: (p: { x: number; y: number }) => void) => () => void - captureScreen: () => Promise - listWindows: () => Promise<{ id: string; name: string }[]> - captureWindow: (id: string) => Promise - captureByName: (q: string) => Promise<{ name: string; image: string } | null> - openExternal: (url: string) => Promise - setClickThrough: (on: boolean) => Promise - } - } -} diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/audio.ts b/client/lucy-desktop/src/renderer/src/lib/voice/audio.ts deleted file mode 100644 index f7a3921..0000000 --- a/client/lucy-desktop/src/renderer/src/lib/voice/audio.ts +++ /dev/null @@ -1,175 +0,0 @@ -// Audio-Wiedergabe + Pegelmessung fuers Lippensync (Avatar liest level.current). -// Zwei Wege: enqueue(WAV-Buffer) [z.B. Warmup] und playPcmStream(PCM16-Stream) [die Live-Antwort, -// lueckenlos via Web-Audio-Scheduling, niedrige Time-to-first-audio]. -// -// LIPPENSYNC v2: statt nur einem Pegel ("Mund auf/zu") leiten wir aus dem Frequenz-Spektrum -// echte Vokal-MUNDFORMEN ab (level.aa/ih/ou). Idee: die Helligkeit des Klangs (spektraler -// Schwerpunkt) verraet grob den Vokal — helle Laute (i/e) = breiter Mund, dunkle (o/u) = runder -// Mund, mittig = offenes "a". Das ist nicht phonetisch exakt, sieht aber lebendig+passend aus. -function smoothstep(a: number, b: number, x: number): number { - const t = Math.max(0, Math.min(1, (x - a) / (b - a))) - return t * t * (3 - 2 * t) -} - -export class AudioQueue { - private ctx: AudioContext - private analyser: AnalyserNode - private gain: GainNode - private queue: ArrayBuffer[] = [] - private playing = false - private raf = 0 - private freq: Uint8Array - // aktiver PCM-Stream (fuer Barge-in/clear): geplante Quellen + Abbruchsignal - private streamSources: AudioBufferSourceNode[] = [] - private streamCancelled = false - // current = Gesamt-Pegel (Aura/Bewegung); aa/ih/ou = Mundform-Gewichte fuer den Avatar - readonly level = { current: 0, aa: 0, ih: 0, ou: 0 } - onSpeaking?: (speaking: boolean) => void - - static readVolume(): number { - const raw = localStorage.getItem("lucy_volume") - if (raw === null || raw === "") return 0.8 - const v = Number(raw) - return Number.isNaN(v) ? 0.8 : Math.max(0, Math.min(1.5, v)) - } - - constructor() { - const Ctor = window.AudioContext || (window as any).webkitAudioContext - this.ctx = new Ctor() - this.analyser = this.ctx.createAnalyser() - this.analyser.fftSize = 256 - this.analyser.smoothingTimeConstant = 0.6 - this.gain = this.ctx.createGain() - this.gain.gain.value = AudioQueue.readVolume() - this.analyser.connect(this.gain) - this.gain.connect(this.ctx.destination) - this.freq = new Uint8Array(this.analyser.frequencyBinCount) - window.addEventListener("lucy-volume", (e: Event) => { - const v = Number((e as CustomEvent).detail) - if (!Number.isNaN(v)) this.gain.gain.value = Math.max(0, Math.min(1.5, v)) - }) - } - - async enqueue(buf: ArrayBuffer) { - this.queue.push(buf) - if (!this.playing) await this.playNext() - } - - clear() { - this.queue = [] - // laufenden Stream stoppen (Barge-in) - this.streamCancelled = true - for (const s of this.streamSources) { try { s.stop() } catch { /* */ } } - this.streamSources = [] - } - - // Spielt einen fortlaufenden PCM16-mono-Stream lueckenlos ab: jede Frame-Charge wird auf der - // Audio-Uhr direkt hinter die vorige geplant (kein onended-Gap). LEAD_IN puffert gegen Underruns. - async playPcmStream(stream: ReadableStream, sampleRate: number): Promise { - if (this.ctx.state === "suspended") { try { await this.ctx.resume() } catch { /* */ } } - this.streamCancelled = false - this.streamSources = [] - const reader = stream.getReader() - const LEAD_IN = 0.35 // Startpuffer: mehr Vorlauf -> Generierung bleibt vor der Wiedergabe (weniger Unterläufe/Stocken) - let nextTime = 0, started = false, leftoverByte = -1, lastEnd = 0 - this.onSpeaking?.(true) - this.startMeter() - try { - for (;;) { - const { done, value } = await reader.read() - if (done || this.streamCancelled) break - if (!value || value.length === 0) continue - // ungerades Rest-Byte der vorigen Charge voranstellen, damit Int16-Frames sauber bleiben - let bytes: Uint8Array - if (leftoverByte >= 0) { - bytes = new Uint8Array(value.length + 1) - bytes[0] = leftoverByte - bytes.set(value, 1) - } else { - bytes = value - } - const usable = bytes.length - (bytes.length % 2) - leftoverByte = usable < bytes.length ? bytes[bytes.length - 1] : -1 - if (usable === 0) continue - // in ein eigenes, 2-Byte-ausgerichtetes Buffer kopieren (value.byteOffset evtl. ungerade) - const aligned = new Uint8Array(usable) - aligned.set(bytes.subarray(0, usable)) - const i16 = new Int16Array(aligned.buffer) - const f32 = new Float32Array(i16.length) - for (let i = 0; i < i16.length; i++) f32[i] = i16[i] / 32768 - const audioBuf = this.ctx.createBuffer(1, f32.length, sampleRate) - audioBuf.copyToChannel(f32, 0) - const src = this.ctx.createBufferSource() - src.buffer = audioBuf - src.connect(this.analyser) - if (!started) { nextTime = this.ctx.currentTime + LEAD_IN; started = true } - if (nextTime < this.ctx.currentTime) nextTime = this.ctx.currentTime + 0.02 // Underrun-Schutz - src.start(nextTime) - this.streamSources.push(src) - src.onended = () => { - const i = this.streamSources.indexOf(src) - if (i >= 0) this.streamSources.splice(i, 1) - } - nextTime += audioBuf.duration - lastEnd = nextTime - } - } finally { - try { reader.releaseLock() } catch { /* */ } - } - // bis zum Ende der letzten geplanten Charge warten (sofern nicht abgebrochen) - if (!this.streamCancelled) { - const waitMs = Math.max(0, (lastEnd - this.ctx.currentTime) * 1000) - await new Promise((r) => setTimeout(r, waitMs + 60)) - } - this.onSpeaking?.(false) - this.stopMeter() - } - - private async playNext(): Promise { - const buf = this.queue.shift() - if (!buf) { this.playing = false; this.stopMeter(); this.onSpeaking?.(false); return } - this.playing = true - this.onSpeaking?.(true) - if (this.ctx.state === "suspended") { try { await this.ctx.resume() } catch { /* */ } } - let audioBuf: AudioBuffer - try { audioBuf = await this.ctx.decodeAudioData(buf.slice(0)) } catch { return this.playNext() } - const src = this.ctx.createBufferSource() - src.buffer = audioBuf - src.connect(this.analyser) - src.onended = () => { void this.playNext() } - src.start() - this.startMeter() - } - - private startMeter() { - cancelAnimationFrame(this.raf) - const tick = () => { - this.analyser.getByteFrequencyData(this.freq as any) - const n = Math.min(this.freq.length, 48) - let sum = 0, wsum = 0 - for (let i = 2; i < n; i++) { const m = this.freq[i]; sum += m; wsum += m * i } - const avg = sum / (n - 2) / 255 - const open = Math.min(1, avg * 1.9) - this.level.current = open - // Spektraler Schwerpunkt 0..1 (wo sitzt die Klang-Energie) -> grobe Vokal-Form - const c = sum > 0 ? wsum / sum : 2 - const cN = Math.max(0, Math.min(1, (c - 2) / (n - 2))) - const bright = smoothstep(0.42, 0.72, cN) // hell -> i/e (breiter Mund) - const dark = 1 - smoothstep(0.22, 0.5, cN) // dunkel -> o/u (runder Mund) - const ih = open * bright - const ou = open * dark - const aa = open * (1 - Math.max(bright, dark) * 0.85) // sonst offenes "a" - // leichte Glaettung gegen Flackern - this.level.aa += (aa - this.level.aa) * 0.5 - this.level.ih += (ih - this.level.ih) * 0.5 - this.level.ou += (ou - this.level.ou) * 0.5 - this.raf = requestAnimationFrame(tick) - } - tick() - } - - private stopMeter() { - cancelAnimationFrame(this.raf) - this.level.current = 0; this.level.aa = 0; this.level.ih = 0; this.level.ou = 0 - } -} diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/perf.ts b/client/lucy-desktop/src/renderer/src/lib/voice/perf.ts deleted file mode 100644 index 7e6e3da..0000000 --- a/client/lucy-desktop/src/renderer/src/lib/voice/perf.ts +++ /dev/null @@ -1,8 +0,0 @@ -// Perf-Diagnose (Client): Zeit pro Stufe ab „Mikro losgelassen". Opt-in via localStorage lucy_perf=1. -// NUR Console (kein POST an den pocket_server — der generiert Audio; POSTs mittendrin -// verursachten hakelige Sprachausgabe). (Aus useVoiceAgent extrahiert, Review P2-13a.) - -export const PERF = typeof localStorage !== "undefined" && localStorage.getItem("lucy_perf") === "1" - -export function plogSend(msg: string) { if (PERF) console.log(`[lucy-perf] ${msg}`) } -export function plog(label: string, ms: number) { plogSend(`${label} = ${Math.round(ms)}ms`) } diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/sentiment.ts b/client/lucy-desktop/src/renderer/src/lib/voice/sentiment.ts deleted file mode 100644 index 10d781e..0000000 --- a/client/lucy-desktop/src/renderer/src/lib/voice/sentiment.ts +++ /dev/null @@ -1,14 +0,0 @@ -// Leichtgewichtige Stimmungs-Heuristik → treibt Lucys Mimik. Regelbasiert (kein Modell). -export type Emotion = "neutral" | "happy" | "angry" | "sad" | "surprised" | "relaxed" - -const RULES: [Emotion, RegExp][] = [ - ["happy", /(super|toll|klasse|freu|cool|prima|perfekt|danke|großartig|wunderbar|gerne|haha)/i], - ["surprised", /(wow|wirklich\?|krass|unglaublich|echt\?|tatsächlich|\?!|!\?|oha)/i], - ["angry", /(fehler|kaputt|mist|verdammt|nervt|schlecht|problem|ärgerlich|leider nicht|geht nicht)/i], - ["sad", /(leider|schade|traurig|tut mir leid|entschuldigung|sorry|bedauere)/i], -] - -export function sentimentToEmotion(text: string): Emotion { - for (const [emo, rx] of RULES) if (rx.test(text)) return emo - return "neutral" -} diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/textPipeline.ts b/client/lucy-desktop/src/renderer/src/lib/voice/textPipeline.ts deleted file mode 100644 index fc31c21..0000000 --- a/client/lucy-desktop/src/renderer/src/lib/voice/textPipeline.ts +++ /dev/null @@ -1,74 +0,0 @@ -// Pure Text-Verarbeitung für den Voice-Loop (aus useVoiceAgent extrahiert, Review P2-13a). -// Alles hier ist zustandslos und einzeln testbar — der Hook orchestriert nur noch. - -// Hermes schreibt manchmal ASCII-Umlaute (ue/ae/oe/ss) statt ä/ö/ü/ß -> pocket-tts liest die falsch vor. -// Gezielt häufige UMLAUT-Stämme zurückwandeln. KONSERVATIV: nur Muster, bei denen ASCII fast immer ein -// Umlaut ist (echte "ue"-Wörter wie aktuell/neue/Quelle bleiben unangetastet — die sind hier NICHT gelistet). -const UMLAUT_FIX: [RegExp, string][] = [ - [/ueber/gi, "über"], [/\bfuer\b/gi, "für"], [/natuerlich/gi, "natürlich"], [/zurueck/gi, "zurück"], - [/unterstuetz/gi, "unterstütz"], [/ueberpruef/gi, "überprüf"], [/\bpruef/gi, "prüf"], [/gefuehl/gi, "gefühl"], - [/\bfuehl/gi, "fühl"], [/\bfuehr/gi, "führ"], [/\bfuenf/gi, "fünf"], [/\bgruen/gi, "grün"], [/\bfrueh/gi, "früh"], - [/\bglueck/gi, "glück"], [/\bstueck/gi, "stück"], [/gemuetlich/gi, "gemütlich"], [/verfueg/gi, "verfüg"], - [/\bmoecht/gi, "möcht"], [/\bkoenn/gi, "könn"], [/\bwuerd/gi, "würd"], [/\bmuess/gi, "müss"], [/\bduerf/gi, "dürf"], - [/\bhaett/gi, "hätt"], [/\bwaer/gi, "wär"], [/\bspaet/gi, "spät"], - [/\btaeglich/gi, "täglich"], [/\bnaechst/gi, "nächst"], [/\baehnlich/gi, "ähnlich"], [/waehrend/gi, "während"], - [/\bwaehl/gi, "wähl"], [/erklaer/gi, "erklär"], [/\bschoen/gi, "schön"], [/\bgroess/gi, "größ"], [/\bhoer/gi, "hör"], - [/\boeffn/gi, "öffn"], [/\bboese/gi, "böse"], [/\bloesch/gi, "lösch"], [/\bstoer/gi, "stör"], [/koennt/gi, "könnt"], - // erweitert (30.06.): weitere häufige Stämme + sicheres -ität-Suffix. KONSERVATIV gewählt; - // der TTS-Server (_fix_umlauts) hat zusätzlich ein Netz. neu/aktuell/Steuer/Feuer bleiben unberührt. - [/itaet/gi, "ität"], - [/\bmoeglich/gi, "möglich"], [/gespraech/gi, "gespräch"], [/\bmaerz/gi, "märz"], - [/geschaeft/gi, "geschäft"], [/gefaehr/gi, "gefähr"], [/\bhaeng/gi, "häng"], [/\blaeng/gi, "läng"], - [/\bmaenner/gi, "männer"], [/\bmaedchen/gi, "mädchen"], [/\bvaeter/gi, "väter"], [/\btraeum/gi, "träum"], - [/\bsaetz/gi, "sätz"], [/\bplaetz/gi, "plätz"], [/\bkaelte/gi, "kälte"], [/\bzaehl/gi, "zähl"], - [/\baerg/gi, "ärg"], [/\baerzt/gi, "ärzt"], [/aeusser/gi, "äußer"], - [/\btuer/gi, "tür"], [/\bkueche/gi, "küche"], [/buech/gi, "büch"], [/\bbuero/gi, "büro"], [/\bbuerg/gi, "bürg"], - [/\bsued/gi, "süd"], [/schueler/gi, "schüler"], [/uebung/gi, "übung"], [/kuenstl/gi, "künstl"], - [/\bmuede/gi, "müde"], [/\bmuell/gi, "müll"], [/\bdrueck/gi, "drück"], [/stuetz/gi, "stütz"], - [/\bmoebel/gi, "möbel"], [/loes/gi, "lös"], [/voellig/gi, "völlig"], [/zwoelf/gi, "zwölf"], - [/\bkoenig/gi, "könig"], [/\bhoeh/gi, "höh"], [/\bdoerf/gi, "dörf"], [/\bwoert/gi, "wört"], -] -export function restoreUmlauts(s: string): string { - let out = s - for (const [re, rep] of UMLAUT_FIX) out = out.replace(re, rep as string) - return out -} - -// Optionaler Stimmungs-Tag, den Hermes ans Ende haengen kann ( ...). Steuert NUR den -// Gesichtsausdruck -> wird vor Anzeige UND vor dem Vorlesen entfernt. Fallback = Sentiment-Heuristik. -export const EMO_TAG = //i -export function stripEmoTag(s: string): string { return s.replace(//gi, "").trimEnd() } - -// Hermes hängt bei selbst erzeugten Medien (z.B. eigener Screenshot via pc-control) einen Roh-Token -// „MEDIA:" an. Das ist weder Sprech- noch Anzeigetext -> überall entfernen (bis Medien echt -// gerendert werden). Betrifft auch Lucys eigene Bildschirm-Sicht, die den Screenshot ohnehin schon liefert. -export function stripMedia(s: string): string { - return s.replace(/\bMEDIA:\S+/gi, "").replace(/[ \t]{2,}/g, " ").replace(/[ \t]+\n/g, "\n").trimEnd() -} - -export function cleanForTTS(s: string): string { - return restoreUmlauts(s) - .replace(/```[\s\S]*?```/g, " ").replace(/`([^`]*)`/g, "$1") - .replace(/\[([^\]]+)\]\([^)]+\)/g, "$1") - .replace(/\bMEDIA:\S+/gi, " ") - // Zeitzonen-Codes (UTC/CET/GMT…) + evtl. angehängte Zeit: Pocket mangelt die Akronyme zu - // Kauderwelsch -> aus der Stimme entfernen (Anzeige behält sie). Lucy sagt die lokale Zeit ohnehin. - .replace(/\b(?:UTC|GMT|CET|CEST|MEZ|MESZ|PST|PDT|EST|EDT)\b\s*[+\-]?\d{0,2}(?::\d{2})?/gi, " ") - // Zahlen/Uhrzeiten (18:01 -> „achtzehn Uhr eins", 2026 -> „zweitausend…") normalisiert jetzt - // der lokale pocket_server (text_norm.py, num2words) — kontextsicher (Modellnummern bleiben). - .replace(/https?:\/\/\S+/gi, " ").replace(/www\.\S+/gi, " ").replace(/\b\S+@\S+\.\S+\b/g, " ") - .replace(/[*_#>~|`]+/g, " ").replace(/^\s*[-•·]\s+/gm, " ") - .replace(/\s*&\s*/g, " und ") - .replace(/(\d)\s*%/g, "$1 Prozent").replace(/%/g, " Prozent ") - .replace(/(\d)\s*°\s*C?/g, "$1 Grad").replace(/°/g, " Grad ") - .replace(/\s*=\s*/g, " gleich ").replace(/\s*\/\s*/g, " ") - .replace(/[\u{1F300}-\u{1FAFF}\u{2600}-\u{27BF}\u{2190}-\u{21FF}\u{2B00}-\u{2BFF}]/gu, "") - .replace(/\s+/g, " ").trim() -} - -// FRISCHE Session pro App-Start (NICHT in localStorage persistieren). Sonst wächst der Hermes-Verlauf -// über alle Starts hinweg unbegrenzt (gesehen: 97k+ Tokens) -> Degeneration/Wiederhol-Schleifen. -// Dauerhaftes Gedächtnis liegt ohnehin in Mem0 (sessionunabhängig) -> Continuity bleibt erhalten. -export function newSessionId(): string { - return "lucy-" + Math.random().toString(36).slice(2) + Date.now().toString(36) -} diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/useDanceAudio.ts b/client/lucy-desktop/src/renderer/src/lib/voice/useDanceAudio.ts deleted file mode 100644 index 5dde94c..0000000 --- a/client/lucy-desktop/src/renderer/src/lib/voice/useDanceAudio.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { useCallback, useEffect, useRef, useState } from "react" - -// Tanzen zur Musik (MateEngine-Idee): nimmt den SYSTEM-Ton per Loopback ab (getDisplayMedia, der -// Main-Prozess liefert audio:"loopback") und misst die Bass-Energie. Daraus speist sich danceLevel, -// das der Avatar in eine rhythmische Tanzbewegung umsetzt. Kein Video wird verwendet (Track sofort gestoppt). -export function useDanceAudio() { - const level = useRef(0) - const [dancing, setDancing] = useState(false) - const ctxRef = useRef(null) - const streamRef = useRef(null) - const rafRef = useRef(0) - - const stop = useCallback(() => { - cancelAnimationFrame(rafRef.current) - streamRef.current?.getTracks().forEach((t) => { try { t.stop() } catch { /* */ } }) - streamRef.current = null - ctxRef.current?.close().catch(() => {}); ctxRef.current = null - level.current = 0; setDancing(false) - }, []) - - const start = useCallback(async () => { - try { - // Video wird vom Handler verlangt, brauchen wir aber nicht -> sofort stoppen, nur Audio behalten - const stream = await navigator.mediaDevices.getDisplayMedia({ video: true, audio: true }) - stream.getVideoTracks().forEach((t) => t.stop()) - if (stream.getAudioTracks().length === 0) { stream.getTracks().forEach((t) => t.stop()); throw new Error("kein System-Audio") } - const ctx = new (window.AudioContext || (window as any).webkitAudioContext)() - const src = ctx.createMediaStreamSource(stream) - const an = ctx.createAnalyser(); an.fftSize = 256; an.smoothingTimeConstant = 0.7 - src.connect(an) - const freq = new Uint8Array(an.frequencyBinCount) - const tick = () => { - an.getByteFrequencyData(freq) - let s = 0; for (let i = 1; i < 10; i++) s += freq[i] // Bass-/Kick-Bereich - level.current = Math.min(1, (s / 9 / 255) * 1.7) - rafRef.current = requestAnimationFrame(tick) - } - tick() - ctxRef.current = ctx; streamRef.current = stream - setDancing(true) - } catch (e) { console.error("Tanz-Audio:", e); stop() } - }, [stop]) - - const toggleDance = useCallback(() => { dancing ? stop() : void start() }, [dancing, start, stop]) - - useEffect(() => () => stop(), [stop]) - return { danceLevel: level, dancing, toggleDance } -} diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/usePushToTalk.ts b/client/lucy-desktop/src/renderer/src/lib/voice/usePushToTalk.ts deleted file mode 100644 index 6ced677..0000000 --- a/client/lucy-desktop/src/renderer/src/lib/voice/usePushToTalk.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { useCallback, useEffect, useRef, useState } from "react" - -// Push-to-talk-Aufnahme via MediaRecorder. start beim Druecken, stop beim Loslassen -> Audio-Blob an onAudio. -export function usePushToTalk(onAudio: (blob: Blob) => void) { - const [recording, setRecording] = useState(false) - const recRef = useRef(null) - const chunksRef = useRef([]) - const streamRef = useRef(null) - - const start = useCallback(async () => { - if (recRef.current) return - let stream: MediaStream - try { - stream = await navigator.mediaDevices.getUserMedia({ audio: true }) - } catch (e) { - console.error("Mikrofon-Zugriff verweigert:", e) - return - } - streamRef.current = stream - const mime = MediaRecorder.isTypeSupported("audio/webm;codecs=opus") ? "audio/webm;codecs=opus" : "audio/webm" - const rec = new MediaRecorder(stream, { mimeType: mime }) - chunksRef.current = [] - rec.ondataavailable = (e) => { if (e.data.size) chunksRef.current.push(e.data) } - rec.onstop = () => { - const blob = new Blob(chunksRef.current, { type: mime }) - streamRef.current?.getTracks().forEach((t) => t.stop()) - streamRef.current = null - recRef.current = null - setRecording(false) - if (blob.size > 1200) onAudio(blob) - } - rec.start() - recRef.current = rec - setRecording(true) - }, [onAudio]) - - const stop = useCallback(() => { recRef.current?.stop() }, []) - - useEffect(() => () => { - recRef.current?.stop() - streamRef.current?.getTracks().forEach((t) => t.stop()) - }, []) - - return { recording, start, stop } -} diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/useVAD.ts b/client/lucy-desktop/src/renderer/src/lib/voice/useVAD.ts deleted file mode 100644 index 121c2b7..0000000 --- a/client/lucy-desktop/src/renderer/src/lib/voice/useVAD.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { useEffect, useRef } from "react" -import { MicVAD } from "@ricky0123/vad-web" -import { BOX_URL } from "../../config" - -// Freisprech-VAD: lauscht dauerhaft am Mikro und liefert komplette Äußerungen als Blob. -// Seit Review P1-7 (2026-07-02) Silero VAD v5 (neuronal, via vad-web/onnxruntime-wasm) statt -// des RMS-Eigenbaus: erkennt Sprache statt Lautstärke (robust gegen Tastatur/Lüfter) und -// erlaubt dadurch ein kürzeres Turn-Ende (450 ms statt 900 ms Stille) ohne Abschneiden. -// RÜCKKOPPLUNGS-SCHUTZ bleibt: `paused` (Lucy denkt/spricht) verwirft laufende Erkennung, -// + echoCancellation + Abkling-Sperre nach Lucys Antwort. - -interface VADOptions { - enabled: boolean // VAD-Modus an? - paused: boolean // Lucy beschäftigt (thinking/speaking/listening) -> nicht aufnehmen - onUtterance: (blob: Blob) => void - onListening?: (active: boolean) => void // UI: gerade Sprache am Aufnehmen? -} - -const REDEMPTION_MS = 450 // so lange Stille -> Äußerung zu Ende (war 900 ms beim RMS-VAD) -const PRE_SPEECH_PAD_MS = 320 // Vorlauf mitschneiden (erster Wortanfang nicht abschneiden) -const MIN_SPEECH_MS = 160 // kürzer = Klick/Räuspern -> verwerfen -const COOLDOWN_MS = 450 // nach Lucys Antwort kurz taub (Echo/Lautsprecher abklingen lassen) -// Semantische Turn-Detection (Smart Turn v3 auf der Box): meldet sie 'unfertig' (User denkt -// mitten im Satz nach), warten wir bis zu HOLD_MS auf die Fortsetzung und hängen sie an, -// statt mitten im Gedanken zu antworten. Hart begrenzt, damit Lucy nie ewig schweigt. -// KONSERVATIV seit 02.07. abends: Nur bei SEHR sicherem 'unfertig' warten (P(fertig) < 0.15) — -// beim ersten Realtest hielt der Check zu viele echte Sätze auf (+1,8s je Turn, „sehr langsam"). -// Not-Aus ohne Rebuild: localStorage lucy_turncheck = "0". -const HOLD_MS = 1200 -const HOLD_BELOW_P = 0.15 // nur unter dieser P(fertig) wird gewartet -const MAX_UTTERANCE_S = 30 // Sicherheitsdeckel fürs Zusammenhängen -const TURNCHECK_ENABLED = typeof localStorage === "undefined" || localStorage.getItem("lucy_turncheck") !== "0" - -// Float32-Samples (16 kHz mono) -> WAV-Blob (PCM16). Ersetzt den MediaRecorder-webm-Umweg: -// die Box muss kein Opus mehr dekodieren, Parakeet/Whisper bekommen direkt sauberes WAV. -function toWavBlob(samples: Float32Array, sampleRate = 16000): Blob { - const buf = new ArrayBuffer(44 + samples.length * 2) - const v = new DataView(buf) - const writeStr = (off: number, s: string) => { for (let i = 0; i < s.length; i++) v.setUint8(off + i, s.charCodeAt(i)) } - writeStr(0, "RIFF"); v.setUint32(4, 36 + samples.length * 2, true); writeStr(8, "WAVE") - writeStr(12, "fmt "); v.setUint32(16, 16, true); v.setUint16(20, 1, true); v.setUint16(22, 1, true) - v.setUint32(24, sampleRate, true); v.setUint32(28, sampleRate * 2, true); v.setUint16(32, 2, true); v.setUint16(34, 16, true) - writeStr(36, "data"); v.setUint32(40, samples.length * 2, true) - let off = 44 - for (let i = 0; i < samples.length; i++, off += 2) { - const s = Math.max(-1, Math.min(1, samples[i])) - v.setInt16(off, s < 0 ? s * 0x8000 : s * 0x7fff, true) - } - return new Blob([buf], { type: "audio/wav" }) -} - -// Fragt die Box nach P(fertig) der Äußerung. Fehler => 1.0 (nie blockieren, sofort senden). -async function turnCompleteness(audio: Float32Array): Promise { - try { - const fd = new FormData() - fd.append("audio", toWavBlob(audio.subarray(Math.max(0, audio.length - 8 * 16000))), "rec.wav") - const r = await fetch(`${BOX_URL}/api/voice/turn`, { method: "POST", body: fd }) - if (!r.ok) return 1.0 - const j = await r.json() - return typeof j.probability === "number" ? j.probability : 1.0 - } catch { - return 1.0 - } -} - -function concatAudio(a: Float32Array, b: Float32Array): Float32Array { - const out = new Float32Array(a.length + b.length) - out.set(a); out.set(b, a.length) - return out -} - -export function useVAD({ enabled, paused, onUtterance, onListening }: VADOptions) { - const pausedRef = useRef(paused); pausedRef.current = paused - const onUtt = useRef(onUtterance); onUtt.current = onUtterance - const onLst = useRef(onListening); onLst.current = onListening - const resumeAt = useRef(0) - - // Abkling-Sperre: sobald Lucy fertig ist (paused true->false), kurz nicht lauschen - useEffect(() => { if (!paused) resumeAt.current = performance.now() + COOLDOWN_MS }, [paused]) - - useEffect(() => { - if (!enabled) return - let cancelled = false - let vad: Awaited> | null = null - // Semantik-Hold: bei 'incomplete' gepufferte Äußerung, auf die die Fortsetzung wartet. - let pending: Float32Array | null = null - let holdTimer: ReturnType | null = null - - const emit = (audio: Float32Array) => { - pending = null - if (holdTimer) { clearTimeout(holdTimer); holdTimer = null } - onUtt.current(toWavBlob(audio)) - } - - ;(async () => { - try { - vad = await MicVAD.new({ - model: "v5", - // Assets self-hosted (electron.vite.config.ts kopiert sie nach /vad/) — offlinefähig. - baseAssetPath: "/vad/", - onnxWASMBasePath: "/vad/", - positiveSpeechThreshold: 0.5, - negativeSpeechThreshold: 0.35, - redemptionMs: REDEMPTION_MS, - preSpeechPadMs: PRE_SPEECH_PAD_MS, - minSpeechMs: MIN_SPEECH_MS, - getStream: () => navigator.mediaDevices.getUserMedia({ - audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true }, - }), - onSpeechStart: () => { - if (pausedRef.current || performance.now() < resumeAt.current) return - // User spricht weiter, während eine 'incomplete'-Äußerung gehalten wird -> - // Timer stoppen; die Fortsetzung wird in onSpeechEnd angehängt. - if (holdTimer) { clearTimeout(holdTimer); holdTimer = null } - onLst.current?.(true) - }, - onSpeechEnd: async (audio: Float32Array) => { - onLst.current?.(false) - // Während Lucy denkt/spricht (oder direkt danach) erkannte Sprache = ihr eigenes - // Echo bzw. Nachhall -> verwerfen statt transkribieren. - if (cancelled || pausedRef.current || performance.now() < resumeAt.current) { pending = null; return } - if (!pending && audio.length < MIN_SPEECH_MS * 16) return // 16 Samples/ms @16 kHz - let combined = pending ? concatAudio(pending, audio) : audio - if (combined.length > MAX_UTTERANCE_S * 16000) { - combined = combined.subarray(combined.length - MAX_UTTERANCE_S * 16000) - } - // Bereits einmal gehalten? Dann JETZT senden — maximal eine Warterunde pro Äußerung. - if (!TURNCHECK_ENABLED || pending) { emit(combined); return } - const t0 = performance.now() - const pComplete = await turnCompleteness(combined) - if (cancelled) return - if (localStorage.getItem("lucy_perf") === "1") { - console.log(`[lucy-perf] Turn-Check P(fertig)=${pComplete} in ${Math.round(performance.now() - t0)}ms -> ${pComplete < HOLD_BELOW_P ? "HALTEN" : "senden"}`) - } - if (pComplete >= HOLD_BELOW_P) { emit(combined); return } - // SEHR sicher mitten im Gedanken: kurz auf die Fortsetzung warten, dann notfalls senden. - pending = combined - if (holdTimer) clearTimeout(holdTimer) - holdTimer = setTimeout(() => { if (!cancelled && pending) emit(pending) }, HOLD_MS) - }, - onVADMisfire: () => onLst.current?.(false), - }) - if (cancelled) { vad.destroy(); return } - vad.start() - } catch (e) { - console.error("VAD: Silero-Init fehlgeschlagen", e) - } - })() - - return () => { - cancelled = true - if (holdTimer) clearTimeout(holdTimer) - try { vad?.destroy() } catch { /* */ } - onLst.current?.(false) - } - }, [enabled]) -} diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/useVoiceAgent.ts b/client/lucy-desktop/src/renderer/src/lib/voice/useVoiceAgent.ts deleted file mode 100644 index c6de99a..0000000 --- a/client/lucy-desktop/src/renderer/src/lib/voice/useVoiceAgent.ts +++ /dev/null @@ -1,305 +0,0 @@ -import { useCallback, useEffect, useRef, useState } from "react" -import { usePushToTalk } from "./usePushToTalk" -import { useVAD } from "./useVAD" -import { AudioQueue } from "./audio" -import { sentimentToEmotion, type Emotion } from "./sentiment" -import { BOX_URL, SYSTEM_PROMPT } from "../../config" -import { stt, tts, SpeechScheduler } from "../../voice-core" -import { EMO_TAG, cleanForTTS, newSessionId, restoreUmlauts, stripEmoTag, stripMedia } from "./textPipeline" -import { VISION_RX, extractWindowName } from "./visionIntent" -import { PERF, plog, plogSend } from "./perf" - -// Voll-Duplex-Schleife: PTT/VAD -> Box /stt -> Box /chat (SSE Hermes) -> CHUNKS -> lokal /tts -> AudioQueue. -// Hirn+STT = Box (wie WebUI), Stimme = lokal (pocket-tts, CPU). Antwort wird in groessere Bloecke -// gebuendelt und satzweise frueh gesprochen. Warm-Gate beim Start: Bedienung erst frei, wenn der -// TTS-Dienst antwortet. Text-Verarbeitung: textPipeline.ts · Vision-Intent: visionIntent.ts · -// Perf-Logging: perf.ts (Review P2-13a: Hook = nur noch Orchestrierung). - -export type VoiceStatus = "warming" | "idle" | "listening" | "transcribing" | "thinking" | "speaking" | "error" -export interface ChatMsg { role: "user" | "assistant"; text: string } - -export function useVoiceAgent() { - const [status, setStatus] = useState("warming") - const [ready, setReady] = useState(false) - const [messages, setMessages] = useState([]) - const [error, setError] = useState(null) - const [inputMode, setInputModeState] = useState<"ptt" | "vad">( - () => (localStorage.getItem("lucy_input_mode") === "vad" ? "vad" : "ptt")) - const [vadListening, setVadListening] = useState(false) - const setInputMode = useCallback((m: "ptt" | "vad") => { - localStorage.setItem("lucy_input_mode", m); setInputModeState(m) - }, []) - - const audioLevel = useRef({ current: 0 }) - const emotion = useRef("neutral") - const queueRef = useRef(null) - const schedulerRef = useRef(null) - const turnAbortRef = useRef(null) // laufenden Turn abbrechen (Barge-in) - const thinkingRef = useRef(false) // Hermes werkelt noch (Tools) -> Status nach Filler zurück auf 'thinking' - const turnT0 = useRef(0) // Perf: Startzeit des aktuellen Turns (Mikro losgelassen) - const sessionId = useRef(newSessionId()) - // Live-Status fuer die Eingabe-Sperre (ohne pressStart-Closure neu zu binden) - const statusRef = useRef("warming") - useEffect(() => { statusRef.current = status }, [status]) - - const ensureQueue = useCallback(() => { - if (!queueRef.current) { - const q = new AudioQueue() - queueRef.current = q - audioLevel.current = q.level - // Satz-Pipelining: der Scheduler spricht einzelne Sätze, sobald sie aus dem Hirn-Stream - // fertig sind. Er (nicht die Queue) treibt den „speaking"-Status, damit es zwischen Sätzen - // nicht flackert (die Queue pausiert die Pegelmessung je Satz). - const sch = new SpeechScheduler(tts, q) - // Nach dem Filler-Satz zurück auf 'thinking', solange Hermes noch werkelt (sonst flackert's auf idle). - sch.onBusy = (busy) => setStatus((s) => (busy ? "speaking" : thinkingRef.current ? "thinking" : s === "speaking" ? "idle" : s)) - schedulerRef.current = sch - } - return queueRef.current - }, []) - - // --- Warm-Gate: warten bis der lokale TTS-Dienst geladen ist, bevor die Bedienung frei wird --- - // pocket_server serviert /health erst, wenn das Modell fertig geladen ist (FastAPI-lifespan). - // Der Main-Prozess spawnt den Server beim App-Start; hier nur pollen. - useEffect(() => { - let cancelled = false - ;(async () => { - // Geduldiger Retry mit Backoff statt einmaligem 120s-Warten: crasht der pocket_server - // (oder braucht er länger), bleibt die App in 'warming' MIT sichtbarer Meldung — vorher - // schaltete sie nach dem Timeout stumm auf 'ready' und die Stimme fehlte einfach. - let attempt = 0 - while (!cancelled) { - const ok = await tts.waitReady(attempt === 0 ? 45_000 : 20_000) - if (cancelled) return - if (ok) break - attempt++ - setError(`Stimme startet nicht (Versuch ${attempt}) — pocket_server prüfen, ich versuche es weiter …`) - await new Promise((r) => setTimeout(r, Math.min(5_000 * attempt, 30_000))) - } - if (cancelled) return - setError(null) - // ein Aufwaerm-Satz (primt alle lazy Pfade); Audio verwerfen - try { await tts.synthesize("Alles bereit, Commander.") } catch { /* */ } - if (cancelled) return - setReady(true); setStatus("idle") - })() - return () => { cancelled = true } - }, []) - - // Ein kompletter Turn: User-Text (+ optional Bildschirm-Bilder, Multi-Monitor) -> Hermes (SSE) -> Stimme. - const runTurn = useCallback(async (userText: string, images?: string[]) => { - const queue = ensureQueue() - const scheduler = schedulerRef.current! - // Vorherigen Turn (falls noch am Streamen) hart abbrechen -> kein „Weiterreden" nach Barge-in. - turnAbortRef.current?.abort() - const ac = new AbortController() - turnAbortRef.current = ac - scheduler.clear(); queue.clear() // frischer Turn: evtl. Reste aus vorherigem Sprechen verwerfen - setStatus("thinking") - thinkingRef.current = true // Hermes werkelt (evtl. Tools) -> Status nach Filler zurück auf 'thinking' - let assistant = "" - let firstToken = true - setMessages((m) => [...m, { role: "assistant", text: "" }]) - - // GANZE Antwort in EINEM Stream an Pocket (nach Hermes-Ende). Pocket kürzt intern den ersten - // Chunk (FAST_FIRST) -> schnelles erstes Audio, konsistente Prosodie, wenige Collapse-Regens. - // (Client-seitiges Satz-Chunking kämpfte gegen genau diese Optimierung -> verworfen.) - let dispatchedAny = false - let aborted = false - // --- Inkrementelles Sprechen bei TOOL-Turns ------------------------------------------------ - // Ohne Tools bleibt alles Ein-Stück (Flush erst am Ende) -> gleiche Prosodie/FAST_FIRST wie bisher. - // Sobald Hermes ein Tool anstößt (hermes.*-Event), sprechen wir die bis dahin FERTIGEN Sätze schon - // -> Lucy redet, WÄHREND das Tool läuft, statt am Ende alles am Stück (sonst 30s+ Totstille bei Tool-Ketten). - let spokenLen = 0 - const SENT_END = /[.!?…](?=[\s"“”„)\]]|$)/g - const flushSpeakable = (force: boolean) => { - const raw = assistant.slice(spokenLen) - if (!raw.trim()) return - if (!force && ((raw.match(/```/g)?.length || 0) % 2) === 1) return // offener Code-Zaun -> warten - let upto = raw.length - if (!force) { - let last = -1, m: RegExpExecArray | null - SENT_END.lastIndex = 0 - while ((m = SENT_END.exec(raw))) last = m.index + 1 - if (last < 0) return // noch kein ganzer Satz fertig -> warten - upto = last - } - spokenLen += upto - const seg = cleanForTTS(stripEmoTag(raw.slice(0, upto))) - if (seg) { scheduler.push(seg); dispatchedAny = true } - } - // Sofort-Kontext: lokale Zeit/Datum mitgeben -> Lucy braucht dafür KEIN Tool (spart den 13s-Tool-Tanz). - const timeCtx = `\n\n[Sofort-Kontext, DIREKT nutzbar OHNE Tool: Lokale Zeit/Datum beim Commander ist ` + - `${new Date().toLocaleString("de-DE", { weekday: "long", day: "numeric", month: "long", year: "numeric", hour: "2-digit", minute: "2-digit" })} Uhr.]` - try { - const r = await fetch(`${BOX_URL}/api/voice/chat`, { - method: "POST", headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ text: userText, session_id: sessionId.current, system: SYSTEM_PROMPT + timeCtx, images: images || [] }), - signal: ac.signal, - }) - if (!r.ok || !r.body) throw new Error(`Agent ${r.status}`) - const reader = r.body.getReader() - const dec = new TextDecoder() - let sse = "" - for (;;) { - if (ac.signal.aborted) break - const { done, value } = await reader.read() - if (done) break - sse += dec.decode(value, { stream: true }) - const events = sse.split("\n\n"); sse = events.pop() || "" - for (const ev of events) { - const lines = ev.split("\n") - // Hermes mischt Tool-Fortschritt (event: hermes.tool.progress) in den Stream. Das sind KEINE - // Chat-Chunks -> nicht als solche parsen (ein Tool-Hickup mit error-Objekt darf die Antwort - // nicht abbrechen). Optional koennte man hier Tool-Status anzeigen. - const evType = lines.find((l) => l.startsWith("event:"))?.slice(6).trim() - if (evType && evType.startsWith("hermes.")) { - // Tool-Fortschritt (Status bleibt 'thinking'). Für die „denkt-lange"-Diagnose zeigen wir - // die Agent-Aktivität mit Zeitstempel -> so sieht man, ob Tools/Reasoning die Zeit fressen. - if (PERF) { - const dt = lines.find((l) => l.startsWith("data:"))?.slice(5).trim().slice(0, 140) || "" - plogSend(`Hermes ${evType} +${Math.round(performance.now() - turnT0.current)}ms ${dt}`) - } - flushSpeakable(false) // Tool läuft an -> die bis hier fertigen Sätze schon sprechen (redet WÄHREND das Tool arbeitet) - continue - } - const line = lines.find((l) => l.startsWith("data:")) - if (!line) continue - const data = line.slice(5).trim() - if (data === "[DONE]") continue - let json: any - try { json = JSON.parse(data) } catch { continue } - if (json.error) { - const msg = typeof json.error === "string" - ? json.error - : (json.error?.message || JSON.stringify(json.error)) - throw new Error(msg) - } - const delta = json.choices?.[0]?.delta?.content || "" - if (!delta) continue - if (firstToken) { firstToken = false; plog("Chat-TTFB (1. Hermes-Token)", performance.now() - turnT0.current) } - assistant += delta - // Defensiv: falls Hermes seinen internen Umschlag durchreicht (Mid-Turn) -> NICHTS vorlesen. - if (assistant.includes("OUT-OF-BAND USER MESSAGE")) { aborted = true; scheduler.clear(); queue.clear(); break } - emotion.current = sentimentToEmotion(assistant) - setMessages((m) => { const c = m.slice(); c[c.length - 1] = { role: "assistant", text: stripEmoTag(stripMedia(restoreUmlauts(assistant))) }; return c }) - } - if (aborted) break - } - if (ac.signal.aborted) return // Turn wurde unterbrochen (Barge-in) -> still beenden - if (aborted) { - setStatus("error") - setError("Nachricht kam mitten im Turn an — bitte warten, bis Lucy fertig ist, dann erneut fragen.") - return - } - if (!assistant.trim()) { setStatus("idle"); return } - // Stimmungs-Tag (falls vorhanden) -> Avatar-Mimik nach BEDEUTUNG (sonst bleibt Sentiment-Heuristik). - const emo = assistant.match(EMO_TAG) - if (emo) emotion.current = emo[1].toLowerCase() as Emotion - // Rest sprechen: bei Tool-Turns wurde schon segmentweise geflusht; hier kommt das letzte Segment - // (bzw. bei Turns OHNE Tools die GANZE Antwort in einem Rutsch -> FAST_FIRST, gleiche Prosodie wie bisher). - thinkingRef.current = false // Hermes fertig -> nach der Antwort darf der Status auf idle (kein Rückfall auf 'thinking') - plog("Text an TTS (Rest)", performance.now() - turnT0.current) - flushSpeakable(true) - await scheduler.idle() // warten, bis Lucy fertig gesprochen hat - if (dispatchedAny && !scheduler.playedAny) { - setStatus("error") - setError("Sprachausgabe fehlgeschlagen — laeuft der lokale TTS-Dienst?") - } else if (!dispatchedAny) { - setStatus("idle") - } - } catch (e: any) { - if (e?.name === "AbortError" || ac.signal.aborted) return // absichtlich abgebrochen (Barge-in) - setStatus("error"); setError(`Agent-Antwort fehlgeschlagen: ${e.message}`) - } - }, [ensureQueue]) - - // Bildschirm-Sicht: Bild(er) erfassen (gezieltes Fenster per Name, sonst ALLE Monitore) - const captureForVision = useCallback(async (userText: string): Promise<{ images: string[]; label: string }> => { - if (!window.lucy) return { images: [], label: "" } - try { - const name = extractWindowName(userText) - if (name) { - const hit = await window.lucy.captureByName(name) - if (hit?.image) return { images: [hit.image], label: ` 👁 ${hit.name}` } - } - const shots = (await window.lucy.captureScreen()).filter(Boolean) - if (shots.length) return { images: shots, label: shots.length > 1 ? ` 👁 ${shots.length} Bildschirme` : " 👁 Bildschirm" } - } catch (e) { console.error("Bildschirm-Capture:", e) } - return { images: [], label: "" } - }, []) - - const handleAudio = useCallback(async (blob: Blob) => { - setError(null) - turnT0.current = performance.now() // Perf: Startpunkt = Mikro losgelassen - turnAbortRef.current?.abort() // Barge-in: laufenden Hirn-Turn stoppen (kein Nachschieben) - thinkingRef.current = false - ensureQueue().clear() - schedulerRef.current?.clear() // Barge-in: wartende Sätze mit verwerfen - setStatus("transcribing") - let userText = "" - try { - userText = await stt.transcribe(blob) - plog("STT (Mikro->Text)", performance.now() - turnT0.current) - } catch (e: any) { - setStatus("error"); setError(`Spracherkennung fehlgeschlagen: ${e.message}`); return - } - if (!userText) { setStatus("idle"); return } - // Bittet der Nutzer Lucy, auf den Bildschirm zu schauen? -> Bild(er) erfassen + mitschicken. - const vis = VISION_RX.test(userText) ? await captureForVision(userText) : { images: [] as string[], label: "" } - setMessages((m) => [...m, { role: "user", text: userText + vis.label }]) - await runTurn(userText, vis.images) - }, [ensureQueue, runTurn, captureForVision]) - - // Auge-Button: Lucy aktiv auf den Bildschirm schauen lassen (ohne Sprachbefehl) - const lookAtScreen = useCallback(async () => { - if (!ready || statusRef.current === "thinking" || statusRef.current === "transcribing") return - setError(null); turnT0.current = performance.now(); ensureQueue().clear(); schedulerRef.current?.clear() - let images: string[] = [] - try { images = ((await window.lucy?.captureScreen()) || []).filter(Boolean) } catch { /* */ } - const prompt = "Schau auf meinen Bildschirm und sag mir kurz, was du darauf siehst." - const label = images.length > 1 ? ` 👁 ${images.length} Bildschirme` : " 👁 Bildschirm" - setMessages((m) => [...m, { role: "user", text: prompt + label }]) - await runTurn(prompt, images) - }, [ensureQueue, runTurn, ready]) - - const { recording, start, stop } = usePushToTalk(handleAudio) - - // Freisprech-VAD: nur im vad-Modus, und nur wenn Lucy IDLE ist (paused sonst) -> keine Rückkopplung, - // keine Mid-Turn-Nachricht. ensureQueue() vor handleAudio, damit Barge-in/Audio bereit ist. - useVAD({ - enabled: ready && inputMode === "vad", - paused: status !== "idle", - onUtterance: (blob) => { ensureQueue(); void handleAudio(blob) }, - onListening: setVadListening, - }) - - const pressStart = useCallback(() => { - if (!ready) return - // Waehrend das Gehirn arbeitet (STT/Hermes-Turn laeuft) KEINEN neuen Turn starten: eine zweite - // Nachricht mitten im Turn liefert Hermes als "OUT-OF-BAND" aus -> Modell echot den Umschlag. - // Barge-in beim SPRECHEN bleibt erlaubt (Hermes-Turn ist dann fertig) -> queue.clear() in handleAudio. - if (statusRef.current === "transcribing" || statusRef.current === "thinking") return - ensureQueue() - setStatus("listening") - void start() - }, [ready, ensureQueue, start]) - - const pressEnd = useCallback(() => { stop() }, [stop]) - - const reset = useCallback(() => { - turnAbortRef.current?.abort() - thinkingRef.current = false - queueRef.current?.clear() - schedulerRef.current?.clear() - setMessages([]); setError(null); setStatus("idle") - sessionId.current = newSessionId() // frischer Gesprächsfaden (Mem0-Gedächtnis bleibt) - }, []) - - useEffect(() => { - if (!recording && status === "listening") setStatus("transcribing") - }, [recording, status]) - - return { status, ready, messages, error, recording, audioLevel, emotion, pressStart, pressEnd, reset, - inputMode, setInputMode, vadListening, lookAtScreen } -} diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/visionIntent.ts b/client/lucy-desktop/src/renderer/src/lib/voice/visionIntent.ts deleted file mode 100644 index 04a400e..0000000 --- a/client/lucy-desktop/src/renderer/src/lib/voice/visionIntent.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Bildschirm-Sicht-Intent: erkennt im Gesagten die Bitte, auf den Schirm zu schauen -// (aus useVoiceAgent extrahiert, Review P2-13a). - -export const VISION_RX = /\b(schau|sieh|siehst|guck|guckst|zeig|bildschirm|screen|monitor|fenster|erkennst?|lies (mir|das)|was (steht|ist) (da|hier|auf)|auf meinem (bildschirm|schirm|screen))\b/i - -export function extractWindowName(text: string): string | null { - // grobe Heuristik: Wort/Phrase nach 'fenster|app|programm|in|auf|bei|im' - const m = text.match(/(?:fenster|app|programm|in|auf|bei|im)\s+([A-Za-zÄÖÜäöü][\w.+\- ]{2,28})/i) - if (!m) return null - return m[1].replace(/\b(an|fenster|programm|app|bildschirm|schirm|screen|siehst|du)\b/gi, "").trim() || null -} diff --git a/client/lucy-desktop/src/renderer/src/main.tsx b/client/lucy-desktop/src/renderer/src/main.tsx deleted file mode 100644 index f7629cd..0000000 --- a/client/lucy-desktop/src/renderer/src/main.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import React from "react" -import ReactDOM from "react-dom/client" -import App from "./App" -import "./styles.css" - -ReactDOM.createRoot(document.getElementById("root")!).render( - - - , -) diff --git a/client/lucy-desktop/src/renderer/src/styles.css b/client/lucy-desktop/src/renderer/src/styles.css deleted file mode 100644 index 850de3b..0000000 --- a/client/lucy-desktop/src/renderer/src/styles.css +++ /dev/null @@ -1,282 +0,0 @@ -* { box-sizing: border-box; margin: 0; padding: 0; } -:root { color-scheme: dark; } -html, body, #root { height: 100%; } -body { - font-family: system-ui, -apple-system, "Segoe UI", sans-serif; - color: #e5e7eb; overflow: hidden; background: transparent; /* frameless+transparent: App malt den Hintergrund */ -} - -/* ---- App-Rahmen: Titelleiste + Body ---- */ -.app { display: flex; flex-direction: column; height: 100%; overflow: hidden; } -.app.full { - background: radial-gradient(1200px 800px at 50% 30%, #14141f 0%, #0a0a0f 70%); - border: 1px solid rgba(255,255,255,0.08); border-radius: 14px; -} -.app.overlay { background: transparent; } - -.titlebar { - flex-shrink: 0; height: 34px; display: flex; align-items: center; justify-content: space-between; - padding: 0 6px 0 12px; -webkit-app-region: drag; user-select: none; -} -.app.overlay .titlebar { height: 28px; opacity: 0.35; transition: opacity 0.2s; } -.app.overlay:hover .titlebar { opacity: 1; } -.drag { display: flex; align-items: center; gap: 8px; min-width: 0; flex: 1; } -.dot { width: 9px; height: 9px; border-radius: 50%; flex-shrink: 0; box-shadow: 0 0 8px currentColor; } -.ttl { font-size: 12px; font-weight: 600; letter-spacing: 0.04em; color: #cbd5e1; } -.ttlStatus { font-size: 11px; color: #6b7280; margin-left: 6px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } -.winbtns { display: flex; gap: 2px; -webkit-app-region: no-drag; } -.wb { - width: 28px; height: 24px; border: none; background: transparent; color: #9ca3af; cursor: pointer; - border-radius: 6px; font-size: 13px; display: flex; align-items: center; justify-content: center; -} -.wb:hover { background: rgba(255,255,255,0.1); color: #e5e7eb; } -.wb.close:hover { background: #ef4444; color: #fff; } -.wb[data-on="true"] { color: #7dd3fc; } - -.body { flex: 1; min-height: 0; display: flex; gap: 14px; padding: 0 14px 14px; } -.app.overlay .body { padding: 0; } - -.stage { - position: relative; display: flex; flex-direction: column; flex: 1; min-width: 0; - border: 1px solid rgba(255,255,255,0.07); border-radius: 14px; - background: rgba(255,255,255,0.02); overflow: hidden; -} -.app.overlay .stage { border: none; background: transparent; } -.avatarWrap { flex: 1; min-height: 0; position: relative; overflow: hidden; border-radius: 14px; } -/* Overlay: Lucy am Koerper greifen & ueber den Desktop ziehen (Bedienelemente bleiben no-drag) */ -.app.overlay .avatarWrap { -webkit-app-region: drag; } -.app.overlay .overlayBubbles, .app.overlay .overlayBubbles * { -webkit-app-region: no-drag; } - -/* --- digitaler Raum (animierter Sci-Fi-Backdrop, Etappe 2B) --- */ -.digitalRoom { - position: absolute; inset: 0; z-index: 0; overflow: hidden; - background: - radial-gradient(60% 50% at 50% 16%, rgba(125,211,252,0.10), transparent 70%), - radial-gradient(70% 60% at 82% 92%, rgba(167,139,250,0.10), transparent 70%), - radial-gradient(60% 60% at 12% 88%, rgba(52,211,153,0.06), transparent 70%), - linear-gradient(180deg, #0b0b15 0%, #07070d 100%); - box-shadow: inset 0 0 130px 36px rgba(0,0,0,0.55); /* Vignette -> Tiefe */ -} -.digitalRoom::before { /* sanft driftendes Aurora-Licht (KEIN filter:blur -> Verlaeufe sind weich genug, spart GPU) */ - content: ""; position: absolute; inset: -20%; z-index: 0; will-change: transform; - background: - radial-gradient(40% 40% at 30% 32%, rgba(125,211,252,0.12), transparent 70%), - radial-gradient(45% 45% at 74% 42%, rgba(167,139,250,0.12), transparent 70%); - animation: auroraDrift 26s ease-in-out infinite alternate; -} -.digitalRoom::after { /* perspektivisches Neon-Gitter am Boden */ - content: ""; position: absolute; left: -25%; right: -25%; bottom: -12%; height: 58%; - background-image: linear-gradient(rgba(125,211,252,0.13) 1px, transparent 1px), - linear-gradient(90deg, rgba(125,211,252,0.10) 1px, transparent 1px); - background-size: 46px 46px; - transform: perspective(440px) rotateX(62deg); transform-origin: bottom center; - -webkit-mask-image: linear-gradient(transparent, #000 65%); - animation: gridDrift 14s linear infinite; -} -/* schwebende Partikel (eine Ebene, nahtlos gekachelt) -> dezente Tiefe, guenstig */ -.dust { - position: absolute; inset: 0; z-index: 0; pointer-events: none; opacity: 0.6; - background-image: radial-gradient(1.6px 1.6px at 50% 50%, rgba(125,211,252,0.5), transparent 60%); - background-size: 110px 110px; animation: dustRise 30s linear infinite; -} -@keyframes gridDrift { to { background-position: 0 46px, 46px 0; } } -@keyframes auroraDrift { from { transform: translate(-3%, -2%) scale(1); } to { transform: translate(4%, 3%) scale(1.08); } } -@keyframes dustRise { to { background-position: 0 -110px; } } -.app.overlay .digitalRoom { display: none; } /* Overlay floatet -> nur Avatar + Aura */ - -.aura { position: absolute; inset: 0; z-index: 1; pointer-events: none; will-change: transform, opacity; } -.avatarCanvas { z-index: 2; } - -.subtitle { - position: absolute; left: 7%; right: 7%; bottom: 14px; z-index: 3; text-align: center; max-height: 40%; - overflow: hidden; pointer-events: none; border-radius: 10px; padding: 8px 14px; - font-size: 15px; line-height: 1.45; color: #eef2f7; - text-shadow: 0 1px 6px #000, 0 0 16px rgba(0,0,0,0.6); - background: linear-gradient(transparent, rgba(8,8,14,0.45)); animation: subIn 0.2s ease; -} -@keyframes subIn { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } } -.app.overlay .subtitle { font-size: 13px; bottom: 34px; } - -.warmOverlay { - position: absolute; inset: 0; display: flex; flex-direction: column; - align-items: center; justify-content: center; gap: 14px; text-align: center; padding: 24px; - background: rgba(10,10,15,0.72); backdrop-filter: blur(3px); z-index: 5; -} -.warmTitle { font-size: 16px; color: #e5e7eb; } -.warmSub { font-size: 13px; color: #9ca3af; max-width: 340px; line-height: 1.5; } -.spinner.big { width: 30px; height: 30px; border-width: 3px; } - -.overlayCaption { - position: absolute; left: 0; right: 0; bottom: 8px; display: flex; gap: 6px; justify-content: center; - align-items: center; font-size: 12px; color: #cbd5e1; text-shadow: 0 1px 4px #000; pointer-events: none; -} - -/* --- Overlay v2: griffbereite Blasen fuer Links/Code (behindern nicht, jederzeit ignorierbar) --- */ -.overlayBubbles { - position: absolute; left: 6px; right: 6px; bottom: 28px; z-index: 4; - display: flex; flex-direction: column; gap: 5px; align-items: stretch; -} -.bubbleChip { - display: flex; align-items: center; gap: 4px; padding: 3px 4px 3px 9px; border-radius: 9px; - background: rgba(12,12,20,0.82); border: 1px solid rgba(125,211,252,0.25); - backdrop-filter: blur(4px); box-shadow: 0 3px 12px rgba(0,0,0,0.4); -} -.bubbleChip .chipTxt { - flex: 1; min-width: 0; font-size: 11px; color: #cbd5e1; - white-space: nowrap; overflow: hidden; text-overflow: ellipsis; -} -.bubbleChip button { - flex-shrink: 0; width: 22px; height: 20px; border: none; border-radius: 6px; cursor: pointer; - background: rgba(125,211,252,0.14); color: #7dd3fc; font-size: 11px; -webkit-app-region: no-drag; -} -.bubbleChip button:hover { background: rgba(125,211,252,0.28); } - -.controls { - flex-shrink: 0; display: flex; flex-direction: column; align-items: center; gap: 12px; - padding: 16px; border-top: 1px solid rgba(255,255,255,0.07); background: rgba(0,0,0,0.25); -} -.app.overlay .controls { border: none; background: transparent; padding: 8px; gap: 6px; } -.status { display: flex; align-items: center; gap: 8px; font-size: 14px; } -.spinner { - width: 14px; height: 14px; border: 2px solid rgba(255,255,255,0.25); border-top-color: #7dd3fc; - border-radius: 50%; animation: spin 0.8s linear infinite; -} -@keyframes spin { to { transform: rotate(360deg); } } - -.mic { - width: 72px; height: 72px; border-radius: 50%; cursor: pointer; user-select: none; - display: flex; align-items: center; justify-content: center; - border: 2px solid rgba(125,211,252,0.5); background: rgba(125,211,252,0.12); color: #7dd3fc; - transition: transform 0.12s, background 0.12s, border-color 0.12s; -} -.app.overlay .mic { width: 56px; height: 56px; } -.mic:hover { background: rgba(125,211,252,0.2); transform: scale(1.05); } -.mic.rec { - border-color: #f87171; background: rgba(248,113,113,0.2); color: #fca5a5; transform: scale(1.1); - box-shadow: 0 0 24px rgba(248,113,113,0.35); -} -.mic.disabled { opacity: 0.4; cursor: default; border-color: rgba(255,255,255,0.2); background: rgba(255,255,255,0.04); color: #6b7280; } -.mic.disabled:hover { transform: none; background: rgba(255,255,255,0.04); } -.hint { font-size: 11px; color: #6b7280; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; justify-content: center; } -.hint kbd { background: rgba(255,255,255,0.1); border-radius: 4px; padding: 1px 5px; font-family: monospace; } - -.modeToggle { display: inline-flex; gap: 2px; padding: 2px; border-radius: 9px; background: rgba(255,255,255,0.05); } -.modeToggle button { - border: none; background: transparent; color: #9ca3af; cursor: pointer; - font-size: 11px; padding: 4px 10px; border-radius: 7px; transition: background 0.12s, color 0.12s; -} -.modeToggle button:hover { color: #e5e7eb; } -.modeToggle button.on { background: rgba(125,211,252,0.18); color: #7dd3fc; } -.app.overlay .modeToggle { display: none; } -.vadDot { width: 7px; height: 7px; border-radius: 50%; background: #34d399; box-shadow: 0 0 8px #34d399; animation: pulse 1s infinite; } - -.danceBtn { - border: 1px solid rgba(167,139,250,0.35); background: rgba(167,139,250,0.12); color: #c4b5fd; - font-size: 11px; padding: 4px 12px; border-radius: 9px; cursor: pointer; -webkit-app-region: no-drag; - transition: background 0.12s, color 0.12s; -} -.danceBtn:hover { background: rgba(167,139,250,0.22); color: #ddd6fe; } -.danceBtn.on { background: rgba(167,139,250,0.3); color: #ede9fe; border-color: rgba(167,139,250,0.6); } -.app.overlay .danceBtn { display: none; } /* im Overlay kein Platz -> nur im Vollfenster */ - -.side { - width: 320px; flex-shrink: 0; display: flex; flex-direction: column; - border: 1px solid rgba(255,255,255,0.07); border-radius: 14px; background: rgba(255,255,255,0.02); -} -.sideHead { - display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; - border-bottom: 1px solid rgba(255,255,255,0.07); - font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; color: #9ca3af; -} -.iconBtn { background: none; border: none; color: #9ca3af; cursor: pointer; font-size: 15px; } -.iconBtn:hover { color: #e5e7eb; } - -.conv { flex: 1; overflow-y: auto; padding: 16px; display: flex; flex-direction: column; gap: 12px; } -.empty { font-size: 12px; color: #9ca3af; line-height: 1.6; } -.msg { display: flex; flex-direction: column; gap: 4px; } -.msg.user { align-items: flex-end; } -.msg.assistant { align-items: flex-start; } -.who { font-size: 10px; text-transform: uppercase; letter-spacing: 0.05em; color: #6b7280; padding: 0 4px; } -.bubble { - max-width: 88%; white-space: pre-wrap; word-break: break-word; border-radius: 16px; - padding: 8px 12px; font-size: 14px; line-height: 1.5; -} -.msg.user .bubble { background: rgba(125,211,252,0.14); border-bottom-right-radius: 4px; } -.msg.assistant .bubble { background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.07); border-bottom-left-radius: 4px; } -.dots { display: inline-flex; gap: 4px; } -.dots i { width: 6px; height: 6px; border-radius: 50%; background: #6b7280; animation: pulse 1s infinite; } -.dots i:nth-child(2) { animation-delay: 0.15s; } -.dots i:nth-child(3) { animation-delay: 0.3s; } -@keyframes pulse { 0%, 100% { opacity: 0.3; } 50% { opacity: 1; } } - -::-webkit-scrollbar { width: 8px; } -::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.12); border-radius: 4px; } - -/* ---- Etappe 2: guter Chat (Markdown, Code-Bloecke, Links, Kopieren) ---- */ -.bubble { position: relative; } -.md { white-space: normal; } -.md > :first-child { margin-top: 0; } -.md > :last-child { margin-bottom: 0; } -.md p { margin: 0 0 8px; } -.md ul, .md ol { margin: 4px 0 8px; padding-left: 20px; } -.md li { margin: 2px 0; } -.md strong { color: #f1f5f9; font-weight: 650; } -.md a.mdLink { color: #7dd3fc; text-decoration: underline; cursor: pointer; word-break: break-all; } -.md a.mdLink:hover { color: #bae6fd; } -.mdInlineCode { - font-family: ui-monospace, "Cascadia Code", Consolas, monospace; font-size: 12.5px; - background: rgba(125,211,252,0.10); border: 1px solid rgba(125,211,252,0.18); - border-radius: 5px; padding: 1px 5px; word-break: break-word; -} -.codeBlock { - margin: 8px 0; border-radius: 10px; overflow: hidden; - border: 1px solid rgba(255,255,255,0.10); background: #0c0c14; -} -.codeBar { - display: flex; align-items: center; justify-content: space-between; - padding: 4px 8px 4px 12px; background: rgba(255,255,255,0.04); border-bottom: 1px solid rgba(255,255,255,0.08); -} -.codeLang { font-size: 10px; text-transform: uppercase; letter-spacing: 0.06em; color: #6b7280; } -.codeBlock pre { margin: 0; padding: 10px 12px; overflow-x: auto; } -.codeBlock code { - font-family: ui-monospace, "Cascadia Code", Consolas, monospace; font-size: 12.5px; line-height: 1.5; - color: #e5e7eb; white-space: pre; -} -.copyBtn { - border: 1px solid rgba(125,211,252,0.3); background: rgba(125,211,252,0.10); color: #7dd3fc; - font-size: 11px; padding: 2px 8px; border-radius: 6px; cursor: pointer; -webkit-app-region: no-drag; -} -.copyBtn:hover { background: rgba(125,211,252,0.2); } -.msgCopy { - position: absolute; top: 4px; right: 4px; width: 22px; height: 22px; border: none; - background: rgba(255,255,255,0.06); color: #9ca3af; border-radius: 6px; cursor: pointer; - font-size: 12px; opacity: 0; transition: opacity 0.12s; -webkit-app-region: no-drag; -} -.msg.assistant .bubble:hover .msgCopy { opacity: 1; } -.msgCopy:hover { background: rgba(255,255,255,0.14); color: #e5e7eb; } - -/* ---- Hologramm-Look (Holo-Lucy): Silhouetten-Glow + Scanlines + Cyan-Tint ---- */ -/* drop-shadow folgt der Alpha-Silhouette des transparenten WebGL-Canvas -> billiger „Bloom"-Halo */ -.avatarCanvas.holo canvas { - filter: drop-shadow(0 0 5px rgba(90,222,255,0.85)) drop-shadow(0 0 15px rgba(56,190,255,0.5)); -} -.holoTint { - position: absolute; inset: 0; z-index: 2; pointer-events: none; mix-blend-mode: screen; - background: radial-gradient(ellipse 60% 55% at 50% 42%, rgba(60,200,255,0.12), rgba(30,120,255,0.05) 62%, transparent 82%); -} -.holoScan { - position: absolute; inset: 0; z-index: 3; pointer-events: none; mix-blend-mode: screen; - background: repeating-linear-gradient(0deg, rgba(120,230,255,0.07) 0px, rgba(120,230,255,0.07) 1px, transparent 2px, transparent 4px); - animation: holoFlicker 4s infinite; -} -@keyframes holoFlicker { - 0%, 100% { opacity: 0.5; } 48% { opacity: 0.46; } 50% { opacity: 0.72; } 52% { opacity: 0.45; } - 70% { opacity: 0.55; } 71% { opacity: 0.4; } 72% { opacity: 0.55; } 92% { opacity: 0.6; } -} -.holoToggle { - position: absolute; top: 6px; right: 6px; z-index: 6; -webkit-app-region: no-drag; - width: 26px; height: 24px; border-radius: 7px; cursor: pointer; font-size: 13px; - border: 1px solid rgba(125,211,252,0.35); background: rgba(12,12,20,0.5); color: #7dd3fc; -} -.holoToggle:hover { background: rgba(125,211,252,0.2); } -.holoToggle.on { background: rgba(125,211,252,0.28); color: #bae6fd; } diff --git a/client/lucy-desktop/src/renderer/src/voice-core/engines/boxStt.ts b/client/lucy-desktop/src/renderer/src/voice-core/engines/boxStt.ts deleted file mode 100644 index 700f659..0000000 --- a/client/lucy-desktop/src/renderer/src/voice-core/engines/boxStt.ts +++ /dev/null @@ -1,18 +0,0 @@ -// Box-STT-Adapter — Spracherkennung läuft auf der Box (MC2 /api/voice/stt -> Parakeet, -// whisper als Fallback). Der Dateiname muss zum Blob-Typ passen: der Sidecar wählt die -// Dekodierung nach Suffix (Silero-VAD liefert WAV, Push-to-Talk weiterhin webm/opus). -import { BOX_URL } from "../../config" -import type { SttEngine } from "../types" - -export class BoxSttEngine implements SttEngine { - readonly id = "box-stt" - constructor(private readonly baseUrl: string = BOX_URL) {} - - async transcribe(audio: Blob): Promise { - const fd = new FormData() - fd.append("audio", audio, audio.type.includes("wav") ? "rec.wav" : "rec.webm") - const r = await fetch(`${this.baseUrl}/api/voice/stt`, { method: "POST", body: fd }) - if (!r.ok) throw new Error(`STT ${r.status}`) - return (await r.json()).text?.trim() || "" - } -} diff --git a/client/lucy-desktop/src/renderer/src/voice-core/engines/pocketTts.ts b/client/lucy-desktop/src/renderer/src/voice-core/engines/pocketTts.ts deleted file mode 100644 index 9a13c54..0000000 --- a/client/lucy-desktop/src/renderer/src/voice-core/engines/pocketTts.ts +++ /dev/null @@ -1,39 +0,0 @@ -// Pocket-TTS-Adapter — kapselt den lokalen pocket_server (CPU, vom Main-Prozess gespawnt). -// Endpunkte: POST /tts {text}->WAV, POST /tts/stream {text}->PCM16 (+ X-Sample-Rate), GET /health. -import { TTS_URL } from "../../config" -import type { TtsEngine, TtsStreamHandle } from "../types" - -export class PocketTtsEngine implements TtsEngine { - readonly id = "pocket" - constructor(private readonly baseUrl: string = TTS_URL) {} - - async synthesize(text: string): Promise { - const r = await fetch(`${this.baseUrl}/tts`, { - method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ text }), - }) - if (!r.ok) throw new Error(`TTS ${r.status}`) - return r.arrayBuffer() - } - - async synthesizeStream(text: string): Promise { - const r = await fetch(`${this.baseUrl}/tts/stream`, { - method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ text }), - }) - if (!r.ok || !r.body) throw new Error(`TTS ${r.status}`) - const sampleRate = Number(r.headers.get("X-Sample-Rate") || "24000") - return { stream: r.body, sampleRate } - } - - // pocket_server serviert /health erst, wenn das Modell fertig geladen ist (FastAPI-lifespan). - async waitReady(timeoutMs = 120_000): Promise { - const deadline = Date.now() + timeoutMs - while (Date.now() < deadline) { - try { - const h = await (await fetch(`${this.baseUrl}/health`)).json() - if (h.status === "ok") return true - } catch { /* Dienst startet evtl. noch (Spawn + Modell-Load) */ } - await new Promise((r) => setTimeout(r, 1000)) - } - return false - } -} diff --git a/client/lucy-desktop/src/renderer/src/voice-core/index.ts b/client/lucy-desktop/src/renderer/src/voice-core/index.ts deleted file mode 100644 index 67723c6..0000000 --- a/client/lucy-desktop/src/renderer/src/voice-core/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -// voice-core — öffentliche API + aktive Engine-Auswahl. -// Aktuell fest: Pocket-TTS (lokal, Kyutai — macht auch Lucys Voice-Cloning) + Box-Whisper-STT. -// TTS-Engines beschränkt auf pocket (live) + f5 (GPU-Option). ElevenLabs/Edge/Chatterbox/Piper -// waren nur im alten Web-Pfad und sind hier bewusst NICHT dabei. Der Voice-Agent importiert NUR von hier. -import { PocketTtsEngine } from "./engines/pocketTts" -import { BoxSttEngine } from "./engines/boxStt" -import type { SttEngine, TtsEngine } from "./types" - -export const tts: TtsEngine = new PocketTtsEngine() -export const stt: SttEngine = new BoxSttEngine() - -export { SpeechScheduler } from "./speech" -export type { AudioSink } from "./speech" -export type { SttEngine, TtsEngine, TtsStreamHandle } from "./types" diff --git a/client/lucy-desktop/src/renderer/src/voice-core/speech.ts b/client/lucy-desktop/src/renderer/src/voice-core/speech.ts deleted file mode 100644 index 1742264..0000000 --- a/client/lucy-desktop/src/renderer/src/voice-core/speech.ts +++ /dev/null @@ -1,84 +0,0 @@ -// SpeechScheduler — Satz-Pipelining fürs Voll-Duplex-Gefühl (Etappe 2, Schritt 1). -// Nimmt einzelne SÄTZE entgegen, während das Hirn noch streamt, und spricht sie lückenlos -// nacheinander: erstes Audio nach dem ERSTEN Satz statt nach der ganzen Antwort. -// Barge-in-fest über eine Generation (clear() verwirft laufende + wartende Sätze). -import type { TtsEngine, TtsStreamHandle } from "./types" - -// Perf-Diagnose: misst hörbare Stille + Synthese-Zeit je Satz. Abschalten via localStorage lucy_perf=0. -const PERF = typeof localStorage !== "undefined" && localStorage.getItem("lucy_perf") !== "0" - -/** Minimaler Audio-Ausgang (AudioQueue erfüllt diese Form) — hält voice-core von der UI entkoppelt. */ -export interface AudioSink { - playPcmStream(stream: ReadableStream, sampleRate: number): Promise -} - -export class SpeechScheduler { - private pending: string[] = [] - private running = false - private gen = 0 - private lastPlayEnd = 0 // Zeitstempel Ende des vorigen Satzes (für die „Stille davor"-Messung) - /** true, sobald mindestens ein Satz seit dem letzten clear() gesprochen wurde (für Fehlererkennung). */ - playedAny = false - /** Aktiv-Signal: true beim ersten Satz, false wenn alles gesprochen ist (treibt den „speaking"-Status). */ - onBusy?: (busy: boolean) => void - - constructor(private readonly tts: TtsEngine, private readonly sink: AudioSink) {} - - /** Einen fertigen Satz einreihen (leere werden ignoriert) und ggf. den Pump starten. */ - push(text: string): void { - const t = text.trim() - if (!t) return - this.pending.push(t) - if (!this.running) void this.pump() - } - - /** Barge-in / frischer Turn: laufende + wartende Sätze verwerfen. Der Audio-Sink wird separat - * gestoppt (queue.clear()). Setzt die Fehler-/Erfolgs-Erkennung zurück. */ - clear(): void { - this.gen++ - this.pending = [] - this.playedAny = false - this.lastPlayEnd = 0 - } - - /** Wartet, bis alle eingereihten Sätze gesprochen sind. */ - async idle(): Promise { - while (this.running || this.pending.length) await new Promise((r) => setTimeout(r, 40)) - } - - private synth(text: string): Promise { - return this.tts.synthesizeStream(text).catch((e) => { console.error("TTS-Fehler:", e); return null }) - } - - private async pump(): Promise { - if (this.running) return - this.running = true - this.onBusy?.(true) - try { - // SERIELL, KEIN Prefetch: der pocket_server ist Single-Instanz. synthesizeStream liefert den - // Handle schon bei TTFB (Server generiert den Body noch) -> ein vorab angestoßenes Segment - // würde den laufenden Lauf KONKURRIEREN lassen (gemessen bei Tool-Turns: gen 17s statt 5s, - // TTFB-Spitze 14.7s). Gaplessness INNERHALB einer Antwort macht ohnehin der Server (Satz-Split - // + _compress_gaps); hier werden nur die Segmente/Tool-Häppchen der Reihe nach gesprochen. - let idx = 0 - while (this.pending.length) { - const myGen = this.gen - const tWait = performance.now() - const handle = await this.synth(this.pending.shift()!) - const synthWait = performance.now() - tWait - if (myGen !== this.gen) { if (handle) handle.stream.cancel().catch(() => {}); continue } // ge-cleared -> Server sofort freigeben - if (!handle) continue // Synthese fehlgeschlagen -> nächsten Satz versuchen - const gap = this.lastPlayEnd ? tWait - this.lastPlayEnd : 0 // hörbare Stille seit dem letzten Satz - const tPlay = performance.now() - await this.sink.playPcmStream(handle.stream, handle.sampleRate) - this.lastPlayEnd = performance.now() - this.playedAny = true - if (PERF) console.log(`[lucy-perf] TTS Satz #${idx}: Stille davor=${Math.round(gap)}ms · Synth-Warten=${Math.round(synthWait)}ms · Spieldauer=${Math.round(this.lastPlayEnd - tPlay)}ms`) - idx++ - } - } finally { - this.running = false - this.onBusy?.(false) - } - } -} diff --git a/client/lucy-desktop/src/renderer/src/voice-core/types.ts b/client/lucy-desktop/src/renderer/src/voice-core/types.ts deleted file mode 100644 index d465768..0000000 --- a/client/lucy-desktop/src/renderer/src/voice-core/types.ts +++ /dev/null @@ -1,27 +0,0 @@ -// voice-core — Engine-Adapter-Interface (Etappe 0 des Greenfield-Umbaus). -// Ziel: STT/TTS-Backends hinter EINEM Vertrag, damit pocket | f5 | piper | elevenlabs | edge -// austauschbar sind (Config/Picker) und der Voice-Agent nicht mehr direkt an URLs klebt. - -export interface SttEngine { - /** Stabiler Bezeichner der Engine (z. B. "box-whisper"). */ - readonly id: string - /** Audio (webm/opus/wav …) -> erkannter Text (leer, wenn nichts verstanden). */ - transcribe(audio: Blob): Promise -} - -/** Ergebnis einer Streaming-Synthese: fortlaufender PCM16-mono-Stream + Samplerate. */ -export interface TtsStreamHandle { - readonly stream: ReadableStream - readonly sampleRate: number -} - -export interface TtsEngine { - /** Stabiler Bezeichner der Engine (z. B. "pocket"). */ - readonly id: string - /** Vollständige Synthese in einen dekodierbaren Audio-Buffer (z. B. WAV) — für Warm-up. */ - synthesize(text: string): Promise - /** Streaming-PCM16-Synthese für niedrige Time-to-first-audio (die Live-Antwort). */ - synthesizeStream(text: string): Promise - /** Bereitschafts-/Warm-Gate: true, sobald die Engine antwortet (Modell evtl. lazy geladen). */ - waitReady(timeoutMs?: number): Promise -} diff --git a/client/lucy-desktop/start-lucy.cmd b/client/lucy-desktop/start-lucy.cmd deleted file mode 100644 index 54b36f3..0000000 --- a/client/lucy-desktop/start-lucy.cmd +++ /dev/null @@ -1,9 +0,0 @@ -@echo off -title Lucy (Dev) -cd /d "%~dp0" -echo Starte Lucy ... (dieses Fenster offen lassen; schliessen = Lucy beenden) -echo. -call npm run dev -echo. -echo Lucy wurde beendet. Taste druecken zum Schliessen. -pause >nul diff --git a/client/lucy-desktop/tsconfig.json b/client/lucy-desktop/tsconfig.json deleted file mode 100644 index 90dc141..0000000 --- a/client/lucy-desktop/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "module": "ESNext", - "moduleResolution": "bundler", - "jsx": "react-jsx", - "strict": true, - "esModuleInterop": true, - "skipLibCheck": true, - "resolveJsonModule": true, - "lib": ["ES2022", "DOM", "DOM.Iterable"], - "types": ["node", "electron-vite/node"] - }, - "include": ["src"] -} diff --git a/client/lucy-f5/bench_dml.py b/client/lucy-f5/bench_dml.py deleted file mode 100644 index 3f5c976..0000000 --- a/client/lucy-f5/bench_dml.py +++ /dev/null @@ -1,268 +0,0 @@ -import re -import site -import time -import jieba -import torch -import onnxruntime -import soundfile as sf -import numpy as np -from pydub import AudioSegment -from pypinyin import lazy_pinyin, Style -python_package_path = site.getsitepackages()[-1] - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-f5" -vocab_path = BASE + r"\vocab_v1.txt" -onnx_model_A = BASE + r"\onnx_f32\F5_Preprocess.onnx" -onnx_model_B = BASE + r"\onnx_f32\F5_Transformer.onnx" -onnx_model_C = BASE + r"\onnx_f32\F5_Decode.onnx" -generated_audio = BASE + r"\bench_out.wav" -test_in_english = True # eingebaute engl. Referenz -> kein Chinesisch/Pinyin; Tempo ist sprachunabhängig - -if test_in_english: - reference_audio = python_package_path + "/f5_tts/infer/examples/basic/basic_ref_en.wav" - ref_text = "Some call me nature, others call me mother nature." - # realistischer Satz-Längen-Benchmark (wie eine echte Lucy-Antwort): - gen_text = "Of course, Commander. I will restart the service, check the logs, and let you know once everything is running again." -else: - reference_audio = python_package_path + "/f5_tts/infer/examples/basic/basic_ref_zh.wav" # The reference audio path. - ref_text = "对,这就是我,万人敬仰的太乙真人。" # The ASR result of reference audio. - gen_text = "对,这就是我,万人敬仰的大可奇奇。" # The target TTS. - - -import os as _os -ORT_Accelerate_Providers = [_os.environ.get("BENCH_PROVIDER", "DmlExecutionProvider")] # DML (9070 XT) oder CPUExecutionProvider - # else keep empty. -RANDOM_SEED = 9527 # Set seed to reproduce the generated audio -NFE_STEP = int(_os.environ.get("BENCH_NFE", "32")) if (_os := __import__("os")) else 32 # via env testbar -FUSE_NFE = 1 # Maintain the same values as the exported model. -SPEED = 1.0 # Set for talking speed. Only works with dynamic_axes=True -MAX_THREADS = 8 # Max CPU parallel threads. -DEVICE_ID = 0 # The GPU id, default to 0. -MODEL_SAMPLE_RATE = 24000 # Do not modify it. -HOP_LENGTH = 256 # It affects the generated audio length and speech speed. - -if "OpenVINOExecutionProvider" in ORT_Accelerate_Providers: - provider_options = [ - { - 'device_type': 'CPU', # [CPU, NPU, GPU, GPU.0, GPU.1]] - 'precision': 'ACCURACY', # [FP32, FP16, ACCURACY] - 'num_of_threads': MAX_THREADS, - 'num_streams': 1, - 'enable_opencl_throttling': True, - 'enable_qdq_optimizer': False # Enable it carefully - } - ] -elif "CUDAExecutionProvider" in ORT_Accelerate_Providers: - provider_options = [ - { - 'device_id': DEVICE_ID, - 'gpu_mem_limit': 8 * 1024 * 1024 * 1024, # 8 GB - 'arena_extend_strategy': 'kNextPowerOfTwo', - 'cudnn_conv_algo_search': 'EXHAUSTIVE', - 'cudnn_conv_use_max_workspace': '1', - 'do_copy_in_default_stream': '1', - 'cudnn_conv1d_pad_to_nc1d': '1', - 'enable_cuda_graph': '0', # Set to '0' to avoid potential errors when enabled. - 'use_tf32': '0' - } - ] -else: - # Please config by yourself for others providers. - provider_options = None - - -with open(vocab_path, "r", encoding="utf-8") as f: - vocab_char_map = {} - for i, char in enumerate(f): - vocab_char_map[char[:-1]] = i -vocab_size = len(vocab_char_map) - - -# From the official code -def convert_char_to_pinyin(text_list, polyphone=True): - if jieba.dt.initialized is False: - jieba.default_logger.setLevel(50) # CRITICAL - jieba.initialize() - - final_text_list = [] - custom_trans = str.maketrans( - {";": ",", "“": '"', "”": '"', "‘": "'", "’": "'"} - ) # add custom trans here, to address oov - - def is_chinese(c): - return ( - "\u3100" <= c <= "\u9fff" # common chinese characters - ) - - for text in text_list: - char_list = [] - text = text.translate(custom_trans) - for seg in jieba.cut(text): - seg_byte_len = len(bytes(seg, "UTF-8")) - if seg_byte_len == len(seg): # if pure alphabets and symbols - if char_list and seg_byte_len > 1 and char_list[-1] not in " :'\"": - char_list.append(" ") - char_list.extend(seg) - elif polyphone and seg_byte_len == 3 * len(seg): # if pure east asian characters - seg_ = lazy_pinyin(seg, style=Style.TONE3, tone_sandhi=True) - for i, c in enumerate(seg): - if is_chinese(c): - char_list.append(" ") - char_list.append(seg_[i]) - else: # if mixed characters, alphabets and symbols - for c in seg: - if ord(c) < 256: - char_list.extend(c) - elif is_chinese(c): - char_list.append(" ") - char_list.extend(lazy_pinyin(c, style=Style.TONE3, tone_sandhi=True)) - else: - char_list.append(c) - final_text_list.append(char_list) - return final_text_list - - -# From the official code -def list_str_to_idx( - text: list[str] | list[list[str]], - vocab_char_map: dict[str, int], # {char: idx} - padding_value=-1 -): - get_idx = vocab_char_map.get - list_idx_tensors = [torch.tensor([get_idx(c, 0) for c in t], dtype=torch.int32) for t in text] - text = torch.nn.utils.rnn.pad_sequence(list_idx_tensors, padding_value=padding_value, batch_first=True) - return text - - -def normalize_to_int16(audio): - max_val = np.max(np.abs(audio)) - scaling_factor = 32767.0 / max_val if max_val > 0 else 1.0 - return (audio * float(scaling_factor)).astype(np.int16) - - -# ONNX Runtime settings -onnxruntime.set_seed(RANDOM_SEED) -session_opts = onnxruntime.SessionOptions() -session_opts.log_severity_level = 4 # fatal level = 4, it an adjustable value. -session_opts.log_verbosity_level = 4 # fatal level = 4, it an adjustable value. -session_opts.inter_op_num_threads = MAX_THREADS # Run different nodes with num_threads. Set 0 for auto. -session_opts.intra_op_num_threads = MAX_THREADS # Under the node, execute the operators with num_threads. Set 0 for auto. -session_opts.enable_cpu_mem_arena = True # True for execute speed; False for less memory usage. -session_opts.execution_mode = onnxruntime.ExecutionMode.ORT_SEQUENTIAL -session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL -session_opts.add_session_config_entry("session.intra_op.allow_spinning", "1") -session_opts.add_session_config_entry("session.inter_op.allow_spinning", "1") -session_opts.add_session_config_entry("session.set_denormal_as_zero", "1") - -session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL -ort_session_A = onnxruntime.InferenceSession(onnx_model_A, sess_options=session_opts, providers=['CPUExecutionProvider'], provider_options=None) -model_type = ort_session_A._inputs_meta[0].type -in_name_A = ort_session_A.get_inputs() -out_name_A = ort_session_A.get_outputs() -in_name_A0 = in_name_A[0].name -in_name_A1 = in_name_A[1].name -in_name_A2 = in_name_A[2].name -out_name_A0 = out_name_A[0].name -out_name_A1 = out_name_A[1].name -out_name_A2 = out_name_A[2].name -out_name_A3 = out_name_A[3].name -out_name_A4 = out_name_A[4].name -out_name_A5 = out_name_A[5].name -out_name_A6 = out_name_A[6].name -out_name_A7 = out_name_A[7].name - -if "CPUExecutionProvider" in ORT_Accelerate_Providers or not ORT_Accelerate_Providers: - session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL -else: - session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_BASIC -ort_session_B = onnxruntime.InferenceSession(onnx_model_B, sess_options=session_opts, providers=ORT_Accelerate_Providers, provider_options=provider_options) -ORT_Accelerate_Providers = ort_session_B.get_providers()[0] -# For Windows DirectML + Intel/AMD/Nvidia GPU, -# pip install onnxruntime-directml --upgrade -# ort_session_B = onnxruntime.InferenceSession(onnx_model_B, sess_options=session_opts, providers=['DmlExecutionProvider']) -print(f"\nUsable Providers: {ORT_Accelerate_Providers}") -model_dtype = ort_session_B._inputs_meta[0].type -in_name_B = ort_session_B.get_inputs() -out_name_B = ort_session_B.get_outputs() -in_name_B0 = in_name_B[0].name -in_name_B1 = in_name_B[1].name -in_name_B2 = in_name_B[2].name -in_name_B3 = in_name_B[3].name -in_name_B4 = in_name_B[4].name -in_name_B5 = in_name_B[5].name -in_name_B6 = in_name_B[6].name -in_name_B7 = in_name_B[7].name -out_name_B0 = out_name_B[0].name -out_name_B1 = out_name_B[1].name - -session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL -ort_session_C = onnxruntime.InferenceSession(onnx_model_C, sess_options=session_opts, providers=['CPUExecutionProvider'], provider_options=None) -in_name_C = ort_session_C.get_inputs() -out_name_C = ort_session_C.get_outputs() -in_name_C0 = in_name_C[0].name -in_name_C1 = in_name_C[1].name -out_name_C0 = out_name_C[0].name - -# Load the input audio -print(f"\nReference Audio: {reference_audio}") -audio = np.array(AudioSegment.from_file(reference_audio).set_channels(1).set_frame_rate(MODEL_SAMPLE_RATE).get_array_of_samples(), dtype=np.float32) -audio = normalize_to_int16(audio) -audio_len = len(audio) -audio = audio.reshape(1, 1, -1) - -zh_pause_punc = r"。,、;:?!" -ref_text_len = len(ref_text.encode('utf-8')) + 3 * len(re.findall(zh_pause_punc, ref_text)) -gen_text_len = len(gen_text.encode('utf-8')) + 3 * len(re.findall(zh_pause_punc, gen_text)) -ref_audio_len = audio_len // HOP_LENGTH + 1 -max_duration = np.array([ref_audio_len + int(ref_audio_len / ref_text_len * gen_text_len / SPEED)], dtype=np.int64) -gen_text = convert_char_to_pinyin([ref_text + gen_text]) -text_ids = list_str_to_idx(gen_text, vocab_char_map).numpy() -time_step = np.array([0], dtype=np.int32) - -if "CPUExecutionProvider" in ORT_Accelerate_Providers or not ORT_Accelerate_Providers: - device_type = 'cpu' -elif "CUDAExecutionProvider" in ORT_Accelerate_Providers or "TensorrtExecutionProvider" in ORT_Accelerate_Providers: - device_type = 'cuda' -elif "DmlExecutionProvider" in ORT_Accelerate_Providers: - device_type = 'dml' -else: - device_type = None - -def run_pipeline(): - a_out = ort_session_A.run( - [out_name_A0, out_name_A1, out_name_A2, out_name_A3, out_name_A4, out_name_A5, out_name_A6, out_name_A7], - {in_name_A0: audio, in_name_A1: text_ids, in_name_A2: max_duration}) - noise, rope_cos_q, rope_sin_q, rope_cos_k, rope_sin_k, cat_mel_text, cat_mel_text_drop, ref_signal_len = a_out - ts = np.array([0], dtype=np.int32) - if device_type: - inputs = [onnxruntime.OrtValue.ortvalue_from_numpy(x, device_type, DEVICE_ID) for x in - (noise, rope_cos_q, rope_sin_q, rope_cos_k, rope_sin_k, cat_mel_text, cat_mel_text_drop, ts)] - outputs = [inputs[0], inputs[-1]] - iob = ort_session_B.io_binding() - for i in range(len(inputs)): - iob.bind_ortvalue_input(name=in_name_B[i].name, ortvalue=inputs[i]) - for i in range(len(outputs)): - iob.bind_ortvalue_output(name=out_name_B[i].name, ortvalue=outputs[i]) - for _ in range(0, NFE_STEP, FUSE_NFE): - ort_session_B.run_with_iobinding(iob) - noise = onnxruntime.OrtValue.numpy(iob.get_outputs()[0]) - else: - for _ in range(0, NFE_STEP - 1, FUSE_NFE): - noise, ts = ort_session_B.run( - [out_name_B0, out_name_B1], - {in_name_B0: noise, in_name_B1: rope_cos_q, in_name_B2: rope_sin_q, in_name_B3: rope_cos_k, - in_name_B4: rope_sin_k, in_name_B5: cat_mel_text, in_name_B6: cat_mel_text_drop, in_name_B7: ts}) - return ort_session_C.run([out_name_C0], {in_name_C0: noise, in_name_C1: ref_signal_len})[0] - -print(f"\nProvider={ORT_Accelerate_Providers} device_type={device_type} NFE={NFE_STEP}") -print("Warmup (DML kompiliert beim 1. Lauf die Shader) ...") -t0 = time.time(); _ = run_pipeline(); print(f" warmup gen = {time.time()-t0:.2f}s") -best = 1e9 -for k in range(2): - t0 = time.time(); gen = run_pipeline(); dt = time.time() - t0; best = min(best, dt) - print(f" run {k+1}: gen = {dt:.2f}s") -audio_s = gen.reshape(-1).shape[0] / MODEL_SAMPLE_RATE -sf.write(generated_audio, gen.reshape(-1), MODEL_SAMPLE_RATE, format='WAVEX') -rtf = best / max(audio_s, 0.01) -print(f"\n=== ERGEBNIS NFE={NFE_STEP} === audio={audio_s:.2f}s gen(best)={best:.2f}s RTF={rtf:.2f} " - f"({'REAL-TIME' if rtf < 1 else 'zu langsam'})") diff --git a/client/lucy-f5/dakeqq_infer.py b/client/lucy-f5/dakeqq_infer.py deleted file mode 100644 index bf98269..0000000 --- a/client/lucy-f5/dakeqq_infer.py +++ /dev/null @@ -1,298 +0,0 @@ -import re -import site -import time -import jieba -import torch -import onnxruntime -import soundfile as sf -import numpy as np -from pydub import AudioSegment -from pypinyin import lazy_pinyin, Style -python_package_path = site.getsitepackages()[-1] - -vocab_path = "/home/DakeQQ/Downloads/F5TTS_v1_Base/vocab.txt" # The F5-TTS model vocab download path. URL: https://huggingface.co/SWivid/F5-TTS/tree/main/F5TTS_v1_Base -onnx_model_A = "/home/DakeQQ/Downloads/F5_Optimized/F5_Preprocess.onnx" # The exported onnx model path. -onnx_model_B = "/home/DakeQQ/Downloads/F5_Optimized/F5_Transformer.onnx" # The exported onnx model path. -onnx_model_C = "/home/DakeQQ/Downloads/F5_Optimized/F5_Decode.onnx" # The exported onnx model path. -generated_audio = "./generated_audio.wav" -test_in_english = False - -if test_in_english: - reference_audio = python_package_path + "/f5_tts/infer/examples/basic/basic_ref_en.wav" - ref_text = "Some call me nature, others call me mother nature." - gen_text = "Some call me Dake, others call me QQ." -else: - reference_audio = python_package_path + "/f5_tts/infer/examples/basic/basic_ref_zh.wav" # The reference audio path. - ref_text = "对,这就是我,万人敬仰的太乙真人。" # The ASR result of reference audio. - gen_text = "对,这就是我,万人敬仰的大可奇奇。" # The target TTS. - - -ORT_Accelerate_Providers = ['CPUExecutionProvider'] # If you have accelerate devices for : ['CUDAExecutionProvider', 'TensorrtExecutionProvider', 'CoreMLExecutionProvider', 'DmlExecutionProvider', 'OpenVINOExecutionProvider', 'ROCMExecutionProvider', 'MIGraphXExecutionProvider', 'AzureExecutionProvider'] - # else keep empty. -RANDOM_SEED = 9527 # Set seed to reproduce the generated audio -NFE_STEP = 32 # F5-TTS model setting, 0~31 -FUSE_NFE = 1 # Maintain the same values as the exported model. -SPEED = 1.0 # Set for talking speed. Only works with dynamic_axes=True -MAX_THREADS = 8 # Max CPU parallel threads. -DEVICE_ID = 0 # The GPU id, default to 0. -MODEL_SAMPLE_RATE = 24000 # Do not modify it. -HOP_LENGTH = 256 # It affects the generated audio length and speech speed. - -if "OpenVINOExecutionProvider" in ORT_Accelerate_Providers: - provider_options = [ - { - 'device_type': 'CPU', # [CPU, NPU, GPU, GPU.0, GPU.1]] - 'precision': 'ACCURACY', # [FP32, FP16, ACCURACY] - 'num_of_threads': MAX_THREADS, - 'num_streams': 1, - 'enable_opencl_throttling': True, - 'enable_qdq_optimizer': False # Enable it carefully - } - ] -elif "CUDAExecutionProvider" in ORT_Accelerate_Providers: - provider_options = [ - { - 'device_id': DEVICE_ID, - 'gpu_mem_limit': 8 * 1024 * 1024 * 1024, # 8 GB - 'arena_extend_strategy': 'kNextPowerOfTwo', - 'cudnn_conv_algo_search': 'EXHAUSTIVE', - 'cudnn_conv_use_max_workspace': '1', - 'do_copy_in_default_stream': '1', - 'cudnn_conv1d_pad_to_nc1d': '1', - 'enable_cuda_graph': '0', # Set to '0' to avoid potential errors when enabled. - 'use_tf32': '0' - } - ] -else: - # Please config by yourself for others providers. - provider_options = None - - -with open(vocab_path, "r", encoding="utf-8") as f: - vocab_char_map = {} - for i, char in enumerate(f): - vocab_char_map[char[:-1]] = i -vocab_size = len(vocab_char_map) - - -# From the official code -def convert_char_to_pinyin(text_list, polyphone=True): - if jieba.dt.initialized is False: - jieba.default_logger.setLevel(50) # CRITICAL - jieba.initialize() - - final_text_list = [] - custom_trans = str.maketrans( - {";": ",", "“": '"', "”": '"', "‘": "'", "’": "'"} - ) # add custom trans here, to address oov - - def is_chinese(c): - return ( - "\u3100" <= c <= "\u9fff" # common chinese characters - ) - - for text in text_list: - char_list = [] - text = text.translate(custom_trans) - for seg in jieba.cut(text): - seg_byte_len = len(bytes(seg, "UTF-8")) - if seg_byte_len == len(seg): # if pure alphabets and symbols - if char_list and seg_byte_len > 1 and char_list[-1] not in " :'\"": - char_list.append(" ") - char_list.extend(seg) - elif polyphone and seg_byte_len == 3 * len(seg): # if pure east asian characters - seg_ = lazy_pinyin(seg, style=Style.TONE3, tone_sandhi=True) - for i, c in enumerate(seg): - if is_chinese(c): - char_list.append(" ") - char_list.append(seg_[i]) - else: # if mixed characters, alphabets and symbols - for c in seg: - if ord(c) < 256: - char_list.extend(c) - elif is_chinese(c): - char_list.append(" ") - char_list.extend(lazy_pinyin(c, style=Style.TONE3, tone_sandhi=True)) - else: - char_list.append(c) - final_text_list.append(char_list) - return final_text_list - - -# From the official code -def list_str_to_idx( - text: list[str] | list[list[str]], - vocab_char_map: dict[str, int], # {char: idx} - padding_value=-1 -): - get_idx = vocab_char_map.get - list_idx_tensors = [torch.tensor([get_idx(c, 0) for c in t], dtype=torch.int32) for t in text] - text = torch.nn.utils.rnn.pad_sequence(list_idx_tensors, padding_value=padding_value, batch_first=True) - return text - - -def normalize_to_int16(audio): - max_val = np.max(np.abs(audio)) - scaling_factor = 32767.0 / max_val if max_val > 0 else 1.0 - return (audio * float(scaling_factor)).astype(np.int16) - - -# ONNX Runtime settings -onnxruntime.set_seed(RANDOM_SEED) -session_opts = onnxruntime.SessionOptions() -session_opts.log_severity_level = 4 # fatal level = 4, it an adjustable value. -session_opts.log_verbosity_level = 4 # fatal level = 4, it an adjustable value. -session_opts.inter_op_num_threads = MAX_THREADS # Run different nodes with num_threads. Set 0 for auto. -session_opts.intra_op_num_threads = MAX_THREADS # Under the node, execute the operators with num_threads. Set 0 for auto. -session_opts.enable_cpu_mem_arena = True # True for execute speed; False for less memory usage. -session_opts.execution_mode = onnxruntime.ExecutionMode.ORT_SEQUENTIAL -session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL -session_opts.add_session_config_entry("session.intra_op.allow_spinning", "1") -session_opts.add_session_config_entry("session.inter_op.allow_spinning", "1") -session_opts.add_session_config_entry("session.set_denormal_as_zero", "1") - -session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL -ort_session_A = onnxruntime.InferenceSession(onnx_model_A, sess_options=session_opts, providers=['CPUExecutionProvider'], provider_options=None) -model_type = ort_session_A._inputs_meta[0].type -in_name_A = ort_session_A.get_inputs() -out_name_A = ort_session_A.get_outputs() -in_name_A0 = in_name_A[0].name -in_name_A1 = in_name_A[1].name -in_name_A2 = in_name_A[2].name -out_name_A0 = out_name_A[0].name -out_name_A1 = out_name_A[1].name -out_name_A2 = out_name_A[2].name -out_name_A3 = out_name_A[3].name -out_name_A4 = out_name_A[4].name -out_name_A5 = out_name_A[5].name -out_name_A6 = out_name_A[6].name -out_name_A7 = out_name_A[7].name - -if "CPUExecutionProvider" in ORT_Accelerate_Providers or not ORT_Accelerate_Providers: - session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL -else: - session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_BASIC -ort_session_B = onnxruntime.InferenceSession(onnx_model_B, sess_options=session_opts, providers=ORT_Accelerate_Providers, provider_options=provider_options) -ORT_Accelerate_Providers = ort_session_B.get_providers()[0] -# For Windows DirectML + Intel/AMD/Nvidia GPU, -# pip install onnxruntime-directml --upgrade -# ort_session_B = onnxruntime.InferenceSession(onnx_model_B, sess_options=session_opts, providers=['DmlExecutionProvider']) -print(f"\nUsable Providers: {ORT_Accelerate_Providers}") -model_dtype = ort_session_B._inputs_meta[0].type -in_name_B = ort_session_B.get_inputs() -out_name_B = ort_session_B.get_outputs() -in_name_B0 = in_name_B[0].name -in_name_B1 = in_name_B[1].name -in_name_B2 = in_name_B[2].name -in_name_B3 = in_name_B[3].name -in_name_B4 = in_name_B[4].name -in_name_B5 = in_name_B[5].name -in_name_B6 = in_name_B[6].name -in_name_B7 = in_name_B[7].name -out_name_B0 = out_name_B[0].name -out_name_B1 = out_name_B[1].name - -session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL -ort_session_C = onnxruntime.InferenceSession(onnx_model_C, sess_options=session_opts, providers=['CPUExecutionProvider'], provider_options=None) -in_name_C = ort_session_C.get_inputs() -out_name_C = ort_session_C.get_outputs() -in_name_C0 = in_name_C[0].name -in_name_C1 = in_name_C[1].name -out_name_C0 = out_name_C[0].name - -# Load the input audio -print(f"\nReference Audio: {reference_audio}") -audio = np.array(AudioSegment.from_file(reference_audio).set_channels(1).set_frame_rate(MODEL_SAMPLE_RATE).get_array_of_samples(), dtype=np.float32) -audio = normalize_to_int16(audio) -audio_len = len(audio) -audio = audio.reshape(1, 1, -1) - -zh_pause_punc = r"。,、;:?!" -ref_text_len = len(ref_text.encode('utf-8')) + 3 * len(re.findall(zh_pause_punc, ref_text)) -gen_text_len = len(gen_text.encode('utf-8')) + 3 * len(re.findall(zh_pause_punc, gen_text)) -ref_audio_len = audio_len // HOP_LENGTH + 1 -max_duration = np.array([ref_audio_len + int(ref_audio_len / ref_text_len * gen_text_len / SPEED)], dtype=np.int64) -gen_text = convert_char_to_pinyin([ref_text + gen_text]) -text_ids = list_str_to_idx(gen_text, vocab_char_map).numpy() -time_step = np.array([0], dtype=np.int32) - -if "CPUExecutionProvider" in ORT_Accelerate_Providers or not ORT_Accelerate_Providers: - device_type = 'cpu' -elif "CUDAExecutionProvider" in ORT_Accelerate_Providers or "TensorrtExecutionProvider" in ORT_Accelerate_Providers: - device_type = 'cuda' -elif "DmlExecutionProvider" in ORT_Accelerate_Providers: - device_type = 'dml' -else: - device_type = None - -print("\n\nRun F5-TTS by ONNX Runtime.") -start_count = time.time() -noise, rope_cos_q, rope_sin_q, rope_cos_k, rope_sin_k, cat_mel_text, cat_mel_text_drop, ref_signal_len = ort_session_A.run( - [out_name_A0, out_name_A1, out_name_A2, out_name_A3, out_name_A4, out_name_A5, out_name_A6, out_name_A7], - { - in_name_A0: audio, - in_name_A1: text_ids, - in_name_A2: max_duration - }) - -if device_type: - inputs = [ - onnxruntime.OrtValue.ortvalue_from_numpy(noise, device_type, DEVICE_ID), - onnxruntime.OrtValue.ortvalue_from_numpy(rope_cos_q, device_type, DEVICE_ID), - onnxruntime.OrtValue.ortvalue_from_numpy(rope_sin_q, device_type, DEVICE_ID), - onnxruntime.OrtValue.ortvalue_from_numpy(rope_cos_k, device_type, DEVICE_ID), - onnxruntime.OrtValue.ortvalue_from_numpy(rope_sin_k, device_type, DEVICE_ID), - onnxruntime.OrtValue.ortvalue_from_numpy(cat_mel_text, device_type, DEVICE_ID), - onnxruntime.OrtValue.ortvalue_from_numpy(cat_mel_text_drop, device_type, DEVICE_ID), - onnxruntime.OrtValue.ortvalue_from_numpy(time_step, device_type, DEVICE_ID) - ] - outputs = [ - inputs[0], - inputs[-1] - ] - - io_binding = ort_session_B.io_binding() - for i in range(len(inputs)): - io_binding.bind_ortvalue_input( - name=in_name_B[i].name, - ortvalue=inputs[i] - ) - for i in range(len(outputs)): - io_binding.bind_ortvalue_output( - name=out_name_B[i].name, - ortvalue=outputs[i] - ) - - print("NFE_STEP: 0") - for i in range(0, NFE_STEP, FUSE_NFE): - ort_session_B.run_with_iobinding(io_binding) - print(f"NFE_STEP: {i + FUSE_NFE}") - noise = onnxruntime.OrtValue.numpy(io_binding.get_outputs()[0]) -else: - print("NFE_STEP: 0") - for i in range(0, NFE_STEP - 1, FUSE_NFE): - noise, time_step = ort_session_B.run( - [out_name_B0, out_name_B1], - { - in_name_B0: noise, - in_name_B1: rope_cos_q, - in_name_B2: rope_sin_q, - in_name_B3: rope_cos_k, - in_name_B4: rope_sin_k, - in_name_B5: cat_mel_text, - in_name_B6: cat_mel_text_drop, - in_name_B7: time_step - }) - print(f"NFE_STEP: {i + FUSE_NFE}") - -generated_signal = ort_session_C.run( - [out_name_C0], - { - in_name_C0: noise, - in_name_C1: ref_signal_len - })[0] -end_count = time.time() - -# Save to audio -sf.write(generated_audio, generated_signal.reshape(-1), MODEL_SAMPLE_RATE, format='WAVEX') -print(f"\nAudio generation is complete.\n\nONNXRuntime Time Cost in Seconds:\n{end_count - start_count:.3f}") diff --git a/client/lucy-f5/f5_server.py b/client/lucy-f5/f5_server.py deleted file mode 100644 index 87d9806..0000000 --- a/client/lucy-f5/f5_server.py +++ /dev/null @@ -1,196 +0,0 @@ -# -*- coding: utf-8 -*- -"""Lucy-Stimme v2: F5-TTS (deutsch) via ONNX Runtime + DirectML (9070 XT, nativ Windows, kein ROCm). -Non-autoregressiv -> keine Kollaps-/Wiederhol-/Männerstimmen-Fehler wie pocket. Satzweises Streaming. -Modelliert nach dem verifizierten DML-Benchmark (bench_dml.py) + Export_F5-Preprocessing + pocket_server-Struktur.""" -import os, io, re, time, threading, logging -import numpy as np, soundfile as sf, librosa, jieba, torch -import onnxruntime as ort -from pypinyin import lazy_pinyin, Style -from fastapi import FastAPI -from fastapi.responses import Response, JSONResponse, StreamingResponse -from pydantic import BaseModel -from contextlib import asynccontextmanager - -log = logging.getLogger("lucy-f5"); logging.basicConfig(level=logging.INFO) -BASE = os.path.dirname(os.path.abspath(__file__)) -ONNX_DIR = os.environ.get("LUCY_F5_ONNX", os.path.join(BASE, "onnx_de")) -VOCAB = os.environ.get("LUCY_F5_VOCAB", os.path.join(BASE, "vocab.txt")) -REF_WAV = os.environ.get("LUCY_F5_REF", os.path.join(BASE, "lucy_ref.wav")) -REF_TXT = os.environ.get("LUCY_F5_REF_TXT", os.path.join(BASE, "lucy_ref.txt")) -PROVIDER = os.environ.get("LUCY_F5_PROVIDER", "DmlExecutionProvider") -NFE_STEP = int(os.environ.get("LUCY_F5_NFE", "32")) # MUSS zum Export passen (Zeitplan ist eingebacken) -TARGET_RMS = float(os.environ.get("LUCY_TARGET_RMS", "0.09")) -SR = 24000; HOP_LENGTH = 256 -STATE, LOCK = {}, threading.Lock() - -# ---- Text-Preprocessing (aus Export_F5.py; für Deutsch laufen Nicht-CJK-Zeichen einfach durch) ---- -def _load_vocab(path): - m = {} - with open(path, "r", encoding="utf-8") as f: - for i, ch in enumerate(f): - m[ch[:-1]] = i - return m - -def convert_char_to_pinyin(text_list, polyphone=True): - if jieba.dt.initialized is False: - jieba.default_logger.setLevel(50); jieba.initialize() - out, trans = [], str.maketrans({";": ",", "“": '"', "”": '"', "‘": "'", "’": "'"}) - def is_zh(c): return "㄀" <= c <= "鿿" - for text in text_list: - cl = []; text = text.translate(trans) - for seg in jieba.cut(text): - blen = len(bytes(seg, "UTF-8")) - if blen == len(seg): - if cl and blen > 1 and cl[-1] not in " :'\"": cl.append(" ") - cl.extend(seg) - elif polyphone and blen == 3 * len(seg): - pin = lazy_pinyin(seg, style=Style.TONE3, tone_sandhi=True) - for i, c in enumerate(seg): - if is_zh(c): cl.append(" ") - cl.append(pin[i]) - else: - for c in seg: - if ord(c) < 256: cl.extend(c) - elif is_zh(c): cl.append(" "); cl.extend(lazy_pinyin(c, style=Style.TONE3, tone_sandhi=True)) - else: cl.append(c) - out.append(cl) - return out - -def list_str_to_idx(text, vocab_map, padding_value=-1): - get = vocab_map.get - tensors = [torch.tensor([get(c, 0) for c in t], dtype=torch.int32) for t in text] - return torch.nn.utils.rnn.pad_sequence(tensors, padding_value=padding_value, batch_first=True).numpy() - -_ZH_PUNC = r"。,、;:?!" -def _text_len(s): return len(s.encode("utf-8")) + 3 * len(re.findall(_ZH_PUNC, s)) - -# ---- Satz-Splitter (wie pocket) ---- -_SENT_RX = re.compile(r".+?(?:[.!?…]+(?:\s|$)|$)", re.S) -def split_sentences(text, min_len=30): - parts = [m.group(0).strip() for m in _SENT_RX.finditer(text.strip())] - out = [] - for p in parts: - if not p: continue - if out and len(out[-1]) < min_len: out[-1] = f"{out[-1]} {p}" - else: out.append(p) - return out or [text.strip()] - -def cleanup(a, sr): - """F5-Output putzen: Stille-Trim hinten, RMS-Norm auf TARGET_RMS, Peak-Clamp, 80ms-Pads.""" - a = np.asarray(a, dtype=np.float32).reshape(-1) - if a.size == 0: return a - rev, _ = librosa.effects.trim(a[::-1], top_db=40); a = rev[::-1] if rev.size else a - yt, _ = librosa.effects.trim(a, top_db=40); a = yt if yt.size else a - rms = float(np.sqrt(np.mean(a ** 2))) or 1e-9 - a = a * (TARGET_RMS / rms) - peak = float(np.max(np.abs(a))) - if peak > 0.95: a = a * (0.95 / peak) - fi = min(int(0.008 * sr), a.size // 2) - if fi > 0: - a[:fi] *= np.linspace(0., 1., fi, dtype=np.float32); a[-fi:] *= np.linspace(1., 0., fi, dtype=np.float32) - pad = np.zeros(int(0.08 * sr), dtype=np.float32) - return np.concatenate([pad, a, pad]) - -def _to_pcm16(a): - a = np.asarray(a, dtype=np.float32).reshape(-1) - np.clip(a, -0.95, 0.95, out=a) - return (a * 32767.0).astype(" np.ndarray: - s = STATE - ref_text = s["ref_text"] - rt_len = _text_len(ref_text); gt_len = max(_text_len(gen_text), 1) - ref_audio_len = s["ref_audio"].shape[-1] // HOP_LENGTH + 1 - max_duration = np.array([ref_audio_len + int(ref_audio_len / rt_len * gt_len)], dtype=np.int64) - text = convert_char_to_pinyin([ref_text + gen_text]) - text_ids = list_str_to_idx(text, s["vocab"]) - A = s["A"].run(s["A_out"], {s["A_in"][0]: s["ref_audio"], s["A_in"][1]: text_ids, s["A_in"][2]: max_duration}) - noise, rcq, rsq, rck, rsk, cmt, cmtd, ref_signal_len = A - dev = s["dev"] - if dev: # DirectML/CUDA: io_binding, Tensoren GPU-resident über die NFE-Schleife - ts = np.array([0], dtype=np.int32) - ins = [ort.OrtValue.ortvalue_from_numpy(x, dev, 0) for x in (noise, rcq, rsq, rck, rsk, cmt, cmtd, ts)] - outs = [ins[0], ins[-1]] - iob = s["B"].io_binding() - for i in range(len(ins)): iob.bind_ortvalue_input(name=s["B_in"][i], ortvalue=ins[i]) - for i in range(len(outs)): iob.bind_ortvalue_output(name=s["B_out"][i], ortvalue=outs[i]) - for _ in range(0, NFE_STEP, 1): s["B"].run_with_iobinding(iob) - noise = ort.OrtValue.numpy(iob.get_outputs()[0]) - else: - ts = np.array([0], dtype=np.int32) - for _ in range(0, NFE_STEP - 1, 1): - noise, ts = s["B"].run(s["B_out"], {s["B_in"][0]: noise, s["B_in"][1]: rcq, s["B_in"][2]: rsq, - s["B_in"][3]: rck, s["B_in"][4]: rsk, s["B_in"][5]: cmt, s["B_in"][6]: cmtd, s["B_in"][7]: ts}) - out = s["C"].run([s["C_out"]], {s["C_in"][0]: noise, s["C_in"][1]: ref_signal_len})[0] - a = np.asarray(out).reshape(-1).astype(np.float32) - if a.dtype != np.float32 or np.max(np.abs(a)) > 1.5: # int16-Decoder -> auf float - a = a / 32768.0 - return a - -@asynccontextmanager -async def lifespan(app): - t0 = time.time(); log.info("Lade F5 ONNX (%s) ...", PROVIDER) - so = ort.SessionOptions(); so.log_severity_level = 4 - so.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALL - A = ort.InferenceSession(os.path.join(ONNX_DIR, "F5_Preprocess.onnx"), so, providers=["CPUExecutionProvider"]) - B = ort.InferenceSession(os.path.join(ONNX_DIR, "F5_Transformer.onnx"), so, providers=[PROVIDER]) - C = ort.InferenceSession(os.path.join(ONNX_DIR, "F5_Decode.onnx"), so, providers=["CPUExecutionProvider"]) - prov = B.get_providers()[0] - dev = "dml" if "Dml" in prov else ("cuda" if "CUDA" in prov or "Tensorrt" in prov else None) - # Lucy-Referenz als int16 laden (Decoder/Preprocess erwartet int16-Pfad) - ref, _sr = sf.read(REF_WAV, dtype="float32", always_2d=False) - ref = np.asarray(ref, dtype=np.float32).reshape(-1) - if _sr != SR: ref = librosa.resample(ref, orig_sr=_sr, target_sr=SR) - mx = np.max(np.abs(ref)) or 1.0 - ref_i16 = (ref * (32767.0 / mx)).astype(np.int16).reshape(1, 1, -1) - STATE.update( - A=A, B=B, C=C, dev=dev, prov=prov, - A_in=[i.name for i in A.get_inputs()], A_out=[o.name for o in A.get_outputs()], - B_in=[i.name for i in B.get_inputs()], B_out=[o.name for o in B.get_outputs()], - C_in=[i.name for i in C.get_inputs()], C_out=C.get_outputs()[0].name, - vocab=_load_vocab(VOCAB), ref_audio=ref_i16, - ref_text=open(REF_TXT, encoding="utf-8").read().strip(), - ) - log.info("Lucy-F5 bereit in %.1fs (Provider=%s, dev=%s, NFE=%d)", time.time() - t0, prov, dev, NFE_STEP) - yield - STATE.clear() - -app = FastAPI(title="Lucy TTS (F5/DirectML)", lifespan=lifespan) - -class Req(BaseModel): - text: str - -@app.get("/health") -def health(): - return {"status": "ok" if "A" in STATE else "loading", "engine": "f5-tts", - "provider": STATE.get("prov"), "nfe": NFE_STEP, "sr": SR} - -@app.post("/tts") -def tts(req: Req): - if "A" not in STATE: return JSONResponse({"error": "loading"}, status_code=503) - t0 = time.time() - parts = [] - with LOCK: - for sent in split_sentences(req.text): - parts.append(cleanup(_infer(sent), SR)) - a = np.concatenate(parts) if parts else np.zeros(0, np.float32) - buf = io.BytesIO(); sf.write(buf, a, SR, format="WAV", subtype="PCM_16"); buf.seek(0) - dur = a.size / SR; gen = time.time() - t0 - log.info("/tts %dZ audio=%.1fs gen=%.1fs rtf=%.2f", len(req.text), dur, gen, gen / max(dur, 0.01)) - return Response(buf.read(), media_type="audio/wav", - headers={"X-Audio-Seconds": f"{dur:.2f}", "X-Gen-Seconds": f"{gen:.2f}"}) - -@app.post("/tts/stream") -def tts_stream(req: Req): - if "A" not in STATE: return JSONResponse({"error": "loading"}, status_code=503) - sentences = split_sentences(req.text) - def pcm(): - t0 = time.time(); total = 0; first = True - with LOCK: - for sent in sentences: - a = cleanup(_infer(sent), SR); total += a.size - if first: log.info("/tts/stream TTFB=%.2fs (%d Sätze)", time.time() - t0, len(sentences)); first = False - yield _to_pcm16(a) - log.info("/tts/stream %dZ audio=%.1fs gen=%.1fs", len(req.text), total / SR, time.time() - t0) - return StreamingResponse(pcm(), media_type="application/octet-stream", headers={"X-Sample-Rate": str(SR)}) diff --git a/client/lucy-f5/f5_test.py b/client/lucy-f5/f5_test.py deleted file mode 100644 index d35db51..0000000 --- a/client/lucy-f5/f5_test.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- -"""F5-TTS Qualitäts-/Tempo-Test (CPU): dt. Finetune + Lucy-Klon. Gleiche Sätze wie pocket -> A/B.""" -import os, time, soundfile as sf, numpy as np, torch -# torchcodec/ffmpeg fehlt -> torchaudio.load/save auf soundfile umbiegen (wie bei OuteTTS-Patch) -import torchaudio -def _ta_load(path, *a, **k): - data, sr = sf.read(str(path), dtype="float32", always_2d=True) - return torch.from_numpy(data.T.copy()), sr -def _ta_save(path, tensor, sr, *a, **k): - arr = np.asarray(tensor.detach().cpu().numpy()) - sf.write(str(path), arr.T if arr.ndim == 2 else arr, sr) -torchaudio.load = _ta_load -torchaudio.save = _ta_save -from f5_tts.api import F5TTS - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-f5" -OUT = r"C:\Users\TobisPC\Desktop\lucy_f5_test"; os.makedirs(OUT, exist_ok=True) -ref = os.path.join(BASE, "lucy_ref.wav") -ref_text = open(os.path.join(BASE, "lucy_ref.txt"), encoding="utf-8").read().strip() -print("REF_TEXT:", ref_text[:80], flush=True) - -t0 = time.time() -f5 = F5TTS(model="F5TTS_Base", - ckpt_file=os.path.join(BASE, "model_f5tts_german.safetensors"), - vocab_file=os.path.join(BASE, "vocab.txt"), device="cpu") -print(f"Modell geladen in {time.time()-t0:.1f}s (Vocoder evtl. erst geladen)", flush=True) - -SENT = { - "kurz": "Hallo Commander, ich höre dich.", - "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", - "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", -} -for name, text in SENT.items(): - t0 = time.time() - wav, sr, _ = f5.infer(ref_file=ref, ref_text=ref_text, gen_text=text, - nfe_step=32, target_rms=0.1, remove_silence=True) - dt = time.time() - t0 - wav = np.asarray(wav, dtype=np.float32).reshape(-1) - peak = float(np.max(np.abs(wav))) # Peak-Limiter gegen Clipping (F5 traf 1.0) - if peak > 0.95: wav = wav * (0.95 / peak) - sf.write(os.path.join(OUT, f"{name}.wav"), wav, sr) - secs = len(wav) / sr - print(f"[{name:6}] gen={dt:6.1f}s audio={secs:5.1f}s RTF={dt/max(secs,0.01):5.2f}", flush=True) -print("F5_TEST_DONE", flush=True) diff --git a/client/lucy-f5/lucy_ref.txt b/client/lucy-f5/lucy_ref.txt deleted file mode 100644 index d8a4918..0000000 --- a/client/lucy-f5/lucy_ref.txt +++ /dev/null @@ -1 +0,0 @@ -Hallo, schön, dass du da bist. Ich bin deine persönliche Assistentin und begleite dich durch deinen Tag. \ No newline at end of file diff --git a/client/lucy-f5/vocab.txt b/client/lucy-f5/vocab.txt deleted file mode 100644 index a30a90c..0000000 --- a/client/lucy-f5/vocab.txt +++ /dev/null @@ -1,2545 +0,0 @@ - -! -" -# -$ -% -& -' -( -) -* -+ -, -- -. -/ -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -: -; -= -> -? -@ -A -B -C -D -E -F -G -H -I -J -K -L -M -N -O -P -Q -R -S -T -U -V -W -X -Y -Z -[ -\ -] -_ -a -a1 -ai1 -ai2 -ai3 -ai4 -an1 -an3 -an4 -ang1 -ang2 -ang4 -ao1 -ao2 -ao3 -ao4 -b -ba -ba1 -ba2 -ba3 -ba4 -bai1 -bai2 -bai3 -bai4 -ban1 -ban2 -ban3 -ban4 -bang1 -bang2 -bang3 -bang4 -bao1 -bao2 -bao3 -bao4 -bei -bei1 -bei2 -bei3 -bei4 -ben1 -ben2 -ben3 -ben4 -beng -beng1 -beng2 -beng3 -beng4 -bi1 -bi2 -bi3 -bi4 -bian1 -bian2 -bian3 -bian4 -biao1 -biao2 -biao3 -bie1 -bie2 -bie3 -bie4 -bin1 -bin4 -bing1 -bing2 -bing3 -bing4 -bo -bo1 -bo2 -bo3 -bo4 -bu2 -bu3 -bu4 -c -ca1 -cai1 -cai2 -cai3 -cai4 -can1 -can2 -can3 -can4 -cang1 -cang2 -cao1 -cao2 -cao3 -ce4 -cen1 -cen2 -ceng1 -ceng2 -ceng4 -cha1 -cha2 -cha3 -cha4 -chai1 -chai2 -chan1 -chan2 -chan3 -chan4 -chang1 -chang2 -chang3 -chang4 -chao1 -chao2 -chao3 -che1 -che2 -che3 -che4 -chen1 -chen2 -chen3 -chen4 -cheng1 -cheng2 -cheng3 -cheng4 -chi1 -chi2 -chi3 -chi4 -chong1 -chong2 -chong3 -chong4 -chou1 -chou2 -chou3 -chou4 -chu1 -chu2 -chu3 -chu4 -chua1 -chuai1 -chuai2 -chuai3 -chuai4 -chuan1 -chuan2 -chuan3 -chuan4 -chuang1 -chuang2 -chuang3 -chuang4 -chui1 -chui2 -chun1 -chun2 -chun3 -chuo1 -chuo4 -ci1 -ci2 -ci3 -ci4 -cong1 -cong2 -cou4 -cu1 -cu4 -cuan1 -cuan2 -cuan4 -cui1 -cui3 -cui4 -cun1 -cun2 -cun4 -cuo1 -cuo2 -cuo4 -d -da -da1 -da2 -da3 -da4 -dai1 -dai2 -dai3 -dai4 -dan1 -dan2 -dan3 -dan4 -dang1 -dang2 -dang3 -dang4 -dao1 -dao2 -dao3 -dao4 -de -de1 -de2 -dei3 -den4 -deng1 -deng2 -deng3 -deng4 -di1 -di2 -di3 -di4 -dia3 -dian1 -dian2 -dian3 -dian4 -diao1 -diao3 -diao4 -die1 -die2 -die4 -ding1 -ding2 -ding3 -ding4 -diu1 -dong1 -dong3 -dong4 -dou1 -dou2 -dou3 -dou4 -du1 -du2 -du3 -du4 -duan1 -duan2 -duan3 -duan4 -dui1 -dui4 -dun1 -dun3 -dun4 -duo1 -duo2 -duo3 -duo4 -e -e1 -e2 -e3 -e4 -ei2 -en1 -en4 -er -er2 -er3 -er4 -f -fa1 -fa2 -fa3 -fa4 -fan1 -fan2 -fan3 -fan4 -fang1 -fang2 -fang3 -fang4 -fei1 -fei2 -fei3 -fei4 -fen1 -fen2 -fen3 -fen4 -feng1 -feng2 -feng3 -feng4 -fo2 -fou2 -fou3 -fu1 -fu2 -fu3 -fu4 -g -ga1 -ga2 -ga3 -ga4 -gai1 -gai2 -gai3 -gai4 -gan1 -gan2 -gan3 -gan4 -gang1 -gang2 -gang3 -gang4 -gao1 -gao2 -gao3 -gao4 -ge1 -ge2 -ge3 -ge4 -gei2 -gei3 -gen1 -gen2 -gen3 -gen4 -geng1 -geng3 -geng4 -gong1 -gong3 -gong4 -gou1 -gou2 -gou3 -gou4 -gu -gu1 -gu2 -gu3 -gu4 -gua1 -gua2 -gua3 -gua4 -guai1 -guai2 -guai3 -guai4 -guan1 -guan2 -guan3 -guan4 -guang1 -guang2 -guang3 -guang4 -gui1 -gui2 -gui3 -gui4 -gun3 -gun4 -guo1 -guo2 -guo3 -guo4 -h -ha1 -ha2 -ha3 -hai1 -hai2 -hai3 -hai4 -han1 -han2 -han3 -han4 -hang1 -hang2 -hang4 -hao1 -hao2 -hao3 -hao4 -he1 -he2 -he4 -hei1 -hen2 -hen3 -hen4 -heng1 -heng2 -heng4 -hong1 -hong2 -hong3 -hong4 -hou1 -hou2 -hou3 -hou4 -hu1 -hu2 -hu3 -hu4 -hua1 -hua2 -hua4 -huai2 -huai4 -huan1 -huan2 -huan3 -huan4 -huang1 -huang2 -huang3 -huang4 -hui1 -hui2 -hui3 -hui4 -hun1 -hun2 -hun4 -huo -huo1 -huo2 -huo3 -huo4 -i -j -ji1 -ji2 -ji3 -ji4 -jia -jia1 -jia2 -jia3 -jia4 -jian1 -jian2 -jian3 -jian4 -jiang1 -jiang2 -jiang3 -jiang4 -jiao1 -jiao2 -jiao3 -jiao4 -jie1 -jie2 -jie3 -jie4 -jin1 -jin2 -jin3 -jin4 -jing1 -jing2 -jing3 -jing4 -jiong3 -jiu1 -jiu2 -jiu3 -jiu4 -ju1 -ju2 -ju3 -ju4 -juan1 -juan2 -juan3 -juan4 -jue1 -jue2 -jue4 -jun1 -jun4 -k -ka1 -ka2 -ka3 -kai1 -kai2 -kai3 -kai4 -kan1 -kan2 -kan3 -kan4 -kang1 -kang2 -kang4 -kao1 -kao2 -kao3 -kao4 -ke1 -ke2 -ke3 -ke4 -ken3 -keng1 -kong1 -kong3 -kong4 -kou1 -kou2 -kou3 -kou4 -ku1 -ku2 -ku3 -ku4 -kua1 -kua3 -kua4 -kuai3 -kuai4 -kuan1 -kuan2 -kuan3 -kuang1 -kuang2 -kuang4 -kui1 -kui2 -kui3 -kui4 -kun1 -kun3 -kun4 -kuo4 -l -la -la1 -la2 -la3 -la4 -lai2 -lai4 -lan2 -lan3 -lan4 -lang1 -lang2 -lang3 -lang4 -lao1 -lao2 -lao3 -lao4 -le -le1 -le4 -lei -lei1 -lei2 -lei3 -lei4 -leng1 -leng2 -leng3 -leng4 -li -li1 -li2 -li3 -li4 -lia3 -lian2 -lian3 -lian4 -liang2 -liang3 -liang4 -liao1 -liao2 -liao3 -liao4 -lie1 -lie2 -lie3 -lie4 -lin1 -lin2 -lin3 -lin4 -ling2 -ling3 -ling4 -liu1 -liu2 -liu3 -liu4 -long1 -long2 -long3 -long4 -lou1 -lou2 -lou3 -lou4 -lu1 -lu2 -lu3 -lu4 -luan2 -luan3 -luan4 -lun1 -lun2 -lun4 -luo1 -luo2 -luo3 -luo4 -lv2 -lv3 -lv4 -lve3 -lve4 -m -ma -ma1 -ma2 -ma3 -ma4 -mai2 -mai3 -mai4 -man1 -man2 -man3 -man4 -mang2 -mang3 -mao1 -mao2 -mao3 -mao4 -me -mei2 -mei3 -mei4 -men -men1 -men2 -men4 -meng -meng1 -meng2 -meng3 -meng4 -mi1 -mi2 -mi3 -mi4 -mian2 -mian3 -mian4 -miao1 -miao2 -miao3 -miao4 -mie1 -mie4 -min2 -min3 -ming2 -ming3 -ming4 -miu4 -mo1 -mo2 -mo3 -mo4 -mou1 -mou2 -mou3 -mu2 -mu3 -mu4 -n -n2 -na1 -na2 -na3 -na4 -nai2 -nai3 -nai4 -nan1 -nan2 -nan3 -nan4 -nang1 -nang2 -nang3 -nao1 -nao2 -nao3 -nao4 -ne -ne2 -ne4 -nei3 -nei4 -nen4 -neng2 -ni1 -ni2 -ni3 -ni4 -nian1 -nian2 -nian3 -nian4 -niang2 -niang4 -niao2 -niao3 -niao4 -nie1 -nie4 -nin2 -ning2 -ning3 -ning4 -niu1 -niu2 -niu3 -niu4 -nong2 -nong4 -nou4 -nu2 -nu3 -nu4 -nuan3 -nuo2 -nuo4 -nv2 -nv3 -nve4 -o -o1 -o2 -ou1 -ou2 -ou3 -ou4 -p -pa1 -pa2 -pa4 -pai1 -pai2 -pai3 -pai4 -pan1 -pan2 -pan4 -pang1 -pang2 -pang4 -pao1 -pao2 -pao3 -pao4 -pei1 -pei2 -pei4 -pen1 -pen2 -pen4 -peng1 -peng2 -peng3 -peng4 -pi1 -pi2 -pi3 -pi4 -pian1 -pian2 -pian4 -piao1 -piao2 -piao3 -piao4 -pie1 -pie2 -pie3 -pin1 -pin2 -pin3 -pin4 -ping1 -ping2 -po1 -po2 -po3 -po4 -pou1 -pu1 -pu2 -pu3 -pu4 -q -qi1 -qi2 -qi3 -qi4 -qia1 -qia3 -qia4 -qian1 -qian2 -qian3 -qian4 -qiang1 -qiang2 -qiang3 -qiang4 -qiao1 -qiao2 -qiao3 -qiao4 -qie1 -qie2 -qie3 -qie4 -qin1 -qin2 -qin3 -qin4 -qing1 -qing2 -qing3 -qing4 -qiong1 -qiong2 -qiu1 -qiu2 -qiu3 -qu1 -qu2 -qu3 -qu4 -quan1 -quan2 -quan3 -quan4 -que1 -que2 -que4 -qun2 -r -ran2 -ran3 -rang1 -rang2 -rang3 -rang4 -rao2 -rao3 -rao4 -re2 -re3 -re4 -ren2 -ren3 -ren4 -reng1 -reng2 -ri4 -rong1 -rong2 -rong3 -rou2 -rou4 -ru2 -ru3 -ru4 -ruan2 -ruan3 -rui3 -rui4 -run4 -ruo4 -s -sa1 -sa2 -sa3 -sa4 -sai1 -sai4 -san1 -san2 -san3 -san4 -sang1 -sang3 -sang4 -sao1 -sao2 -sao3 -sao4 -se4 -sen1 -seng1 -sha1 -sha2 -sha3 -sha4 -shai1 -shai2 -shai3 -shai4 -shan1 -shan3 -shan4 -shang -shang1 -shang3 -shang4 -shao1 -shao2 -shao3 -shao4 -she1 -she2 -she3 -she4 -shei2 -shen1 -shen2 -shen3 -shen4 -sheng1 -sheng2 -sheng3 -sheng4 -shi -shi1 -shi2 -shi3 -shi4 -shou1 -shou2 -shou3 -shou4 -shu1 -shu2 -shu3 -shu4 -shua1 -shua2 -shua3 -shua4 -shuai1 -shuai3 -shuai4 -shuan1 -shuan4 -shuang1 -shuang3 -shui2 -shui3 -shui4 -shun3 -shun4 -shuo1 -shuo4 -si1 -si2 -si3 -si4 -song1 -song3 -song4 -sou1 -sou3 -sou4 -su1 -su2 -su4 -suan1 -suan4 -sui1 -sui2 -sui3 -sui4 -sun1 -sun3 -suo -suo1 -suo2 -suo3 -t -ta1 -ta2 -ta3 -ta4 -tai1 -tai2 -tai4 -tan1 -tan2 -tan3 -tan4 -tang1 -tang2 -tang3 -tang4 -tao1 -tao2 -tao3 -tao4 -te4 -teng2 -ti1 -ti2 -ti3 -ti4 -tian1 -tian2 -tian3 -tiao1 -tiao2 -tiao3 -tiao4 -tie1 -tie2 -tie3 -tie4 -ting1 -ting2 -ting3 -tong1 -tong2 -tong3 -tong4 -tou -tou1 -tou2 -tou4 -tu1 -tu2 -tu3 -tu4 -tuan1 -tuan2 -tui1 -tui2 -tui3 -tui4 -tun1 -tun2 -tun4 -tuo1 -tuo2 -tuo3 -tuo4 -u -v -w -wa -wa1 -wa2 -wa3 -wa4 -wai1 -wai3 -wai4 -wan1 -wan2 -wan3 -wan4 -wang1 -wang2 -wang3 -wang4 -wei1 -wei2 -wei3 -wei4 -wen1 -wen2 -wen3 -wen4 -weng1 -weng4 -wo1 -wo2 -wo3 -wo4 -wu1 -wu2 -wu3 -wu4 -x -xi1 -xi2 -xi3 -xi4 -xia1 -xia2 -xia4 -xian1 -xian2 -xian3 -xian4 -xiang1 -xiang2 -xiang3 -xiang4 -xiao1 -xiao2 -xiao3 -xiao4 -xie1 -xie2 -xie3 -xie4 -xin1 -xin2 -xin4 -xing1 -xing2 -xing3 -xing4 -xiong1 -xiong2 -xiu1 -xiu3 -xiu4 -xu -xu1 -xu2 -xu3 -xu4 -xuan1 -xuan2 -xuan3 -xuan4 -xue1 -xue2 -xue3 -xue4 -xun1 -xun2 -xun4 -y -ya -ya1 -ya2 -ya3 -ya4 -yan1 -yan2 -yan3 -yan4 -yang1 -yang2 -yang3 -yang4 -yao1 -yao2 -yao3 -yao4 -ye1 -ye2 -ye3 -ye4 -yi -yi1 -yi2 -yi3 -yi4 -yin1 -yin2 -yin3 -yin4 -ying1 -ying2 -ying3 -ying4 -yo1 -yong1 -yong2 -yong3 -yong4 -you1 -you2 -you3 -you4 -yu1 -yu2 -yu3 -yu4 -yuan1 -yuan2 -yuan3 -yuan4 -yue1 -yue4 -yun1 -yun2 -yun3 -yun4 -z -za1 -za2 -za3 -zai1 -zai3 -zai4 -zan1 -zan2 -zan3 -zan4 -zang1 -zang4 -zao1 -zao2 -zao3 -zao4 -ze2 -ze4 -zei2 -zen3 -zeng1 -zeng4 -zha1 -zha2 -zha3 -zha4 -zhai1 -zhai2 -zhai3 -zhai4 -zhan1 -zhan2 -zhan3 -zhan4 -zhang1 -zhang2 -zhang3 -zhang4 -zhao1 -zhao2 -zhao3 -zhao4 -zhe -zhe1 -zhe2 -zhe3 -zhe4 -zhen1 -zhen2 -zhen3 -zhen4 -zheng1 -zheng2 -zheng3 -zheng4 -zhi1 -zhi2 -zhi3 -zhi4 -zhong1 -zhong2 -zhong3 -zhong4 -zhou1 -zhou2 -zhou3 -zhou4 -zhu1 -zhu2 -zhu3 -zhu4 -zhua1 -zhua2 -zhua3 -zhuai1 -zhuai3 -zhuai4 -zhuan1 -zhuan2 -zhuan3 -zhuan4 -zhuang1 -zhuang4 -zhui1 -zhui4 -zhun1 -zhun2 -zhun3 -zhuo1 -zhuo2 -zi -zi1 -zi2 -zi3 -zi4 -zong1 -zong2 -zong3 -zong4 -zou1 -zou2 -zou3 -zou4 -zu1 -zu2 -zu3 -zuan1 -zuan3 -zuan4 -zui2 -zui3 -zui4 -zun1 -zuo -zuo1 -zuo2 -zuo3 -zuo4 -{ -~ -¡ -¢ -£ -¥ -§ -¨ -© -« -® -¯ -° -± -² -³ -´ -µ -· -¹ -º -» -¼ -½ -¾ -¿ -À -Á - -à -Ä -Å -Æ -Ç -È -É -Ê -Í -Î -Ñ -Ó -Ö -× -Ø -Ú -Ü -Ý -Þ -ß -à -á -â -ã -ä -å -æ -ç -è -é -ê -ë -ì -í -î -ï -ð -ñ -ò -ó -ô -õ -ö -ø -ù -ú -û -ü -ý -Ā -ā -ă -ą -ć -Č -č -Đ -đ -ē -ė -ę -ě -ĝ -ğ -ħ -ī -į -İ -ı -Ł -ł -ń -ņ -ň -ŋ -Ō -ō -ő -œ -ř -Ś -ś -Ş -ş -Š -š -Ť -ť -ũ -ū -ź -Ż -ż -Ž -ž -ơ -ư -ǎ -ǐ -ǒ -ǔ -ǚ -ș -ț -ɑ -ɔ -ɕ -ə -ɛ -ɜ -ɡ -ɣ -ɪ -ɫ -ɴ -ɹ -ɾ -ʃ -ʊ -ʌ -ʒ -ʔ -ʰ -ʷ -ʻ -ʾ -ʿ -ˈ -ː -˙ -˜ -ˢ -́ -̅ -Α -Β -Δ -Ε -Θ -Κ -Λ -Μ -Ξ -Π -Σ -Τ -Φ -Χ -Ψ -Ω -ά -έ -ή -ί -α -β -γ -δ -ε -ζ -η -θ -ι -κ -λ -μ -ν -ξ -ο -π -ρ -ς -σ -τ -υ -φ -χ -ψ -ω -ϊ -ό -ύ -ώ -ϕ -ϵ -Ё -А -Б -В -Г -Д -Е -Ж -З -И -Й -К -Л -М -Н -О -П -Р -С -Т -У -Ф -Х -Ц -Ч -Ш -Щ -Ы -Ь -Э -Ю -Я -а -б -в -г -д -е -ж -з -и -й -к -л -м -н -о -п -р -с -т -у -ф -х -ц -ч -ш -щ -ъ -ы -ь -э -ю -я -ё -і -ְ -ִ -ֵ -ֶ -ַ -ָ -ֹ -ּ -־ -ׁ -א -ב -ג -ד -ה -ו -ז -ח -ט -י -כ -ל -ם -מ -ן -נ -ס -ע -פ -ק -ר -ש -ת -أ -ب -ة -ت -ج -ح -د -ر -ز -س -ص -ط -ع -ق -ك -ل -م -ن -ه -و -ي -َ -ُ -ِ -ْ -ก -ข -ง -จ -ต -ท -น -ป -ย -ร -ว -ส -ห -อ -ฮ -ั -า -ี -ึ -โ -ใ -ไ -่ -้ -์ -ḍ -Ḥ -ḥ -ṁ -ṃ -ṅ -ṇ -Ṛ -ṛ -Ṣ -ṣ -Ṭ -ṭ -ạ -ả -Ấ -ấ -ầ -ậ -ắ -ằ -ẻ -ẽ -ế -ề -ể -ễ -ệ -ị -ọ -ỏ -ố -ồ -ộ -ớ -ờ -ở -ụ -ủ -ứ -ữ -ἀ -ἁ -Ἀ -ἐ -ἔ -ἰ -ἱ -ὀ -ὁ -ὐ -ὲ -ὸ -ᾶ -᾽ -ῆ -ῇ -ῶ -‎ -‑ -‒ -– -— -― -‖ -† -‡ -• -… -‧ -‬ -′ -″ -⁄ -⁡ -⁰ -⁴ -⁵ -⁶ -⁷ -⁸ -⁹ -₁ -₂ -₃ -€ -₱ -₹ -₽ -℃ -ℏ -ℓ -№ -ℝ -™ -⅓ -⅔ -⅛ -→ -∂ -∈ -∑ -− -∗ -√ -∞ -∫ -≈ -≠ -≡ -≤ -≥ -⋅ -⋯ -█ -♪ -⟨ -⟩ -、 -。 -《 -》 -「 -」 -【 -】 -あ -う -え -お -か -が -き -ぎ -く -ぐ -け -げ -こ -ご -さ -し -じ -す -ず -せ -ぜ -そ -ぞ -た -だ -ち -っ -つ -で -と -ど -な -に -ね -の -は -ば -ひ -ぶ -へ -べ -ま -み -む -め -も -ゃ -や -ゆ -ょ -よ -ら -り -る -れ -ろ -わ -を -ん -ァ -ア -ィ -イ -ウ -ェ -エ -オ -カ -ガ -キ -ク -ケ -ゲ -コ -ゴ -サ -ザ -シ -ジ -ス -ズ -セ -ゾ -タ -ダ -チ -ッ -ツ -テ -デ -ト -ド -ナ -ニ -ネ -ノ -バ -パ -ビ -ピ -フ -プ -ヘ -ベ -ペ -ホ -ボ -ポ -マ -ミ -ム -メ -モ -ャ -ヤ -ュ -ユ -ョ -ヨ -ラ -リ -ル -レ -ロ -ワ -ン -・ -ー -ㄋ -ㄍ -ㄎ -ㄏ -ㄓ -ㄕ -ㄚ -ㄜ -ㄟ -ㄤ -ㄥ -ㄧ -ㄱ -ㄴ -ㄷ -ㄹ -ㅁ -ㅂ -ㅅ -ㅈ -ㅍ -ㅎ -ㅏ -ㅓ -ㅗ -ㅜ -ㅡ -ㅣ -㗎 -가 -각 -간 -갈 -감 -갑 -갓 -갔 -강 -같 -개 -거 -건 -걸 -겁 -것 -겉 -게 -겠 -겨 -결 -겼 -경 -계 -고 -곤 -골 -곱 -공 -과 -관 -광 -교 -구 -국 -굴 -귀 -귄 -그 -근 -글 -금 -기 -긴 -길 -까 -깍 -깔 -깜 -깨 -께 -꼬 -꼭 -꽃 -꾸 -꿔 -끔 -끗 -끝 -끼 -나 -난 -날 -남 -납 -내 -냐 -냥 -너 -넘 -넣 -네 -녁 -년 -녕 -노 -녹 -놀 -누 -눈 -느 -는 -늘 -니 -님 -닙 -다 -닥 -단 -달 -닭 -당 -대 -더 -덕 -던 -덥 -데 -도 -독 -동 -돼 -됐 -되 -된 -될 -두 -둑 -둥 -드 -들 -등 -디 -따 -딱 -딸 -땅 -때 -떤 -떨 -떻 -또 -똑 -뚱 -뛰 -뜻 -띠 -라 -락 -란 -람 -랍 -랑 -래 -랜 -러 -런 -럼 -렇 -레 -려 -력 -렵 -렸 -로 -록 -롬 -루 -르 -른 -를 -름 -릉 -리 -릴 -림 -마 -막 -만 -많 -말 -맑 -맙 -맛 -매 -머 -먹 -멍 -메 -면 -명 -몇 -모 -목 -몸 -못 -무 -문 -물 -뭐 -뭘 -미 -민 -밌 -밑 -바 -박 -밖 -반 -받 -발 -밤 -밥 -방 -배 -백 -밸 -뱀 -버 -번 -벌 -벚 -베 -벼 -벽 -별 -병 -보 -복 -본 -볼 -봐 -봤 -부 -분 -불 -비 -빔 -빛 -빠 -빨 -뼈 -뽀 -뿅 -쁘 -사 -산 -살 -삼 -샀 -상 -새 -색 -생 -서 -선 -설 -섭 -섰 -성 -세 -셔 -션 -셨 -소 -속 -손 -송 -수 -숙 -순 -술 -숫 -숭 -숲 -쉬 -쉽 -스 -슨 -습 -슷 -시 -식 -신 -실 -싫 -심 -십 -싶 -싸 -써 -쓰 -쓴 -씌 -씨 -씩 -씬 -아 -악 -안 -않 -알 -야 -약 -얀 -양 -얘 -어 -언 -얼 -엄 -업 -없 -었 -엉 -에 -여 -역 -연 -염 -엽 -영 -옆 -예 -옛 -오 -온 -올 -옷 -옹 -와 -왔 -왜 -요 -욕 -용 -우 -운 -울 -웃 -워 -원 -월 -웠 -위 -윙 -유 -육 -윤 -으 -은 -을 -음 -응 -의 -이 -익 -인 -일 -읽 -임 -입 -있 -자 -작 -잔 -잖 -잘 -잡 -잤 -장 -재 -저 -전 -점 -정 -제 -져 -졌 -조 -족 -좀 -종 -좋 -죠 -주 -준 -줄 -중 -줘 -즈 -즐 -즘 -지 -진 -집 -짜 -짝 -쩌 -쪼 -쪽 -쫌 -쭈 -쯔 -찌 -찍 -차 -착 -찾 -책 -처 -천 -철 -체 -쳐 -쳤 -초 -촌 -추 -출 -춤 -춥 -춰 -치 -친 -칠 -침 -칩 -칼 -커 -켓 -코 -콩 -쿠 -퀴 -크 -큰 -큽 -키 -킨 -타 -태 -터 -턴 -털 -테 -토 -통 -투 -트 -특 -튼 -틀 -티 -팀 -파 -팔 -패 -페 -펜 -펭 -평 -포 -폭 -표 -품 -풍 -프 -플 -피 -필 -하 -학 -한 -할 -함 -합 -항 -해 -햇 -했 -행 -허 -험 -형 -혜 -호 -혼 -홀 -화 -회 -획 -후 -휴 -흐 -흔 -희 -히 -힘 -ﷺ -ﷻ -! -, -? -� -𠮶 diff --git a/client/lucy-f5/vocab_v1.txt b/client/lucy-f5/vocab_v1.txt deleted file mode 100644 index a30a90c..0000000 --- a/client/lucy-f5/vocab_v1.txt +++ /dev/null @@ -1,2545 +0,0 @@ - -! -" -# -$ -% -& -' -( -) -* -+ -, -- -. -/ -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -: -; -= -> -? -@ -A -B -C -D -E -F -G -H -I -J -K -L -M -N -O -P -Q -R -S -T -U -V -W -X -Y -Z -[ -\ -] -_ -a -a1 -ai1 -ai2 -ai3 -ai4 -an1 -an3 -an4 -ang1 -ang2 -ang4 -ao1 -ao2 -ao3 -ao4 -b -ba -ba1 -ba2 -ba3 -ba4 -bai1 -bai2 -bai3 -bai4 -ban1 -ban2 -ban3 -ban4 -bang1 -bang2 -bang3 -bang4 -bao1 -bao2 -bao3 -bao4 -bei -bei1 -bei2 -bei3 -bei4 -ben1 -ben2 -ben3 -ben4 -beng -beng1 -beng2 -beng3 -beng4 -bi1 -bi2 -bi3 -bi4 -bian1 -bian2 -bian3 -bian4 -biao1 -biao2 -biao3 -bie1 -bie2 -bie3 -bie4 -bin1 -bin4 -bing1 -bing2 -bing3 -bing4 -bo -bo1 -bo2 -bo3 -bo4 -bu2 -bu3 -bu4 -c -ca1 -cai1 -cai2 -cai3 -cai4 -can1 -can2 -can3 -can4 -cang1 -cang2 -cao1 -cao2 -cao3 -ce4 -cen1 -cen2 -ceng1 -ceng2 -ceng4 -cha1 -cha2 -cha3 -cha4 -chai1 -chai2 -chan1 -chan2 -chan3 -chan4 -chang1 -chang2 -chang3 -chang4 -chao1 -chao2 -chao3 -che1 -che2 -che3 -che4 -chen1 -chen2 -chen3 -chen4 -cheng1 -cheng2 -cheng3 -cheng4 -chi1 -chi2 -chi3 -chi4 -chong1 -chong2 -chong3 -chong4 -chou1 -chou2 -chou3 -chou4 -chu1 -chu2 -chu3 -chu4 -chua1 -chuai1 -chuai2 -chuai3 -chuai4 -chuan1 -chuan2 -chuan3 -chuan4 -chuang1 -chuang2 -chuang3 -chuang4 -chui1 -chui2 -chun1 -chun2 -chun3 -chuo1 -chuo4 -ci1 -ci2 -ci3 -ci4 -cong1 -cong2 -cou4 -cu1 -cu4 -cuan1 -cuan2 -cuan4 -cui1 -cui3 -cui4 -cun1 -cun2 -cun4 -cuo1 -cuo2 -cuo4 -d -da -da1 -da2 -da3 -da4 -dai1 -dai2 -dai3 -dai4 -dan1 -dan2 -dan3 -dan4 -dang1 -dang2 -dang3 -dang4 -dao1 -dao2 -dao3 -dao4 -de -de1 -de2 -dei3 -den4 -deng1 -deng2 -deng3 -deng4 -di1 -di2 -di3 -di4 -dia3 -dian1 -dian2 -dian3 -dian4 -diao1 -diao3 -diao4 -die1 -die2 -die4 -ding1 -ding2 -ding3 -ding4 -diu1 -dong1 -dong3 -dong4 -dou1 -dou2 -dou3 -dou4 -du1 -du2 -du3 -du4 -duan1 -duan2 -duan3 -duan4 -dui1 -dui4 -dun1 -dun3 -dun4 -duo1 -duo2 -duo3 -duo4 -e -e1 -e2 -e3 -e4 -ei2 -en1 -en4 -er -er2 -er3 -er4 -f -fa1 -fa2 -fa3 -fa4 -fan1 -fan2 -fan3 -fan4 -fang1 -fang2 -fang3 -fang4 -fei1 -fei2 -fei3 -fei4 -fen1 -fen2 -fen3 -fen4 -feng1 -feng2 -feng3 -feng4 -fo2 -fou2 -fou3 -fu1 -fu2 -fu3 -fu4 -g -ga1 -ga2 -ga3 -ga4 -gai1 -gai2 -gai3 -gai4 -gan1 -gan2 -gan3 -gan4 -gang1 -gang2 -gang3 -gang4 -gao1 -gao2 -gao3 -gao4 -ge1 -ge2 -ge3 -ge4 -gei2 -gei3 -gen1 -gen2 -gen3 -gen4 -geng1 -geng3 -geng4 -gong1 -gong3 -gong4 -gou1 -gou2 -gou3 -gou4 -gu -gu1 -gu2 -gu3 -gu4 -gua1 -gua2 -gua3 -gua4 -guai1 -guai2 -guai3 -guai4 -guan1 -guan2 -guan3 -guan4 -guang1 -guang2 -guang3 -guang4 -gui1 -gui2 -gui3 -gui4 -gun3 -gun4 -guo1 -guo2 -guo3 -guo4 -h -ha1 -ha2 -ha3 -hai1 -hai2 -hai3 -hai4 -han1 -han2 -han3 -han4 -hang1 -hang2 -hang4 -hao1 -hao2 -hao3 -hao4 -he1 -he2 -he4 -hei1 -hen2 -hen3 -hen4 -heng1 -heng2 -heng4 -hong1 -hong2 -hong3 -hong4 -hou1 -hou2 -hou3 -hou4 -hu1 -hu2 -hu3 -hu4 -hua1 -hua2 -hua4 -huai2 -huai4 -huan1 -huan2 -huan3 -huan4 -huang1 -huang2 -huang3 -huang4 -hui1 -hui2 -hui3 -hui4 -hun1 -hun2 -hun4 -huo -huo1 -huo2 -huo3 -huo4 -i -j -ji1 -ji2 -ji3 -ji4 -jia -jia1 -jia2 -jia3 -jia4 -jian1 -jian2 -jian3 -jian4 -jiang1 -jiang2 -jiang3 -jiang4 -jiao1 -jiao2 -jiao3 -jiao4 -jie1 -jie2 -jie3 -jie4 -jin1 -jin2 -jin3 -jin4 -jing1 -jing2 -jing3 -jing4 -jiong3 -jiu1 -jiu2 -jiu3 -jiu4 -ju1 -ju2 -ju3 -ju4 -juan1 -juan2 -juan3 -juan4 -jue1 -jue2 -jue4 -jun1 -jun4 -k -ka1 -ka2 -ka3 -kai1 -kai2 -kai3 -kai4 -kan1 -kan2 -kan3 -kan4 -kang1 -kang2 -kang4 -kao1 -kao2 -kao3 -kao4 -ke1 -ke2 -ke3 -ke4 -ken3 -keng1 -kong1 -kong3 -kong4 -kou1 -kou2 -kou3 -kou4 -ku1 -ku2 -ku3 -ku4 -kua1 -kua3 -kua4 -kuai3 -kuai4 -kuan1 -kuan2 -kuan3 -kuang1 -kuang2 -kuang4 -kui1 -kui2 -kui3 -kui4 -kun1 -kun3 -kun4 -kuo4 -l -la -la1 -la2 -la3 -la4 -lai2 -lai4 -lan2 -lan3 -lan4 -lang1 -lang2 -lang3 -lang4 -lao1 -lao2 -lao3 -lao4 -le -le1 -le4 -lei -lei1 -lei2 -lei3 -lei4 -leng1 -leng2 -leng3 -leng4 -li -li1 -li2 -li3 -li4 -lia3 -lian2 -lian3 -lian4 -liang2 -liang3 -liang4 -liao1 -liao2 -liao3 -liao4 -lie1 -lie2 -lie3 -lie4 -lin1 -lin2 -lin3 -lin4 -ling2 -ling3 -ling4 -liu1 -liu2 -liu3 -liu4 -long1 -long2 -long3 -long4 -lou1 -lou2 -lou3 -lou4 -lu1 -lu2 -lu3 -lu4 -luan2 -luan3 -luan4 -lun1 -lun2 -lun4 -luo1 -luo2 -luo3 -luo4 -lv2 -lv3 -lv4 -lve3 -lve4 -m -ma -ma1 -ma2 -ma3 -ma4 -mai2 -mai3 -mai4 -man1 -man2 -man3 -man4 -mang2 -mang3 -mao1 -mao2 -mao3 -mao4 -me -mei2 -mei3 -mei4 -men -men1 -men2 -men4 -meng -meng1 -meng2 -meng3 -meng4 -mi1 -mi2 -mi3 -mi4 -mian2 -mian3 -mian4 -miao1 -miao2 -miao3 -miao4 -mie1 -mie4 -min2 -min3 -ming2 -ming3 -ming4 -miu4 -mo1 -mo2 -mo3 -mo4 -mou1 -mou2 -mou3 -mu2 -mu3 -mu4 -n -n2 -na1 -na2 -na3 -na4 -nai2 -nai3 -nai4 -nan1 -nan2 -nan3 -nan4 -nang1 -nang2 -nang3 -nao1 -nao2 -nao3 -nao4 -ne -ne2 -ne4 -nei3 -nei4 -nen4 -neng2 -ni1 -ni2 -ni3 -ni4 -nian1 -nian2 -nian3 -nian4 -niang2 -niang4 -niao2 -niao3 -niao4 -nie1 -nie4 -nin2 -ning2 -ning3 -ning4 -niu1 -niu2 -niu3 -niu4 -nong2 -nong4 -nou4 -nu2 -nu3 -nu4 -nuan3 -nuo2 -nuo4 -nv2 -nv3 -nve4 -o -o1 -o2 -ou1 -ou2 -ou3 -ou4 -p -pa1 -pa2 -pa4 -pai1 -pai2 -pai3 -pai4 -pan1 -pan2 -pan4 -pang1 -pang2 -pang4 -pao1 -pao2 -pao3 -pao4 -pei1 -pei2 -pei4 -pen1 -pen2 -pen4 -peng1 -peng2 -peng3 -peng4 -pi1 -pi2 -pi3 -pi4 -pian1 -pian2 -pian4 -piao1 -piao2 -piao3 -piao4 -pie1 -pie2 -pie3 -pin1 -pin2 -pin3 -pin4 -ping1 -ping2 -po1 -po2 -po3 -po4 -pou1 -pu1 -pu2 -pu3 -pu4 -q -qi1 -qi2 -qi3 -qi4 -qia1 -qia3 -qia4 -qian1 -qian2 -qian3 -qian4 -qiang1 -qiang2 -qiang3 -qiang4 -qiao1 -qiao2 -qiao3 -qiao4 -qie1 -qie2 -qie3 -qie4 -qin1 -qin2 -qin3 -qin4 -qing1 -qing2 -qing3 -qing4 -qiong1 -qiong2 -qiu1 -qiu2 -qiu3 -qu1 -qu2 -qu3 -qu4 -quan1 -quan2 -quan3 -quan4 -que1 -que2 -que4 -qun2 -r -ran2 -ran3 -rang1 -rang2 -rang3 -rang4 -rao2 -rao3 -rao4 -re2 -re3 -re4 -ren2 -ren3 -ren4 -reng1 -reng2 -ri4 -rong1 -rong2 -rong3 -rou2 -rou4 -ru2 -ru3 -ru4 -ruan2 -ruan3 -rui3 -rui4 -run4 -ruo4 -s -sa1 -sa2 -sa3 -sa4 -sai1 -sai4 -san1 -san2 -san3 -san4 -sang1 -sang3 -sang4 -sao1 -sao2 -sao3 -sao4 -se4 -sen1 -seng1 -sha1 -sha2 -sha3 -sha4 -shai1 -shai2 -shai3 -shai4 -shan1 -shan3 -shan4 -shang -shang1 -shang3 -shang4 -shao1 -shao2 -shao3 -shao4 -she1 -she2 -she3 -she4 -shei2 -shen1 -shen2 -shen3 -shen4 -sheng1 -sheng2 -sheng3 -sheng4 -shi -shi1 -shi2 -shi3 -shi4 -shou1 -shou2 -shou3 -shou4 -shu1 -shu2 -shu3 -shu4 -shua1 -shua2 -shua3 -shua4 -shuai1 -shuai3 -shuai4 -shuan1 -shuan4 -shuang1 -shuang3 -shui2 -shui3 -shui4 -shun3 -shun4 -shuo1 -shuo4 -si1 -si2 -si3 -si4 -song1 -song3 -song4 -sou1 -sou3 -sou4 -su1 -su2 -su4 -suan1 -suan4 -sui1 -sui2 -sui3 -sui4 -sun1 -sun3 -suo -suo1 -suo2 -suo3 -t -ta1 -ta2 -ta3 -ta4 -tai1 -tai2 -tai4 -tan1 -tan2 -tan3 -tan4 -tang1 -tang2 -tang3 -tang4 -tao1 -tao2 -tao3 -tao4 -te4 -teng2 -ti1 -ti2 -ti3 -ti4 -tian1 -tian2 -tian3 -tiao1 -tiao2 -tiao3 -tiao4 -tie1 -tie2 -tie3 -tie4 -ting1 -ting2 -ting3 -tong1 -tong2 -tong3 -tong4 -tou -tou1 -tou2 -tou4 -tu1 -tu2 -tu3 -tu4 -tuan1 -tuan2 -tui1 -tui2 -tui3 -tui4 -tun1 -tun2 -tun4 -tuo1 -tuo2 -tuo3 -tuo4 -u -v -w -wa -wa1 -wa2 -wa3 -wa4 -wai1 -wai3 -wai4 -wan1 -wan2 -wan3 -wan4 -wang1 -wang2 -wang3 -wang4 -wei1 -wei2 -wei3 -wei4 -wen1 -wen2 -wen3 -wen4 -weng1 -weng4 -wo1 -wo2 -wo3 -wo4 -wu1 -wu2 -wu3 -wu4 -x -xi1 -xi2 -xi3 -xi4 -xia1 -xia2 -xia4 -xian1 -xian2 -xian3 -xian4 -xiang1 -xiang2 -xiang3 -xiang4 -xiao1 -xiao2 -xiao3 -xiao4 -xie1 -xie2 -xie3 -xie4 -xin1 -xin2 -xin4 -xing1 -xing2 -xing3 -xing4 -xiong1 -xiong2 -xiu1 -xiu3 -xiu4 -xu -xu1 -xu2 -xu3 -xu4 -xuan1 -xuan2 -xuan3 -xuan4 -xue1 -xue2 -xue3 -xue4 -xun1 -xun2 -xun4 -y -ya -ya1 -ya2 -ya3 -ya4 -yan1 -yan2 -yan3 -yan4 -yang1 -yang2 -yang3 -yang4 -yao1 -yao2 -yao3 -yao4 -ye1 -ye2 -ye3 -ye4 -yi -yi1 -yi2 -yi3 -yi4 -yin1 -yin2 -yin3 -yin4 -ying1 -ying2 -ying3 -ying4 -yo1 -yong1 -yong2 -yong3 -yong4 -you1 -you2 -you3 -you4 -yu1 -yu2 -yu3 -yu4 -yuan1 -yuan2 -yuan3 -yuan4 -yue1 -yue4 -yun1 -yun2 -yun3 -yun4 -z -za1 -za2 -za3 -zai1 -zai3 -zai4 -zan1 -zan2 -zan3 -zan4 -zang1 -zang4 -zao1 -zao2 -zao3 -zao4 -ze2 -ze4 -zei2 -zen3 -zeng1 -zeng4 -zha1 -zha2 -zha3 -zha4 -zhai1 -zhai2 -zhai3 -zhai4 -zhan1 -zhan2 -zhan3 -zhan4 -zhang1 -zhang2 -zhang3 -zhang4 -zhao1 -zhao2 -zhao3 -zhao4 -zhe -zhe1 -zhe2 -zhe3 -zhe4 -zhen1 -zhen2 -zhen3 -zhen4 -zheng1 -zheng2 -zheng3 -zheng4 -zhi1 -zhi2 -zhi3 -zhi4 -zhong1 -zhong2 -zhong3 -zhong4 -zhou1 -zhou2 -zhou3 -zhou4 -zhu1 -zhu2 -zhu3 -zhu4 -zhua1 -zhua2 -zhua3 -zhuai1 -zhuai3 -zhuai4 -zhuan1 -zhuan2 -zhuan3 -zhuan4 -zhuang1 -zhuang4 -zhui1 -zhui4 -zhun1 -zhun2 -zhun3 -zhuo1 -zhuo2 -zi -zi1 -zi2 -zi3 -zi4 -zong1 -zong2 -zong3 -zong4 -zou1 -zou2 -zou3 -zou4 -zu1 -zu2 -zu3 -zuan1 -zuan3 -zuan4 -zui2 -zui3 -zui4 -zun1 -zuo -zuo1 -zuo2 -zuo3 -zuo4 -{ -~ -¡ -¢ -£ -¥ -§ -¨ -© -« -® -¯ -° -± -² -³ -´ -µ -· -¹ -º -» -¼ -½ -¾ -¿ -À -Á - -à -Ä -Å -Æ -Ç -È -É -Ê -Í -Î -Ñ -Ó -Ö -× -Ø -Ú -Ü -Ý -Þ -ß -à -á -â -ã -ä -å -æ -ç -è -é -ê -ë -ì -í -î -ï -ð -ñ -ò -ó -ô -õ -ö -ø -ù -ú -û -ü -ý -Ā -ā -ă -ą -ć -Č -č -Đ -đ -ē -ė -ę -ě -ĝ -ğ -ħ -ī -į -İ -ı -Ł -ł -ń -ņ -ň -ŋ -Ō -ō -ő -œ -ř -Ś -ś -Ş -ş -Š -š -Ť -ť -ũ -ū -ź -Ż -ż -Ž -ž -ơ -ư -ǎ -ǐ -ǒ -ǔ -ǚ -ș -ț -ɑ -ɔ -ɕ -ə -ɛ -ɜ -ɡ -ɣ -ɪ -ɫ -ɴ -ɹ -ɾ -ʃ -ʊ -ʌ -ʒ -ʔ -ʰ -ʷ -ʻ -ʾ -ʿ -ˈ -ː -˙ -˜ -ˢ -́ -̅ -Α -Β -Δ -Ε -Θ -Κ -Λ -Μ -Ξ -Π -Σ -Τ -Φ -Χ -Ψ -Ω -ά -έ -ή -ί -α -β -γ -δ -ε -ζ -η -θ -ι -κ -λ -μ -ν -ξ -ο -π -ρ -ς -σ -τ -υ -φ -χ -ψ -ω -ϊ -ό -ύ -ώ -ϕ -ϵ -Ё -А -Б -В -Г -Д -Е -Ж -З -И -Й -К -Л -М -Н -О -П -Р -С -Т -У -Ф -Х -Ц -Ч -Ш -Щ -Ы -Ь -Э -Ю -Я -а -б -в -г -д -е -ж -з -и -й -к -л -м -н -о -п -р -с -т -у -ф -х -ц -ч -ш -щ -ъ -ы -ь -э -ю -я -ё -і -ְ -ִ -ֵ -ֶ -ַ -ָ -ֹ -ּ -־ -ׁ -א -ב -ג -ד -ה -ו -ז -ח -ט -י -כ -ל -ם -מ -ן -נ -ס -ע -פ -ק -ר -ש -ת -أ -ب -ة -ت -ج -ح -د -ر -ز -س -ص -ط -ع -ق -ك -ل -م -ن -ه -و -ي -َ -ُ -ِ -ْ -ก -ข -ง -จ -ต -ท -น -ป -ย -ร -ว -ส -ห -อ -ฮ -ั -า -ี -ึ -โ -ใ -ไ -่ -้ -์ -ḍ -Ḥ -ḥ -ṁ -ṃ -ṅ -ṇ -Ṛ -ṛ -Ṣ -ṣ -Ṭ -ṭ -ạ -ả -Ấ -ấ -ầ -ậ -ắ -ằ -ẻ -ẽ -ế -ề -ể -ễ -ệ -ị -ọ -ỏ -ố -ồ -ộ -ớ -ờ -ở -ụ -ủ -ứ -ữ -ἀ -ἁ -Ἀ -ἐ -ἔ -ἰ -ἱ -ὀ -ὁ -ὐ -ὲ -ὸ -ᾶ -᾽ -ῆ -ῇ -ῶ -‎ -‑ -‒ -– -— -― -‖ -† -‡ -• -… -‧ -‬ -′ -″ -⁄ -⁡ -⁰ -⁴ -⁵ -⁶ -⁷ -⁸ -⁹ -₁ -₂ -₃ -€ -₱ -₹ -₽ -℃ -ℏ -ℓ -№ -ℝ -™ -⅓ -⅔ -⅛ -→ -∂ -∈ -∑ -− -∗ -√ -∞ -∫ -≈ -≠ -≡ -≤ -≥ -⋅ -⋯ -█ -♪ -⟨ -⟩ -、 -。 -《 -》 -「 -」 -【 -】 -あ -う -え -お -か -が -き -ぎ -く -ぐ -け -げ -こ -ご -さ -し -じ -す -ず -せ -ぜ -そ -ぞ -た -だ -ち -っ -つ -で -と -ど -な -に -ね -の -は -ば -ひ -ぶ -へ -べ -ま -み -む -め -も -ゃ -や -ゆ -ょ -よ -ら -り -る -れ -ろ -わ -を -ん -ァ -ア -ィ -イ -ウ -ェ -エ -オ -カ -ガ -キ -ク -ケ -ゲ -コ -ゴ -サ -ザ -シ -ジ -ス -ズ -セ -ゾ -タ -ダ -チ -ッ -ツ -テ -デ -ト -ド -ナ -ニ -ネ -ノ -バ -パ -ビ -ピ -フ -プ -ヘ -ベ -ペ -ホ -ボ -ポ -マ -ミ -ム -メ -モ -ャ -ヤ -ュ -ユ -ョ -ヨ -ラ -リ -ル -レ -ロ -ワ -ン -・ -ー -ㄋ -ㄍ -ㄎ -ㄏ -ㄓ -ㄕ -ㄚ -ㄜ -ㄟ -ㄤ -ㄥ -ㄧ -ㄱ -ㄴ -ㄷ -ㄹ -ㅁ -ㅂ -ㅅ -ㅈ -ㅍ -ㅎ -ㅏ -ㅓ -ㅗ -ㅜ -ㅡ -ㅣ -㗎 -가 -각 -간 -갈 -감 -갑 -갓 -갔 -강 -같 -개 -거 -건 -걸 -겁 -것 -겉 -게 -겠 -겨 -결 -겼 -경 -계 -고 -곤 -골 -곱 -공 -과 -관 -광 -교 -구 -국 -굴 -귀 -귄 -그 -근 -글 -금 -기 -긴 -길 -까 -깍 -깔 -깜 -깨 -께 -꼬 -꼭 -꽃 -꾸 -꿔 -끔 -끗 -끝 -끼 -나 -난 -날 -남 -납 -내 -냐 -냥 -너 -넘 -넣 -네 -녁 -년 -녕 -노 -녹 -놀 -누 -눈 -느 -는 -늘 -니 -님 -닙 -다 -닥 -단 -달 -닭 -당 -대 -더 -덕 -던 -덥 -데 -도 -독 -동 -돼 -됐 -되 -된 -될 -두 -둑 -둥 -드 -들 -등 -디 -따 -딱 -딸 -땅 -때 -떤 -떨 -떻 -또 -똑 -뚱 -뛰 -뜻 -띠 -라 -락 -란 -람 -랍 -랑 -래 -랜 -러 -런 -럼 -렇 -레 -려 -력 -렵 -렸 -로 -록 -롬 -루 -르 -른 -를 -름 -릉 -리 -릴 -림 -마 -막 -만 -많 -말 -맑 -맙 -맛 -매 -머 -먹 -멍 -메 -면 -명 -몇 -모 -목 -몸 -못 -무 -문 -물 -뭐 -뭘 -미 -민 -밌 -밑 -바 -박 -밖 -반 -받 -발 -밤 -밥 -방 -배 -백 -밸 -뱀 -버 -번 -벌 -벚 -베 -벼 -벽 -별 -병 -보 -복 -본 -볼 -봐 -봤 -부 -분 -불 -비 -빔 -빛 -빠 -빨 -뼈 -뽀 -뿅 -쁘 -사 -산 -살 -삼 -샀 -상 -새 -색 -생 -서 -선 -설 -섭 -섰 -성 -세 -셔 -션 -셨 -소 -속 -손 -송 -수 -숙 -순 -술 -숫 -숭 -숲 -쉬 -쉽 -스 -슨 -습 -슷 -시 -식 -신 -실 -싫 -심 -십 -싶 -싸 -써 -쓰 -쓴 -씌 -씨 -씩 -씬 -아 -악 -안 -않 -알 -야 -약 -얀 -양 -얘 -어 -언 -얼 -엄 -업 -없 -었 -엉 -에 -여 -역 -연 -염 -엽 -영 -옆 -예 -옛 -오 -온 -올 -옷 -옹 -와 -왔 -왜 -요 -욕 -용 -우 -운 -울 -웃 -워 -원 -월 -웠 -위 -윙 -유 -육 -윤 -으 -은 -을 -음 -응 -의 -이 -익 -인 -일 -읽 -임 -입 -있 -자 -작 -잔 -잖 -잘 -잡 -잤 -장 -재 -저 -전 -점 -정 -제 -져 -졌 -조 -족 -좀 -종 -좋 -죠 -주 -준 -줄 -중 -줘 -즈 -즐 -즘 -지 -진 -집 -짜 -짝 -쩌 -쪼 -쪽 -쫌 -쭈 -쯔 -찌 -찍 -차 -착 -찾 -책 -처 -천 -철 -체 -쳐 -쳤 -초 -촌 -추 -출 -춤 -춥 -춰 -치 -친 -칠 -침 -칩 -칼 -커 -켓 -코 -콩 -쿠 -퀴 -크 -큰 -큽 -키 -킨 -타 -태 -터 -턴 -털 -테 -토 -통 -투 -트 -특 -튼 -틀 -티 -팀 -파 -팔 -패 -페 -펜 -펭 -평 -포 -폭 -표 -품 -풍 -프 -플 -피 -필 -하 -학 -한 -할 -함 -합 -항 -해 -햇 -했 -행 -허 -험 -형 -혜 -호 -혼 -홀 -화 -회 -획 -후 -휴 -흐 -흔 -희 -히 -힘 -ﷺ -ﷻ -! -, -? -� -𠮶 diff --git a/client/lucy-tts/B2-Test.bat b/client/lucy-tts/B2-Test.bat deleted file mode 100644 index 41b3855..0000000 --- a/client/lucy-tts/B2-Test.bat +++ /dev/null @@ -1,12 +0,0 @@ -@echo off -chcp 65001 >nul -cd /d "F:\Coding Stuff\mission-control-2\client\lucy-tts" -echo B2-Test: seriell vs. 3 Worker (laedt mehrere Modelle - kann ein paar Minuten dauern)... -echo. -"ptts-venv\Scripts\python.exe" bench_b2.py > bench_b2.log 2>&1 -type bench_b2.log -echo. -echo ============================================================ -echo Fertig. WAVs in: %USERPROFILE%\Desktop\lucy_samples (b2_serial / b2_parallel_3w) -echo ============================================================ -pause diff --git a/client/lucy-tts/Lucy-Samples-erzeugen.bat b/client/lucy-tts/Lucy-Samples-erzeugen.bat deleted file mode 100644 index 223a4f4..0000000 --- a/client/lucy-tts/Lucy-Samples-erzeugen.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off -chcp 65001 >nul -cd /d "F:\Coding Stuff\mission-control-2\client\lucy-tts" -echo Erzeuge Lucy-Hoerproben (A1 safetensors-Cache + A2 Referenz-Cleaning)... -echo Modell laedt offline aus dem lokalen Cache - das kann ein paar Minuten dauern. -echo. -"ptts-venv\Scripts\python.exe" make_samples.py > make_samples.log 2>&1 -type make_samples.log -echo. -echo ============================================================ -echo Fertig. Samples liegen in: %USERPROFILE%\Desktop\lucy_samples -echo ============================================================ -pause diff --git a/client/lucy-tts/Lucy-Startklar.bat b/client/lucy-tts/Lucy-Startklar.bat deleted file mode 100644 index ad182f0..0000000 --- a/client/lucy-tts/Lucy-Startklar.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off -chcp 65001 >nul -cd /d "F:\Coding Stuff\mission-control-2\client\lucy-tts" -echo Lucy-Startklar-Check: bootet die Stimme + rendert finale Samples auf den Desktop... -echo (Modell laedt offline aus dem Cache - ein paar Sekunden) -echo. -"ptts-venv\Scripts\python.exe" lucy_ready.py > lucy_ready.log 2>&1 -type lucy_ready.log -echo. -echo ============================================================ -echo Samples: %USERPROFILE%\Desktop\lucy_samples (lucy_final_*) -echo ============================================================ -pause diff --git a/client/lucy-tts/Sweep-B2.bat b/client/lucy-tts/Sweep-B2.bat deleted file mode 100644 index be757f6..0000000 --- a/client/lucy-tts/Sweep-B2.bat +++ /dev/null @@ -1,12 +0,0 @@ -@echo off -chcp 65001 >nul -cd /d "F:\Coding Stuff\mission-control-2\client\lucy-tts" -echo B2-Sweep: WORKERS x THREADS finden (laedt viele Modelle - dauert ein paar Minuten)... -echo. -"ptts-venv\Scripts\python.exe" sweep_b2.py > sweep_b2.log 2>&1 -echo ============================================================ -type sweep_b2_result.json 2>nul -echo. -echo (Volllog: sweep_b2.log) -echo ============================================================ -pause diff --git a/client/lucy-tts/TTFB-Test.bat b/client/lucy-tts/TTFB-Test.bat deleted file mode 100644 index 9207079..0000000 --- a/client/lucy-tts/TTFB-Test.bat +++ /dev/null @@ -1,9 +0,0 @@ -@echo off -chcp 65001 >nul -cd /d "F:\Coding Stuff\mission-control-2\client\lucy-tts" -echo TTFB-Test (seriell): kurzer-erster-Chunk an/aus... -echo. -"ptts-venv\Scripts\python.exe" ttfb_test.py > ttfb_test.log 2>&1 -type ttfb_test.log -echo. -pause diff --git a/client/lucy-tts/Umlaut-Test.bat b/client/lucy-tts/Umlaut-Test.bat deleted file mode 100644 index 183076f..0000000 --- a/client/lucy-tts/Umlaut-Test.bat +++ /dev/null @@ -1,9 +0,0 @@ -@echo off -chcp 65001 >nul -cd /d "F:\Coding Stuff\mission-control-2\client\lucy-tts" -echo Umlaut-Test: Logik-Check + Vorher/Nachher-Audio... -echo. -"ptts-venv\Scripts\python.exe" umlaut_test.py > umlaut_test.log 2>&1 -type umlaut_test.log -echo. -pause diff --git a/client/lucy-tts/analyze.py b/client/lucy-tts/analyze.py deleted file mode 100644 index 5f3ed0a..0000000 --- a/client/lucy-tts/analyze.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- -"""Stimm-RÖNTGEN: liest Wörter + Wort-genaue Zeiten + PAUSEN + Prosodie (F0/Tempo) aus einer WAV. -So sieht man beim Tunen objektiv, wo Pocket zu lange Pausen macht (Komma!), nuschelt, oder monoton wird. - -Nutzung: python analyze.py -""" -import sys, numpy as np, soundfile as sf, librosa -from faster_whisper import WhisperModel - -p = sys.argv[1] -a, sr = sf.read(p) -a = np.asarray(a, dtype=np.float32).reshape(-1) -dur = len(a) / sr - -w = WhisperModel("small", device="cpu", compute_type="int8") -segs, _ = w.transcribe(p, language="de", beam_size=5, word_timestamps=True) -words = [x for s in segs for x in (s.words or [])] -txt = " ".join(x.word.strip() for x in words) - -print(f"=== {p.split(chr(92))[-1]} ===") -print(f"Dauer {dur:.2f}s | {len(words)} Wörter | Tempo {len(words)/max(dur,0.01):.1f} Wörter/s") -print(f"TEXT: {txt}\n") - -print("WORT-TIMING & PAUSE danach:") -pauses = [] -for i, x in enumerate(words): - gap = (words[i + 1].start - x.end) if i + 1 < len(words) else 0.0 - flag = " <=== LANG" if gap >= 0.30 else (" <- Pause" if gap >= 0.15 else "") - if gap >= 0.15: - pauses.append((x.word.strip(), gap)) - print(f" {x.start:5.2f}-{x.end:5.2f} {x.word.strip():16} Pause: {gap*1000:4.0f}ms{flag}") - -# Rand-Stille -env = np.abs(a) > 0.015 -lead = (np.argmax(env) / sr * 1000) if env.any() else 0 -tail = ((len(a) - 1 - np.argmax(env[::-1])) if env.any() else len(a)) -tail_ms = (len(a) - tail) / sr * 1000 - -# Prosodie: F0 (Tonhöhe) über stimmhafte Frames -f0 = librosa.yin(a, fmin=80, fmax=400, sr=sr, frame_length=1024) -f0v = f0[(f0 > 90) & (f0 < 380)] -if f0v.size: - med = float(np.median(f0v)); rng = float(np.percentile(f0v, 90) - np.percentile(f0v, 10)) -else: - med = rng = 0.0 - -print(f"\nPAUSEN gesamt: {len(pauses)} (>=150ms) | längste: " + - (", ".join(f'nach „{w_}\": {g*1000:.0f}ms' for w_, g in sorted(pauses, key=lambda t: -t[1])[:4]) or "keine")) -print(f"RAND-STILLE: vorne {lead:.0f}ms, hinten {tail_ms:.0f}ms") -print(f"TONHÖHE: median {med:.0f}Hz, Spanne {rng:.0f}Hz ({'monoton' if rng < 40 else 'lebendig' if rng > 90 else 'ok'})") diff --git a/client/lucy-tts/bench_b2.py b/client/lucy-tts/bench_b2.py deleted file mode 100644 index 94f541c..0000000 --- a/client/lucy-tts/bench_b2.py +++ /dev/null @@ -1,67 +0,0 @@ -# -*- coding: utf-8 -*- -"""bench_b2.py — verifiziert B2 (Worker-Pool) end-to-end mit den ECHTEN pocket_server-Funktionen. -Misst die Wall-Clock einer langen, mehrsätzigen Antwort SERIELL (1 Modell) vs. 3 WORKER parallel, -prüft die Reihenfolge (geordnete Ausgabe) und legt beide Ergebnis-WAVs auf den Desktop. -""" -import os, time -import numpy as np, soundfile as sf, librosa -from concurrent.futures import ProcessPoolExecutor -from pocket_tts import TTSModel -import pocket_server as ps - -DESK = os.path.join(os.path.expanduser("~"), "Desktop", "lucy_samples") -os.makedirs(DESK, exist_ok=True) - -LONG = ("Guten Morgen, Commander. Das nächtliche Backup ist sauber durchgelaufen. " - "Es gab keine Fehler in den Protokollen. Der Dienst läuft stabil weiter. " - "Ich habe die Modelle vorgewärmt und die Engine antwortet zügig. " - "Wenn du möchtest, starte ich jetzt den Tagesbericht und fasse die offenen Punkte zusammen.") - - -def _serial(): - m = TTSModel.load_model(language=ps.LANG, lsd_decode_steps=ps.LSD, temp=ps.TEMP, - noise_clamp=ps.NOISE_CLAMP, quantize=ps.QUANTIZE) - ref = ps._prep_ref() - try: - vs = m.get_state_for_audio_prompt(ps.VOICE_ST) - except Exception: - vs = m.get_state_for_audio_prompt(ref) - ref_audio, _ = librosa.load(ref, sr=m.sample_rate, mono=True) - ps.STATE.clear() - ps.STATE.update(m=m, vs=vs, sr=m.sample_rate, ref_fp=ps._fingerprint(ref_audio, m.sample_rate)) - sents = ps._split_sentences(LONG) - t0 = time.time() - parts = list(ps._gen_sentences_ordered(sents)) # pool=None -> serieller Zweig (LOCK) - dt = time.time() - t0 - a = np.concatenate(parts) - sf.write(os.path.join(DESK, "b2_serial.wav"), a, m.sample_rate) - ps.STATE.clear(); del m - return dt, a.size / 24000, len(sents) - - -def _parallel(nworkers): - ps.STATE.clear() - pool = ProcessPoolExecutor(max_workers=nworkers, initializer=ps._worker_init) - list(pool.map(ps._warmup, range(nworkers))) # alle Worker vorab hochfahren - ref = ps._prep_ref() - ref_audio, _ = librosa.load(ref, sr=24000, mono=True) - ps.STATE.update(sr=24000, ref_fp=ps._fingerprint(ref_audio, 24000), pool=pool) - sents = ps._split_sentences(LONG) - t0 = time.time() - parts = list(ps._gen_sentences_ordered(sents)) # pool -> parallel, geordnet - dt = time.time() - t0 - a = np.concatenate(parts) - sf.write(os.path.join(DESK, f"b2_parallel_{nworkers}w.wav"), a, 24000) - pool.shutdown(wait=True); ps.STATE.clear() - return dt, a.size / 24000, len(sents) - - -if __name__ == "__main__": - print(f"Text: {len(LONG)} Zeichen") - ds, audio_s, n = _serial() - print(f"SERIELL : {ds:5.2f}s wall ({n} Saetze, {audio_s:4.1f}s Audio) -> b2_serial.wav") - dp, _, _ = _parallel(3) - print(f"3 WORKER: {dp:5.2f}s wall -> b2_parallel_3w.wav") - if dp > 0: - print(f"Speedup : {ds/dp:.2f}x (Audio gleich lang -> nur Generierzeit zaehlt)") - print("B2_DONE") diff --git a/client/lucy-tts/bench_lucy.py b/client/lucy-tts/bench_lucy.py deleted file mode 100644 index 23973fb..0000000 --- a/client/lucy-tts/bench_lucy.py +++ /dev/null @@ -1,109 +0,0 @@ -# -*- coding: utf-8 -*- -"""bench_lucy.py — A3/B1: misst Lucys Stimme (pocket-tts) über temp/lsd. - -Metriken je Konfig: RTF, gen-Zeit und ROHE Kollaps-Rate (EINE Generierung, OHNE best-of-N-Gate) -— also genau das, was der Stimm-Wächter aktuell wegbügeln muss (= Latenz-Treiber). Niedrigere -temp sollte die rohe Kollaps-Rate senken -> weniger Regenerationen -> niedrigere effektive Latenz. - -Nutzung (im ptts-venv der lucy-tts-Maschine): - python bench_lucy.py # Default-Sweep - python bench_lucy.py --reps 5 - python bench_lucy.py --temps 0.7,0.8,0.9 --lsds 8,10,12 - python bench_lucy.py --whisper # + Verständlichkeits-Check (faster-whisper) - -Reuse: Kollaps-Logik (F0 + MFCC-Fingerabdruck) und cleanup() kommen 1:1 aus pocket_server.py, -damit der Benchmark exakt die Produktions-Kriterien misst. -""" -import os, time, argparse, statistics as st -import numpy as np, soundfile as sf, librosa -from pocket_tts import TTSModel -import pocket_server as ps - -SENT = { - "kurz": "Hallo Commander, ich höre dich.", - "mittel": "Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", - "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die " - "Protokolle und melde mich, sobald alles wieder läuft.", -} - - -def _voice_state(m): - """Voice-State laden: bevorzugt das gecachte safetensors (A1), sonst aus der Referenz klonen.""" - if os.path.exists(ps.VOICE_ST): - try: - return m.get_state_for_audio_prompt(ps.VOICE_ST) - except Exception as e: - print(f" (safetensors-Load fehlgeschlagen, klone aus Referenz: {e})") - return m.get_state_for_audio_prompt(ps._prep_ref()) - - -def _raw_gen(m, vs, ref_fp, text, sr): - """EINE rohe Generierung (kein Gate). -> (gen_s, audio_s, male, sim, audio).""" - t0 = time.time() - audio = m.generate_audio(vs, ps.LEAD + text, frames_after_eos=ps.FEOS) - gen = time.time() - t0 - a = audio.numpy() if hasattr(audio, "numpy") else np.asarray(audio) - a = np.asarray(a, dtype=np.float32).reshape(-1) - f0 = ps._voiced_f0(a, sr) - male = (f0 == f0) and f0 < ps.F0_FLOOR # NaN-sicher - fp = ps._fingerprint(ps._crop_lead(a, sr), sr) - sim = float(np.dot(ref_fp, fp)) if (ref_fp is not None and fp is not None) else 1.0 - return gen, a.size / sr, bool(male), sim, a - - -def main(): - ap = argparse.ArgumentParser() - ap.add_argument("--temps", default="0.7,0.8,0.9") - ap.add_argument("--lsds", default="8,10") - ap.add_argument("--reps", type=int, default=4) - ap.add_argument("--whisper", action="store_true") - args = ap.parse_args() - temps = [float(x) for x in args.temps.split(",")] - lsds = [int(x) for x in args.lsds.split(",")] - - OUT = os.path.join(ps.BASE, "out_bench"); os.makedirs(OUT, exist_ok=True) - ref = ps._prep_ref() - print(f"LANG={ps.LANG} quantize={ps.QUANTIZE} noise_clamp={ps.NOISE_CLAMP} " - f"F0_FLOOR={ps.F0_FLOOR} FP_FLOOR={ps.FP_FLOOR} reps={args.reps}") - print(f"{'temp':>5} {'lsd':>4} | {'RTF':>5} {'gen/s':>6} | " - f"{'collapse%':>9} {'sim_min':>7} {'sim_avg':>7}") - rows = [] - for lsd in lsds: - for temp in temps: - m = TTSModel.load_model(language=ps.LANG, lsd_decode_steps=lsd, temp=temp, - noise_clamp=ps.NOISE_CLAMP, quantize=ps.QUANTIZE) - sr = m.sample_rate - ref_audio, _ = librosa.load(ref, sr=sr, mono=True) - ref_fp = ps._fingerprint(ref_audio, sr) - vs = _voice_state(m) - rtfs, gens, sims, collapses, n = [], [], [], 0, 0 - for name, text in SENT.items(): - for r in range(args.reps): - gen, asec, male, sim, a = _raw_gen(m, vs, ref_fp, text, sr) - rtfs.append(gen / max(asec, 0.01)); gens.append(gen); sims.append(sim) - collapses += int(male or sim < ps.FP_FLOOR); n += 1 - if r == 0: # ein Sample je Satz zum Reinhören - sf.write(os.path.join(OUT, f"t{temp}_l{lsd}_{name}.wav"), ps.cleanup(a, sr), sr) - cr = 100.0 * collapses / max(n, 1) - print(f"{temp:>5} {lsd:>4} | {st.mean(rtfs):>5.2f} {st.mean(gens):>6.2f} | " - f"{cr:>8.1f}% {min(sims):>7.3f} {st.mean(sims):>7.3f}") - rows.append((temp, lsd, st.mean(rtfs), cr, min(sims))) - del m - - best = sorted(rows, key=lambda x: (x[3], x[2]))[0] # min Kollaps, dann beste RTF - print(f"\n>> Vorschlag: temp={best[0]} lsd={best[1]} " - f"(collapse={best[3]:.1f}%, RTF={best[2]:.2f}) -> in pocket_server via " - f"LUCY_TEMP / LUCY_LSD setzen.") - - if args.whisper: - print("\n=== Whisper-Verständlichkeit (faster-whisper small/int8) ===") - from faster_whisper import WhisperModel - import glob - wm = WhisperModel("small", device="cpu", compute_type="int8") - for p in sorted(glob.glob(os.path.join(OUT, "*.wav"))): - segs, _ = wm.transcribe(p, language="de", beam_size=5) - print(os.path.basename(p), "::", " ".join(s.text.strip() for s in segs)) - - -if __name__ == "__main__": - main() diff --git a/client/lucy-tts/debug_stream.py b/client/lucy-tts/debug_stream.py deleted file mode 100644 index e70f934..0000000 --- a/client/lucy-tts/debug_stream.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -"""Debug: warum greift der Onset-Crop auf dem 1s-Kopf des Streams nicht? + Roh-RMS für Gain-Kalibrierung.""" -import os, numpy as np, librosa, soundfile as sf -from pocket_tts import TTSModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -src,_ = librosa.load(os.path.join(BASE,"ref.mp3"), sr=24000, mono=True) -srt,_ = librosa.effects.trim(src, top_db=30); ref=os.path.join(BASE,"ref.wav") -sf.write(ref, srt[:int(18*24000)], 24000) - -m = TTSModel.load_model(language="german_24l", lsd_decode_steps=6, temp=0.9) -vs = m.get_state_for_audio_prompt(ref); sr = m.sample_rate -LEAD = "Tja. " -text = LEAD + "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu." - -chunks = [] -for c in m.generate_audio_stream(vs, text, frames_after_eos=4): - c = c.numpy() if hasattr(c,"numpy") else np.asarray(c) - chunks.append(np.asarray(c,dtype=np.float32).reshape(-1)) -print(f"#chunks={len(chunks)} chunk_sizes_ms={[round(x.size/sr*1000) for x in chunks[:8]]}") -full = np.concatenate(chunks) -print(f"full dur={full.size/sr:.2f}s peak={np.abs(full).max():.3f} rms={np.sqrt(np.mean(full**2)):.3f}") - -head = full[:int(1.0*sr)] -for td in (45, 35, 25, 20): - iv = librosa.effects.split(head, top_db=td) - segs = [(round(s/sr,2), round(e/sr,2)) for s,e in iv] - print(f"HEAD top_db={td}: {len(iv)} segs {segs}") -# voller Onset-Crop (wie nicht-stream) zum Vergleich -ivf = librosa.effects.split(full, top_db=35) -print(f"FULL top_db=35: {len(ivf)} segs erste3={[(round(s/sr,2),round(e/sr,2)) for s,e in ivf[:3]]}") -print("DBG_DONE") diff --git a/client/lucy-tts/diag_clip.py b/client/lucy-tts/diag_clip.py deleted file mode 100644 index 43c7bfd..0000000 --- a/client/lucy-tts/diag_clip.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -"""Diagnose: schneidet das Modell selbst vorne/hinten ab, oder mein Trim? -Misst Stille-Anteil am Anfang/Ende des ROHEN Outputs (vor jedem Trim).""" -import os, time, numpy as np, soundfile as sf, librosa -from pocket_tts import TTSModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -OUT = os.path.join(BASE, "out_diag"); os.makedirs(OUT, exist_ok=True) -y, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) -yt, _ = librosa.effects.trim(y, top_db=30); ref = os.path.join(BASE, "ref.wav") -sf.write(ref, yt[:int(18*24000)], 24000) - -SENT = { - "kurz": "Hallo Commander, ich höre dich.", - "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", -} - -def lead_tail_silence(a, sr): - """Wie viel ms am Anfang/Ende liegen unter -40dB vom Peak (= 'Stille')?""" - a = np.abs(np.asarray(a, dtype=np.float32).reshape(-1)) - if a.size == 0: return 0.0, 0.0, 0.0 - peak = a.max() + 1e-9 - thr = peak * (10 ** (-40/20)) # -40 dB - above = np.where(a > thr)[0] - if above.size == 0: return a.size/sr*1000, a.size/sr*1000, 0.0 - lead = above[0] / sr * 1000 - tail = (a.size - 1 - above[-1]) / sr * 1000 - return lead, tail, a.size/sr*1000 - -m = TTSModel.load_model(language="german_24l", lsd_decode_steps=4) -vs = m.get_state_for_audio_prompt(ref) -sr = m.sample_rate -for name, text in SENT.items(): - for feos in [None, 4, 8]: - a = m.generate_audio(vs, text, frames_after_eos=feos) - a = a.numpy() if hasattr(a, "numpy") else np.asarray(a) - a = a.reshape(-1) - lead, tail, total = lead_tail_silence(a, sr) - sf.write(os.path.join(OUT, f"raw_{name}_feos{feos}.wav"), a, sr) - print(f"[{name:5} feos={str(feos):4}] total={total:7.1f}ms lead_sil={lead:6.1f}ms tail_sil={tail:6.1f}ms peak={np.abs(a).max():.3f}", flush=True) -print("DIAG_DONE", flush=True) diff --git a/client/lucy-tts/diag_noiseclamp.py b/client/lucy-tts/diag_noiseclamp.py deleted file mode 100644 index 7216b06..0000000 --- a/client/lucy-tts/diag_noiseclamp.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -"""Stabilität gegen Stimm-Kollaps: temp 0.9 mit/ohne noise_clamp. F0-Verteilung + Whisper + RTF. -Mehr Samples, um einen Kollaps (tiefe F0) zu provozieren und zu sehen, ob noise_clamp ihn dämpft.""" -import os, time, numpy as np, librosa, soundfile as sf -from pocket_tts import TTSModel -from faster_whisper import WhisperModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -src,_ = librosa.load(os.path.join(BASE,"ref.mp3"), sr=24000, mono=True) -srt,_ = librosa.effects.trim(src, top_db=30); ref=os.path.join(BASE,"ref.wav") -sf.write(ref, srt[:int(18*24000)], 24000) -LEAD="Tja. " -TEXTS = ["Hallo Commander, ich höre dich.","Natürlich, das mache ich sofort für dich.", - "Die Hitze ist heute wirklich heftig.","Klar, ich kümmere mich gleich darum.", - "Guten Morgen, Commander, alles sauber.","Kein Problem, ich erledige das jetzt.", - "Das Backup lief ohne Fehler durch.","Verstanden, Commander, ich bleibe dran."] -w = WhisperModel("small", device="cpu", compute_type="int8") - -def f0_of(a, sr): - f0,_,_ = librosa.pyin(a, fmin=80, fmax=400, sr=sr, frame_length=1024) - v=f0[~np.isnan(f0)]; return float(np.median(v)) if v.size else float("nan") - -def run(temp, nc): - m = TTSModel.load_model(language="german_24l", lsd_decode_steps=6, temp=temp, noise_clamp=nc) - vs = m.get_state_for_audio_prompt(ref); sr=m.sample_rate - print(f"=== temp={temp} noise_clamp={nc} ===", flush=True) - f0s=[]; rtfs=[] - for i in range(12): - t=TEXTS[i%len(TEXTS)] - t0=time.time(); a=m.generate_audio(vs, LEAD+t, frames_after_eos=4); dt=time.time()-t0 - a=a.numpy() if hasattr(a,"numpy") else np.asarray(a); a=np.asarray(a,dtype=np.float32).reshape(-1) - f0=f0_of(a,sr); f0s.append(f0); rtfs.append(dt/max(a.size/sr,0.01)) - flag=" <<< MÄNNLICH/Kollaps?" if (f0==f0 and f0<150) else "" - print(f" [{i:2}] F0={f0:6.1f}Hz{flag}", flush=True) - arr=np.array([x for x in f0s if x==x]) - print(f" -> F0 median {np.median(arr):.0f} min {arr.min():.0f} max {arr.max():.0f} | RTF~{np.median(rtfs):.2f}", flush=True) - -run(0.9, None) -run(0.9, 3.0) -print("NC_DONE") diff --git a/client/lucy-tts/diag_stream2.py b/client/lucy-tts/diag_stream2.py deleted file mode 100644 index eaa546a..0000000 --- a/client/lucy-tts/diag_stream2.py +++ /dev/null @@ -1,57 +0,0 @@ -# -*- coding: utf-8 -*- -"""Warum 'manchmal zu laut' + 'Stimme verändert sich am Anfang'? Stream-Kopf-Logik N× laufen lassen -und Gain, Crop-Punkt, Kopf-Segmente, Whisper-Start, rms/peak protokollieren.""" -import os, numpy as np, librosa, soundfile as sf -from pocket_tts import TTSModel -from faster_whisper import WhisperModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -src,_ = librosa.load(os.path.join(BASE,"ref.mp3"), sr=24000, mono=True) -srt,_ = librosa.effects.trim(src, top_db=30); ref=os.path.join(BASE,"ref.wav") -sf.write(ref, srt[:int(18*24000)], 24000) -TARGET_RMS=0.09; LEAD="Tja. " -m = TTSModel.load_model(language="german_24l", lsd_decode_steps=6, temp=0.9) -vs = m.get_state_for_audio_prompt(ref); sr=m.sample_rate -w = WhisperModel("small", device="cpu", compute_type="int8") -TEXTS = ["Hallo Commander, ich höre dich.", - "Natürlich, Commander. Das Backup ist sauber durchgelaufen."] - -def run_once(text): - chunks=[] - for c in m.generate_audio_stream(vs, LEAD+text, frames_after_eos=4): - c=c.numpy() if hasattr(c,"numpy") else np.asarray(c) - chunks.append(np.asarray(c,dtype=np.float32).reshape(-1)) - full=np.concatenate(chunks) - # Kopf adaptiv (wie Server): bis >=2 Segmente oder 2.5s - head=[]; hl=0; head_arr=None - for c in chunks: - head.append(c); hl+=c.size - if hl < int(0.5*sr): continue - a=np.concatenate(head) - if len(librosa.effects.split(a, top_db=35))>=2 or hl>=int(2.5*sr): - head_arr=a; break - if head_arr is None: head_arr=np.concatenate(head) - iv=librosa.effects.split(head_arr, top_db=35) - segs=[(round(s/sr,2),round(e/sr,2)) for s,e in iv] - # Gain aus voiced (aktuelle Server-Logik) - voiced=np.concatenate([head_arr[s:e] for s,e in iv]) if len(iv) else head_arr - rms=float(np.sqrt(np.mean(voiced**2))) or 1e-9 - gain=TARGET_RMS/rms - # Crop (aktuell): kurz vor echtem Wort - if len(iv)>=2: - cut=max(iv[0][1], iv[1][0]-int(0.06*sr)); cropped=full[cut:] - else: - cropped=full - out=np.clip(cropped*gain,-0.95,0.95) - sf.write(os.path.join(BASE,"out_diag_s.wav"), out, sr) - seg,_=w.transcribe(os.path.join(BASE,"out_diag_s.wav"), language="de", beam_size=5) - start=(" ".join(x.text for x in seg)).strip()[:30] - return dict(segs=segs, voiced_rms=round(rms,3), gain=round(gain,2), - out_rms=round(float(np.sqrt(np.mean(out**2))),3), out_peak=round(float(np.abs(out).max()),3), - start=start) - -for text in TEXTS: - print(f"=== {text[:30]!r} ===") - for i in range(4): - print(f" run{i}:", run_once(text)) -print("DIAG2_DONE") diff --git a/client/lucy-tts/diag_stream3.py b/client/lucy-tts/diag_stream3.py deleted file mode 100644 index 66bd950..0000000 --- a/client/lucy-tts/diag_stream3.py +++ /dev/null @@ -1,59 +0,0 @@ -# -*- coding: utf-8 -*- -"""Test der ROBUSTEN Stream-Kopf-Logik: fester 1.8s-Kopf + Crop am ersten SUBSTANZIELLEN Wort-Segment -(ignoriert Mini-Blips) + FIXER Gain. Ziel: Start immer echtes Wort, out_rms stabil ~0.09, kein Clip.""" -import os, numpy as np, librosa, soundfile as sf -from pocket_tts import TTSModel -from faster_whisper import WhisperModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -src,_ = librosa.load(os.path.join(BASE,"ref.mp3"), sr=24000, mono=True) -srt,_ = librosa.effects.trim(src, top_db=30); ref=os.path.join(BASE,"ref.wav") -sf.write(ref, srt[:int(18*24000)], 24000) -TARGET_RMS=0.09; LEAD="Tja. " -BASE_GAIN = TARGET_RMS / 0.18 # ~0.5 (raw full-rms ~0.18 konsistent) -GMIN, GMAX = 0.7*BASE_GAIN, 1.4*BASE_GAIN # Gain-Clamp -> kann NIE explodieren -HEAD_FIXED = int(2.0*24000) -m = TTSModel.load_model(language="german_24l", lsd_decode_steps=6, temp=0.9) -vs = m.get_state_for_audio_prompt(ref); sr=m.sample_rate -w = WhisperModel("small", device="cpu", compute_type="int8") -TEXTS = ["Hallo Commander, ich höre dich.", - "Natürlich, Commander. Das Backup ist sauber durchgelaufen."] - -def crop_and_gain(a): - """Crop am ersten SUBSTANZIELLEN Wort-Segment nach dem Lead (>=0.2s, ignoriert Mini-Blips); - Gain aus voiced-rms, GECLAMPT (kann nie explodieren).""" - iv = librosa.effects.split(a, top_db=35) - voiced = np.concatenate([a[s:e] for s,e in iv]) if len(iv) else a - rms = float(np.sqrt(np.mean(voiced**2))) or 1e-9 - gain = float(np.clip(TARGET_RMS/rms, GMIN, GMAX)) - cut = 0 - if len(iv) >= 2: - for k in range(1, len(iv)): - if (iv[k][1]-iv[k][0]) >= int(0.20*sr): - cut = max(iv[k-1][1], iv[k][0]-int(0.06*sr)); break - return a[cut:], round(cut/sr,2), round(gain,2) - -def run_once(text): - head=[]; hl=0; head_done=False; head_arr=None; rest=[] - for c in m.generate_audio_stream(vs, LEAD+text, frames_after_eos=4): - c=c.numpy() if hasattr(c,"numpy") else np.asarray(c); c=np.asarray(c,dtype=np.float32).reshape(-1) - if not head_done: - head.append(c); hl+=c.size - if hl>=HEAD_FIXED: head_arr=np.concatenate(head); head_done=True - else: rest.append(c) - if head_arr is None: head_arr=np.concatenate(head) - cropped_head, cutpt, gain = crop_and_gain(head_arr) - full = np.concatenate([cropped_head]+rest) - out=np.clip(full*gain,-0.95,0.95) - sf.write(os.path.join(BASE,"out_diag_s3.wav"), out, sr) - seg,_=w.transcribe(os.path.join(BASE,"out_diag_s3.wav"), language="de", beam_size=5) - start=(" ".join(x.text for x in seg)).strip()[:32] - return dict(cut=cutpt, gain=gain, out_rms=round(float(np.sqrt(np.mean(out**2))),3), - out_peak=round(float(np.abs(out).max()),3), start=start) - -print(f"gain-clamp=[{round(GMIN,2)},{round(GMAX,2)}] head={HEAD_FIXED/24000}s") -for text in TEXTS: - print(f"=== {text[:28]!r} ===") - for i in range(5): - print(f" run{i}:", run_once(text)) -print("DIAG3_DONE") diff --git a/client/lucy-tts/diag_voice_f0.py b/client/lucy-tts/diag_voice_f0.py deleted file mode 100644 index cedd9b7..0000000 --- a/client/lucy-tts/diag_voice_f0.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- -"""Verifiziert die 'Stimme wurde männlich'-Hypothese: misst F0 (Grundfrequenz) vieler Generierungen -bei temp 0.9 vs 0.7. Weiblich (Saber-Klon) ~180-240Hz, männlich-Drift (Default 'juergen') ~100-140Hz. -Sucht Ausreißer = Stimm-Identitäts-Kollaps.""" -import os, numpy as np, librosa, soundfile as sf -from pocket_tts import TTSModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -src,_ = librosa.load(os.path.join(BASE,"ref.mp3"), sr=24000, mono=True) -srt,_ = librosa.effects.trim(src, top_db=30); ref=os.path.join(BASE,"ref.wav") -sf.write(ref, srt[:int(18*24000)], 24000) -LEAD="Tja. " -TEXTS = [ - "Hallo Commander, ich höre dich.", - "Natürlich, Commander, das mache ich sofort.", - "Die Hitze in Hamburg ist heute wirklich heftig.", - "Klar, ich kümmere mich gleich darum für dich.", - "Guten Morgen, Commander, alles läuft sauber.", - "Das Backup ist durchgelaufen, keine Fehler.", -] - -def median_f0(a, sr): - f0,_,_ = librosa.pyin(a, fmin=80, fmax=400, sr=sr, frame_length=1024) - v = f0[~np.isnan(f0)] - return float(np.median(v)) if v.size else float("nan") - -def run(temp): - m = TTSModel.load_model(language="german_24l", lsd_decode_steps=6, temp=temp) - vs = m.get_state_for_audio_prompt(ref); sr=m.sample_rate - print(f"=== temp={temp} ===", flush=True) - f0s=[] - for i,t in enumerate(TEXTS): - a = m.generate_audio(vs, LEAD+t, frames_after_eos=4) - a = a.numpy() if hasattr(a,"numpy") else np.asarray(a) - a = np.asarray(a,dtype=np.float32).reshape(-1) - f0 = median_f0(a, sr); f0s.append(f0) - flag = " <<< MÄNNLICH?" if (f0==f0 and f0<150) else "" - print(f" [{i}] F0={f0:6.1f}Hz{flag} ({t[:30]})", flush=True) - arr=np.array([x for x in f0s if x==x]) - print(f" -> median {np.median(arr):.0f}Hz, min {arr.min():.0f}, max {arr.max():.0f}", flush=True) - -run(0.9) -run(0.7) -print("F0_DONE") diff --git a/client/lucy-tts/final_test.py b/client/lucy-tts/final_test.py deleted file mode 100644 index 3b80707..0000000 --- a/client/lucy-tts/final_test.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: utf-8 -*- -"""ABSCHLUSS-TEST: beweist die Prompt-Wirkung. Dieselbe Lucy-Antwort im NEUEN Stil (kurze Sätze, -Punkte) vs. ALTEM Stil (Komma-Kette). Rendert auf :8134 + Desktop, misst Pausen (Whisper).""" -import os, io, json, urllib.request -import numpy as np, soundfile as sf -from faster_whisper import WhisperModel - -SERVER = "http://127.0.0.1:8134/tts" -OUT = os.path.join(os.path.expanduser("~"), "Desktop", "lucy_test"); os.makedirs(OUT, exist_ok=True) - -# Gleicher Inhalt, zwei Stile — so würde Lucy VORHER (Komma-Kette) und NACHHER (Prompt: kurze Sätze) antworten. -PAIRS = [ - ("A_backup", - "Klar, Commander, das Backup ist heute Nacht durchgelaufen, es gab keine Fehler, und die Datenbank läuft stabil bei 92 Prozent.", - "Klar, Commander. Das Backup lief heute Nacht durch. Keine Fehler. Die Datenbank ist stabil bei 92 Prozent."), - ("B_status", - "Also, wenn ich das kurz zusammenfasse, die Verbindung war weg, dann lief das Update durch, danach musste ich neu starten, und jetzt sind alle Dienste wieder oben.", - "Kurz zusammengefasst, Commander. Die Verbindung war weg. Das Update lief durch. Ich musste neu starten. Jetzt sind alle Dienste wieder oben."), -] - -def render(text): - req = urllib.request.Request(SERVER, data=json.dumps({"text": text}).encode("utf-8"), - headers={"Content-Type": "application/json"}) - return urllib.request.urlopen(req, timeout=180).read() - -w = WhisperModel("small", device="cpu", compute_type="int8") - -def measure(tag, text): - wav = render(text); path = os.path.join(OUT, tag + ".wav"); open(path, "wb").write(wav) - a, sr = sf.read(io.BytesIO(wav)); a = np.asarray(a, dtype=np.float32).reshape(-1); dur = len(a)/sr - segs, _ = w.transcribe(path, language="de", beam_size=5, word_timestamps=True) - words = [x for s in segs for x in (s.words or [])] - gaps = [words[i+1].start - words[i].end for i in range(len(words)-1)] - lang = [(words[i].word.strip(), gaps[i]) for i in range(len(gaps)) if gaps[i] >= 0.30] - total_pause = sum(g for g in gaps if g >= 0.15) - return dur, len(lang), total_pause, lang - -for name, alt, neu in PAIRS: - d_a, n_a, tp_a, l_a = measure(f"{name}_ALT_komma", alt) - d_n, n_n, tp_n, l_n = measure(f"{name}_NEU_kurz", neu) - print(f"\n### {name}") - print(f" ALT (Komma-Kette): {d_a:4.1f}s | {n_a} LANG-Pausen | Summe Pausen {tp_a*1000:4.0f}ms") - print(f" LANG: " + (", ".join(f'„{ww}\"={gg*1000:.0f}ms' for ww, gg in l_a) or "keine")) - print(f" NEU (kurze Sätze): {d_n:4.1f}s | {n_n} LANG-Pausen | Summe Pausen {tp_n*1000:4.0f}ms") - print(f" LANG: " + (", ".join(f'„{ww}\"={gg*1000:.0f}ms' for ww, gg in l_n) or "keine")) - print(f" -> {d_a-d_n:+.1f}s Dauer, {tp_a*1000-tp_n*1000:+.0f}ms Pausen-Summe") -print("\n=== ABSCHLUSS-TEST FERTIG === (WAVs im Desktop\\lucy_test)") diff --git a/client/lucy-tts/lucy_ready.py b/client/lucy-tts/lucy_ready.py deleted file mode 100644 index fca201b..0000000 --- a/client/lucy-tts/lucy_ready.py +++ /dev/null @@ -1,60 +0,0 @@ -# -*- coding: utf-8 -*- -"""lucy_ready.py — Startklar-Check + finale Samples in EINEM Lauf. -Bootet den ECHTEN Server (FastAPI-TestClient triggert lifespan: Modell-Load, A1-Cache, STATE), -prüft /health, und rendert die finalen Hörproben über die REALEN Endpoints /tts und /tts/stream -(exakt das, was die Lucy-App auf :8130 aufruft) — inkl. Live-TTFB der Streaming-Antwort. -Legt die Samples auf den Desktop, schreibt lucy_ready_report.json. -""" -import os, time, json -import numpy as np, soundfile as sf -from fastapi.testclient import TestClient -import pocket_server as ps - -DESK = os.path.join(os.path.expanduser("~"), "Desktop", "lucy_samples") -os.makedirs(DESK, exist_ok=True) - -SENT = { - "kurz": "Hallo Commander, ich höre dich.", - "mittel": "Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", - "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die " - "Protokolle und melde mich, sobald alles wieder läuft.", -} -LONG = ("Guten Morgen, Commander. " - "Das nächtliche Backup ist sauber durchgelaufen und es gab keine Fehler. " - "Der Dienst läuft stabil und die Engine antwortet zügig. " - "Wenn du möchtest, fasse ich die offenen Punkte für heute zusammen.") - -report = {} -t0 = time.time() -with TestClient(ps.app) as c: # <-- triggert lifespan (echter Boot) - report["boot_s"] = round(time.time() - t0, 1) - h = c.get("/health").json() - report["health"] = h - print(f"BOOT in {report['boot_s']}s health={h}") - - for name, text in SENT.items(): # /tts (ganze Datei) -> Desktop - t = time.time(); r = c.post("/tts", json={"text": text}); dt = time.time() - t - assert r.status_code == 200, f"/tts {name} -> {r.status_code}" - open(os.path.join(DESK, f"lucy_final_{name}.wav"), "wb").write(r.content) - print(f"/tts {name:6}: {dt:4.2f}s audio={r.headers.get('X-Audio-Seconds')}s") - - # /tts/stream: lange Antwort wie Lucy LIVE spricht -> TTFB messen + PCM zu WAV - sr = int(h.get("sr") or 24000) - t = time.time(); first = None; chunks = [] - with c.stream("POST", "/tts/stream", json={"text": LONG}) as s: - sr = int(s.headers.get("X-Sample-Rate", sr)) - for ch in s.iter_bytes(): - if ch: - if first is None: - first = time.time() - t - chunks.append(ch) - a = np.frombuffer(b"".join(chunks), dtype=" {p}") - ps.STATE.clear() - del m - - -if __name__ == "__main__": - print("=== A2 AN (Highpass+Norm) + A1 safetensors-Cache ===") - build(ref_clean=True, tag="clean", use_cache=True) - print("\n=== A2 AUS (Roh-Referenz, direkt geklont) ===") - build(ref_clean=False, tag="raw", use_cache=False) - print(f"\nFERTIG. Samples liegen in: {DESK}") diff --git a/client/lucy-tts/measure_fix.py b/client/lucy-tts/measure_fix.py deleted file mode 100644 index a9080b9..0000000 --- a/client/lucy-tts/measure_fix.py +++ /dev/null @@ -1,38 +0,0 @@ -# -*- coding: utf-8 -*- -"""Fix-Verifikation: rendert die Problem-/Regressionssätze auf :8134, misst Pausen + IST (Whisper).""" -import os, io, json, urllib.request -import numpy as np, soundfile as sf -from faster_whisper import WhisperModel - -SERVER = "http://127.0.0.1:8134/tts" -OUT = os.path.join(os.environ["TEMP"], "lucy_fix"); os.makedirs(OUT, exist_ok=True) - -TESTS = [ - ("01_kurz", "Schön, dass du da bist, Commander."), - ("07_lang", "Guten Morgen, Commander. Das nächtliche Backup ist um 3 Uhr durchgelaufen, es gab keine Fehler, und die Datenbank läuft mit 92 Prozent Auslastung völlig stabil."), - ("08_sehr_lang","Also, Commander, wenn ich das kurz zusammenfassen darf: heute früh war die Verbindung weg, dann lief das Update durch, danach musste ich zweimal neu starten, und jetzt sind endlich alle Dienste oben, das Gedächtnis ist warm, und wir können ganz entspannt weitermachen."), - ("09_akronyme", "Die CPU der RX 9070 XT und die GPU laufen mit ROCm, sagt der PC über das LAN. Es ist 21 Uhr UTC."), -] - -def render(text): - req = urllib.request.Request(SERVER, data=json.dumps({"text": text}).encode("utf-8"), - headers={"Content-Type": "application/json"}) - return urllib.request.urlopen(req, timeout=180).read() - -w = WhisperModel("small", device="cpu", compute_type="int8") -for name, text in TESTS: - wav = render(text) - path = os.path.join(OUT, name + ".wav"); open(path, "wb").write(wav) - a, sr = sf.read(io.BytesIO(wav)); a = np.asarray(a, dtype=np.float32).reshape(-1); dur = len(a)/sr - segs, _ = w.transcribe(path, language="de", beam_size=5, word_timestamps=True) - words = [x for s in segs for x in (s.words or [])] - got = " ".join(x.word.strip() for x in words) - pauses = [(words[i].word.strip(), words[i+1].start - words[i].end) - for i in range(len(words)-1) if (words[i+1].start - words[i].end) >= 0.25] - print(f"\n### {name} {dur:.1f}s {len(words)} Wörter") - print(f"IST: {got}") - if pauses: - print("PAUSEN>=250ms: " + ", ".join(f'„{ww}\"={gg*1000:.0f}ms' for ww, gg in sorted(pauses, key=lambda t:-t[1])[:6])) - else: - print("PAUSEN>=250ms: KEINE") -print("\n=== FERTIG ===") diff --git a/client/lucy-tts/oute_pc.py b/client/lucy-tts/oute_pc.py deleted file mode 100644 index 7819554..0000000 --- a/client/lucy-tts/oute_pc.py +++ /dev/null @@ -1,45 +0,0 @@ -# -*- coding: utf-8 -*- -import os, time, numpy as np, soundfile as sf, librosa, torch, torchaudio -def _ta_load(p,*a,**k): - x,sr=sf.read(p,dtype="float32"); return torch.from_numpy((x.T if x.ndim>1 else x[None,:]).copy()),sr -def _ta_save(p,t,sample_rate=24000,*a,**k): - sr=k.get("sample_rate",sample_rate); x=t.detach().cpu().numpy() - sf.write(p,(x.T if x.ndim>1 else x.reshape(-1)),int(sr)) -torchaudio.load=_ta_load; torchaudio.save=_ta_save -def _wl(f,sr=16000): - y,_=librosa.load(f,sr=sr,mono=True); return y.astype(np.float32) -try: - import whisper.audio as _wa; _wa.load_audio=_wl - import whisper.transcribe as _wt; _wt.load_audio=_wl -except Exception as e: print("whisper-patch:", e, flush=True) -import outetts - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -ref = os.path.join(BASE, "ref.wav") -y,_ = librosa.load(os.path.join(BASE,"ref.mp3"), sr=24000, mono=True) -yt,_ = librosa.effects.trim(y, top_db=30) -sf.write(ref, yt[:int(14*24000)], 24000) - -cfg = outetts.ModelConfig( - model_path=os.path.join(BASE,"models","OuteTTS-1.0-1B-Q8_0.gguf"), - tokenizer_path="OuteAI/Llama-OuteTTS-1.0-1B", - interface_version=outetts.InterfaceVersion.V3, - backend=outetts.Backend.LLAMACPP, -) -cfg.n_gpu_layers = 999 -t0=time.time(); iface=outetts.Interface(config=cfg); print(f"[iface] {time.time()-t0:.1f}s", flush=True) -spk=iface.create_speaker(ref); print("[clone ok]", flush=True) - -OUT=os.path.join(BASE,"out"); os.makedirs(OUT,exist_ok=True) -SENT={ - "kurz":"Hallo Commander, ich höre dich.", - "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", - "lang":"Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", -} -for name,text in SENT.items(): - for run in ("cold","warm"): - t0=time.time(); out=iface.generate(config=outetts.GenerationConfig(text=text, speaker=spk)); dt=time.time()-t0 - p=os.path.join(OUT,f"{name}.wav"); out.save(p) - x,sr=sf.read(p); secs=len(x)/sr - print(f"[{name:6} {run:4}] gen={dt:5.2f}s audio={secs:5.2f}s RTF={dt/max(secs,0.01):.2f}", flush=True) -print("PC_DONE", flush=True) diff --git a/client/lucy-tts/pocket_server.py b/client/lucy-tts/pocket_server.py deleted file mode 100644 index b3e3bc9..0000000 --- a/client/lucy-tts/pocket_server.py +++ /dev/null @@ -1,471 +0,0 @@ -# -*- coding: utf-8 -*- -"""Lucy-Stimme: Pocket TTS (Kyutai) als lokaler CPU-Dienst. Klont Lucys Saber-Stimme, real-time, kein GPU.""" -import os, io, re, time, threading, logging -import numpy as np, soundfile as sf, librosa -from scipy.signal import butter, sosfilt -from fastapi import FastAPI -from fastapi.responses import Response, JSONResponse, StreamingResponse -from pydantic import BaseModel -from contextlib import asynccontextmanager -from concurrent.futures import ProcessPoolExecutor -from pocket_tts import TTSModel, export_model_state -from text_norm import normalize_numbers, fix_acronyms # Zahlen-Normalisierung + Akronym-Fix für die Stimme - -log = logging.getLogger("lucy-tts"); logging.basicConfig(level=logging.INFO) -BASE = os.path.dirname(os.path.abspath(__file__)) -REF_MP3 = os.path.join(BASE, "ref.mp3") -LANG = os.environ.get("LUCY_LANG", "german_24l") -# Vom User per Ohr getunt (2026-06-28): lsd 10 + noise_clamp 2.5 + ref18 (Sweep-Sieger: sauberes -# 'Commander', Timbre + logische Betonung, wenig Rauschen). temp 0.9 (lebendig). Per Env umschaltbar. -LSD = int(os.environ.get("LUCY_LSD", "16")) # 16 statt 10: glattere Prosodie/Komma-Übergänge (User-A/B 2026-07-01), RTF bleibt <1 -TEMP = float(os.environ.get("LUCY_TEMP", "0.9")) -def _parse_nc(v): # noise_clamp: Zahl, oder None bei "none"/leer/0 - return None if v.strip().lower() in ("", "none", "0") else float(v) -NOISE_CLAMP = _parse_nc(os.environ.get("LUCY_NOISE_CLAMP", "2.5")) # dämpft Artefakte+Rauschen+Kollaps; 3.0 = rauschärmer -FEOS = int(os.environ.get("LUCY_FRAMES_AFTER_EOS", "4")) # kurze Sätze bekamen sonst 0ms Schwanz -TARGET_RMS = float(os.environ.get("LUCY_TARGET_RMS", "0.09")) # User: 0.09 u. 0.06 beide gut -> 0.09 Default -LEAD = os.environ.get("LUCY_LEAD", "Tja. ") # Wegwerf-Lead-Wort -> natürlicher Onset fürs echte 1. Wort -QUANTIZE = os.environ.get("LUCY_QUANTIZE", "1") not in ("0", "false", "False") # int8: ~27% schneller, lt. Doku ohne Qualitätsverlust -PAD_S = float(os.environ.get("LUCY_PAD_S", "0.025")) # Satz-Polster (klein = flüssigere Übergänge bei langen Antworten) -TAIL_DB = int(os.environ.get("LUCY_TAIL_DB", "30")) # Tail-Trim (dB unter Peak): kleiner = mehr Nachlauf-Stille weg = kürzere Satz-Pausen (gemessen: 45 ließ 500-680ms stehen) -MAX_GAP_S = float(os.environ.get("LUCY_MAX_GAP", "0.20")) # interne Sprech-Pausen deckeln: Pockets Komma-Pausen ziehen bis 580ms -> hart auf 200ms kappen (flüssiger) -F0_FLOOR = float(os.environ.get("LUCY_F0_FLOOR", "160")) # Hz: drunter = männlicher Kollaps (Klon~220, male~100) -FP_FLOOR = float(os.environ.get("LUCY_FP_FLOOR", "0.94")) # Fingerabdruck-Ähnlichkeit (ohne MFCC0): drunter = Stimm-Drift (gut 0.956-0.98, drift 0.928) -MAX_TRIES = int(os.environ.get("LUCY_MAX_TRIES", "3")) # max. Versuche gegen Stimm-Anomalien -FP_MIN_S = float(os.environ.get("LUCY_FP_MIN_S", "2.0")) # B3: FP-Drift-Gate erst ab so viel stimmhafter Dauer (kurze Audios = verrauschter Fingerabdruck = Fehlalarm). F0-Gate bleibt immer aktiv. -# A1: Voice-State einmalig nach safetensors exportieren -> Start lädt kvcache statt neu zu klonen. -VOICE_ST = os.environ.get("LUCY_VOICE_ST", os.path.join(BASE, "lucy_voice.safetensors")) -FORCE_RECLONE = os.environ.get("LUCY_FORCE_RECLONE", "0") not in ("0", "false", "False") -# A2: Referenz-Cleaning (pocket reproduziert die Sample-Qualität mit) — Highpass + Peak-Norm, abschaltbar. -REF_CLEAN = os.environ.get("LUCY_REF_CLEAN", "1") not in ("0", "false", "False") -REF_HPF_HZ = float(os.environ.get("LUCY_REF_HPF_HZ", "70")) # Rumpel/Netzbrumm raus -REF_SECONDS = float(os.environ.get("LUCY_REF_SECONDS", "18")) # Klon-Referenzlänge -# B2: parallele Satz-Worker. SWEEP-ERGEBNIS (9700X, german_24l, 30.06.): seriell hat die BESTE -# TTFB (3.6s vs 6–8s Pool) UND RTF 0.74<1 (generiert schneller als Echtzeit -> Streaming spielt -# lückenlos). Daher Default 0 = seriell für Lucys Live-Stimme. Der Pool (>=1) lohnt NUR für -# Batch-/tts (ganze Datei am Stück): Durchsatz-Sweet-Spot 4w×2t (RTF 0.44) bzw. 3w×2t (RTF 0.50). -# Threads pro Worker via LUCY_WORKER_THREADS. -WORKERS = int(os.environ.get("LUCY_WORKERS", "0")) -# TTFB-Opt „kurzer erster Chunk": erster Stream-Chunk bleibt kurz -> Lucy spricht früher. -# MIT B3 (FP-Gate überspringt kurze Audios) GEMESSEN STARK: TTFB 1.31s statt 3.74s (30.06.), -# Wall ~gleich, RTF<1 (lückenlos). Daher Default AN. (Ohne B3 wäre es schlechter -> beides gehört -# zusammen.) Nur Stream-Pfad. -FAST_FIRST = os.environ.get("LUCY_FAST_FIRST", "1") not in ("0", "false", "False") -MIN_LEN = int(os.environ.get("LUCY_MIN_LEN", "55")) # Chunk-Bündelung: größer = weniger Übergänge = flüssiger -# Laufzeit-Regler (POST /tune, OHNE Neustart) -> Prosodie live nach Ohr A/B-testen. -# temp/lsd/noise_clamp sind Modell-Load-Params und NICHT hier drin (die brauchen einen Neustart). -TUNE = {"min_len": MIN_LEN, "pad_s": PAD_S, "fast_first": FAST_FIRST} -# Umlaut-Fix: LLM (Hermes/Qwen) gibt manchmal ASCII-Umlaute aus (ueber/schoen/maerz) -> pocket liest -# „ue" wörtlich. Wir wandeln NUR bekannte Ganzwörter zurück (sicher: „neue/aktuell/Steuer" bleiben). -UMLAUT_FIX = os.environ.get("LUCY_UMLAUT_FIX", "1") not in ("0", "false", "False") -STATE, LOCK = {}, threading.Lock() - -# Bekannte deutsche Umlaut-Wörter (korrekt geschrieben). Die ASCII-Schlüssel (ä->ae, ö->oe, ü->ue, -# ß->ss) werden daraus AUTOMATISCH abgeleitet -> wenig Fehlerquelle. Erweiterbar via LUCY_UMLAUT_EXTRA. -_UML_WORDS = ( - "über überall übrigens übernehmen überzeugt überprüfen für fürs fünf fünfzehn fünfzig müssen " - "müsste müssten können könnt könnte könnten könig königin möchte möchten möchtest möglich " - "möglichst möglichkeit würde würden würdest müde prüfen prüft prüfung zurück natürlich gemütlich " - "grün grüne grüße grüßen drücken dürfen darüber gegenüber dafür wofür hierfür führen führt " - "führung fühlen gefühl gefühle tür türen glück glücklich stück stücke brücke küche kühl " - "kühlschrank früh früher frühstück frühling bücher büro bürger südlich süden schüler schützen " - "wünschen wünsche übung übungen künstler künstlich rücken rückkehr brüder lücke müll gründe " - "gründen begründung vergnügen " - "schön schöne schöner schönste schönheit möbel höher höhe hören gehört gehören größe größer " - "größte öffnen öffnet geöffnet öffentlich öl östlich löschen löffel lösung lösen börse dörfer " - "wörter wörterbuch völlig völker störung stören zwölf böse höflich öfter vögel mögen " - "ähnlich änderung ändern ärger ärgern ärztin äußern äußerst gespräch gespräche hängen länger " - "länge mädchen männer märz nächste nächsten nähe näher qualität universität städte tätigkeit " - "täglich träume träumen väter wäre wären während wärme zähne erklären erklärung verändern " - "gefährlich geschäft geschäfte jährlich käse hände kälte plätze sätze wälder fähig fähigkeit" -).split() - -def _build_umlaut_map(): - words = list(_UML_WORDS) - extra = os.environ.get("LUCY_UMLAUT_EXTRA", "") - words += [w.strip() for w in extra.replace(",", " ").split() if w.strip()] - # gängige Flexionsendungen mitnehmen -> deckt mögliche/möglichen/größeren/schönes... ab. - # Bogus-Formen (z.B. „möchtee") sind harmlos: sie tauchen in echtem Text nie auf. - endings = ("", "e", "en", "er", "es", "em", "n", "s") - m = {} - for w in words: - base = w.lower() - for suf in endings: - wl = base + suf - ascii_w = wl.replace("ä", "ae").replace("ö", "oe").replace("ü", "ue").replace("ß", "ss") - if ascii_w != wl: # nur echte Umlaut-Wörter - m.setdefault(ascii_w, wl) - return m - -_UML_MAP = _build_umlaut_map() -_UML_RX = re.compile(r"\b(" + "|".join(sorted((re.escape(k) for k in _UML_MAP), key=len, reverse=True)) - + r")\b", re.IGNORECASE) if _UML_MAP else None - -def _fix_umlauts(text: str) -> str: - """Wandelt NUR bekannte ASCII-Umlaut-Ganzwörter zurück (ueber->über), case-erhaltend.""" - if not UMLAUT_FIX or not _UML_RX: - return text - def _repl(mo): - s = mo.group(0); u = _UML_MAP[s.lower()] - return u[:1].upper() + u[1:] if s[:1].isupper() else u - return _UML_RX.sub(_repl, text) - -def _prep_ref(): - """A2: Klon-Referenz aufbereiten. pocket-tts reproduziert die Sample-Qualität mit, daher optional - Highpass (Rumpeln/Netzbrumm) + Peak-Normalisierung. Per LUCY_REF_CLEAN=0 abschaltbar (A/B per Ohr).""" - ref = os.path.join(BASE, "ref.wav") - y, _ = librosa.load(REF_MP3, sr=24000, mono=True) - y, _ = librosa.effects.trim(y, top_db=30) - if REF_CLEAN: - sos = butter(4, REF_HPF_HZ, btype="highpass", fs=24000, output="sos") - y = sosfilt(sos, y).astype(np.float32) - # nach dem Highpass nochmal randstille trimmen, dann Peak-Norm gegen zu leise/zu laute Referenz - y, _ = librosa.effects.trim(y, top_db=30) - peak = float(np.max(np.abs(y))) or 1.0 - y = (y * (0.95 / peak)).astype(np.float32) - sf.write(ref, y[: int(REF_SECONDS * 24000)], 24000) - return ref - -def _drop_tail_blip(a: np.ndarray, sr: int) -> np.ndarray: - """Entfernt das End-'taa': isolierter, sehr leiser + kurzer Schwanz-Blip (Modell-Halluzination, - intermittierend bei temp 0.9). Verifiziert: trifft Blip (rms-ratio 0.15), schont echte Kurzwörter - wie 'Fehler' (ratio 0.55). Bedingung ALLE: große Lücke + viel leiser als Sprache + kurz.""" - for _ in range(3): # bis zu 3 Blips hintereinander - iv = librosa.effects.split(a, top_db=35) - if len(iv) < 2: - break - speech_rms = float(np.median([np.sqrt(np.mean(a[s:e] ** 2)) for s, e in iv[:-1]])) - s, e = iv[-1] - last_dur = (e - s) / sr - last_rms = float(np.sqrt(np.mean(a[s:e] ** 2))) - gap = (s - iv[-2][1]) / sr - if gap > 0.35 and last_rms < 0.30 * speech_rms and last_dur < 0.35: - a = a[: iv[-2][1]] - else: - break - return a - -def _crop_lead(a: np.ndarray, sr: int) -> np.ndarray: - """Schneidet das Wegwerf-Lead-Wort weg -> echtes 1. Wort behält seinen vollen, natürlichen Onset - (pocket-tts startet sonst mid-Phonem = 'vorne abgeschnitten'). Schnitt KURZ VOR dem echten Wort - (nicht direkt hinter dem Lead), damit auch die variable, teils lange Pause nach 'Tja.' verschwindet.""" - iv = librosa.effects.split(a, top_db=35) - if len(iv) >= 2: - cut = max(iv[0][1], iv[1][0] - int(0.06 * sr)) # 60ms vor echtem Wort, aber hinter dem Lead - a = a[cut:] - return a - -def _compress_gaps(a: np.ndarray, sr: int, max_gap: float = MAX_GAP_S, top_db: int = 30) -> np.ndarray: - """Deckelt INTERNE Sprech-Pausen (Pockets Komma-Pausen ziehen gemessen bis 580ms) auf max_gap. - Findet stimmhafte Segmente, fügt sie mit gekappter Lücke wieder zusammen -> flüssiger, ohne die - Sprache selbst anzutasten (nur Stille wird gekürzt). Onset-Vorlauf + Schwanz bleiben unberührt.""" - if a.size == 0 or max_gap <= 0: - return a - iv = librosa.effects.split(a, top_db=top_db) - if len(iv) < 2: - return a - cap = int(max_gap * sr) - out = [a[: iv[0][1]]] # Kopf inkl. natürlichem Onset-Vorlauf - for k in range(1, len(iv)): - g0 = iv[k - 1][1] - keep = min(iv[k][0] - g0, cap) - if keep > 0: - out.append(a[g0 : g0 + keep]) # gekappte Pause (Wort-Ausklang bleibt erhalten) - out.append(a[iv[k][0] : iv[k][1]]) # nächstes stimmhaftes Segment - out.append(a[iv[-1][1] :]) # Schwanz (bereits getrimmt) - return np.concatenate(out) - -def cleanup(a: np.ndarray, sr: int) -> np.ndarray: - """v4 (2026-06-28): Onset-Fix + RMS-Lautstärke + Blip-Killer. - - _drop_tail_blip gegen End-'taa' - - _crop_lead entfernt Wegwerf-Lead -> voller Onset vorne (kein Abschneiden mehr) - - nur HINTEN trimmen (vorne unangetastet), RMS-Normalisierung auf TARGET_RMS (statt lautem Peak 0.95) - - 8ms-Fades + 80ms-Atempause vorne+hinten.""" - a = np.asarray(a, dtype=np.float32).reshape(-1) - if a.size == 0: return a - a = _drop_tail_blip(a, sr) - a = _crop_lead(a, sr) - # nur den Schwanz trimmen (vorderen Onset behalten) - rev, _ = librosa.effects.trim(a[::-1], top_db=TAIL_DB) - a = rev[::-1] if rev.size else a - a = _compress_gaps(a, sr) # interne Komma-Pausen deckeln (größter Glättungs-Gewinn bei langen Sätzen) - # RMS-Normalisierung auf Zielpegel (gegen 'zu laut') + Peak-Sicherheits-Clamp - rms = float(np.sqrt(np.mean(a ** 2))) or 1e-9 - a = a * (TARGET_RMS / rms) - peak = float(np.max(np.abs(a))) - if peak > 0.9: a = a * (0.9 / peak) - fi = min(int(0.008 * sr), a.size // 2) # 8ms Fade gegen Klicks - if fi > 0: - a[:fi] *= np.linspace(0.0, 1.0, fi, dtype=np.float32) - a[-fi:] *= np.linspace(1.0, 0.0, fi, dtype=np.float32) - pad = np.zeros(int(TUNE["pad_s"] * sr), dtype=np.float32) # Atempause/Anti-Klick (klein -> flüssiger Satz-Übergang) - return np.concatenate([pad, a, pad]) - -@asynccontextmanager -async def lifespan(app): - t0 = time.time() - ref = _prep_ref() # ref.wav immer erzeugen -> Worker + Fingerabdruck - need_export = FORCE_RECLONE or not os.path.exists(VOICE_ST) or \ - os.path.getmtime(VOICE_ST) < os.path.getmtime(REF_MP3) - if WORKERS >= 1: - # B2-Pool: safetensors einmalig erzeugen (kurz ein Modell), dann RAM freigeben; Worker - # laden ihre eigene Instanz aus dem Cache. Hauptprozess hält danach KEIN Modell. - log.info("Starte Worker-Pool (%d) — pocket-tts %s lsd=%d temp=%.2f nc=%s quantize=%s", - WORKERS, LANG, LSD, TEMP, NOISE_CLAMP, QUANTIZE) - if need_export: - log.info("Erzeuge Voice-Cache %s ...", os.path.basename(VOICE_ST)) - mtmp = TTSModel.load_model(language=LANG, lsd_decode_steps=LSD, temp=TEMP, - noise_clamp=NOISE_CLAMP, quantize=QUANTIZE) - try: - export_model_state(mtmp.get_state_for_audio_prompt(ref), VOICE_ST) - except Exception as e: - log.warning("Voice-Export fehlgeschlagen (Worker klonen selbst): %s", e) - sr0 = mtmp.sample_rate - del mtmp - else: - sr0 = 24000 - ref_audio, _ = librosa.load(ref, sr=sr0, mono=True) - STATE.update(sr=sr0, ref_fp=_fingerprint(ref_audio, sr0)) - pool = ProcessPoolExecutor(max_workers=WORKERS, initializer=_worker_init) - list(pool.map(_warmup, range(WORKERS))) # alle Worker vorab hochfahren - STATE["pool"] = pool - log.info("Worker-Pool bereit (%d Prozesse) in %.1fs", WORKERS, time.time() - t0) - else: - log.info("Seriell — pocket-tts %s lsd=%d temp=%.2f nc=%s quantize=%s", - LANG, LSD, TEMP, NOISE_CLAMP, QUANTIZE) - m = TTSModel.load_model(language=LANG, lsd_decode_steps=LSD, temp=TEMP, - noise_clamp=NOISE_CLAMP, quantize=QUANTIZE) - if need_export: - log.info("Klone Stimme aus Referenz -> Export %s", os.path.basename(VOICE_ST)) - vs = m.get_state_for_audio_prompt(ref) - try: - export_model_state(vs, VOICE_ST); log.info("Voice-State exportiert") - except Exception as e: - log.warning("Voice-Export fehlgeschlagen (nutze Live-Klon): %s", e) - else: - log.info("Lade gecachten Voice-State <- %s", os.path.basename(VOICE_ST)) - try: - vs = m.get_state_for_audio_prompt(VOICE_ST) - except Exception as e: - log.warning("Cache-Load fehlgeschlagen, klone neu: %s", e) - vs = m.get_state_for_audio_prompt(ref) - ref_audio, _ = librosa.load(ref, sr=m.sample_rate, mono=True) - STATE.update(m=m, vs=vs, sr=m.sample_rate, ref_fp=_fingerprint(ref_audio, m.sample_rate)) - log.info("Lucy-Stimme bereit in %.1fs (sr=%d)", time.time() - t0, m.sample_rate) - yield - pool = STATE.get("pool") - if pool is not None: - pool.shutdown(wait=False, cancel_futures=True) - STATE.clear() - -app = FastAPI(title="Lucy TTS (Pocket)", lifespan=lifespan) - -class Req(BaseModel): - text: str - -class PerfIn(BaseModel): - msg: str = "" - -class TuneIn(BaseModel): - min_len: int | None = None # Chunk-Bündelung (größer = flüssiger, langsamere TTFB später) - pad_s: float | None = None # Pause zwischen Stücken (Sekunden) - fast_first: bool | None = None # erster Satz kurz halten (schnelle TTFB) an/aus - -def _ready() -> bool: - return STATE.get("pool") is not None or "m" in STATE - -def _gen_sentences_ordered(sentences): - """Liefert je Satz fertiges float32-Audio IN REIHENFOLGE. Mit Worker-Pool laufen alle Sätze - parallel (bis WORKERS gleichzeitig), werden aber in Eingabereihenfolge ausgegeben -> niedrige - TTFB + korrekte Reihenfolge. Ohne Pool: seriell im Hauptprozess (wie bisher, unter LOCK).""" - pool = STATE.get("pool") - sr = STATE["sr"] - if pool is not None: - for fut in [pool.submit(_worker_gen, s) for s in sentences]: - yield fut.result() - else: - with LOCK: - for s in sentences: - yield cleanup(_gen_gated_core(STATE, s), sr) - -@app.get("/health") -def health(): - return {"status": "ok" if _ready() else "loading", "engine": "pocket-tts", "lang": LANG, - "sr": STATE.get("sr"), "workers": WORKERS, "device": "cpu"} - -@app.post("/perf") -def perf(body: PerfIn): - """Client-Perf-Zeilen in DIESES Terminal loggen (der Nutzer hat den TTS-Log eh offen) -> - „Lucy denkt lange"-Diagnose ohne Browser-DevTools.""" - log.info("[lucy-perf] %s", body.msg) - return {"ok": True} - -@app.get("/tune") -def tune_get(): - """Aktuelle Laufzeit-Regler. temp/lsd/nc stehen separat (Modell-Load, Neustart nötig).""" - return {**TUNE, "note": "temp/lsd/noise_clamp brauchen Neustart (Env LUCY_TEMP/LSD/NOISE_CLAMP)"} - -@app.post("/tune") -def tune_set(body: TuneIn): - """Prosodie live ändern OHNE Neustart -> nächste Äußerung nutzt die neuen Werte.""" - if body.min_len is not None: TUNE["min_len"] = max(1, int(body.min_len)) - if body.pad_s is not None: TUNE["pad_s"] = max(0.0, float(body.pad_s)) - if body.fast_first is not None: TUNE["fast_first"] = bool(body.fast_first) - log.info("[tune] %s", TUNE) - return TUNE - -@app.post("/tts") -def tts(req: Req): - if not _ready(): - return JSONResponse({"error": "loading"}, status_code=503) - t0 = time.time(); sr = STATE["sr"] - parts = list(_gen_sentences_ordered(_split_sentences(fix_acronyms(normalize_numbers(_fix_umlauts(req.text))), min_len=TUNE["min_len"]))) - a = np.concatenate(parts) if parts else np.zeros(0, np.float32) - buf = io.BytesIO(); sf.write(buf, a, sr, format="WAV", subtype="PCM_16"); buf.seek(0) - dur = a.size / sr; gen = time.time() - t0 - log.info("/tts %dZ audio=%.1fs gen=%.1fs rtf=%.2f", len(req.text), dur, gen, gen / max(dur, 0.01)) - return Response(buf.read(), media_type="audio/wav", - headers={"X-Audio-Seconds": f"{dur:.2f}", "X-Gen-Seconds": f"{gen:.2f}"}) - -def _voiced_f0(a: np.ndarray, sr: int) -> float: - """Schnelle Grundfrequenz-Schätzung auf dem längsten stimmhaften Segment (max 0.6s) via yin. - Für das Stimm-Kollaps-Gate: Klon ~220Hz, männlicher Default ~100Hz.""" - a = np.asarray(a, dtype=np.float32).reshape(-1) - iv = librosa.effects.split(a, top_db=35) - if not len(iv): - return float("nan") - s, e = max(iv, key=lambda x: x[1] - x[0]) - seg = a[s:min(e, s + int(0.6 * sr))] - if seg.size < int(0.1 * sr): - return float("nan") - fv = librosa.yin(seg, fmin=80, fmax=400, sr=sr, frame_length=1024) - return float(np.median(fv)) if fv.size else float("nan") - -def _fingerprint(a: np.ndarray, sr: int) -> np.ndarray: - """Stimm-Fingerabdruck (MFCC mean+std über stimmhafte Frames, normiert). Für den Drift-Wächter: - erkennt JEDEN Stimm-Wechsel (auch weiblich->andere weiblich, das der F0-Wächter durchließ).""" - a = np.asarray(a, dtype=np.float32).reshape(-1) - iv = librosa.effects.split(a, top_db=30) - if len(iv): - a = np.concatenate([a[s:e] for s, e in iv]) - if a.size < int(0.2 * sr): - return None - m = librosa.feature.mfcc(y=a, sr=sr, n_mfcc=20)[1:] # MFCC0 (Energie) weglassen -> amplituden-invariant - v = np.concatenate([m.mean(1), m.std(1)]) - return (v / (np.linalg.norm(v) + 1e-9)).astype(np.float32) - -def _gen_gated_core(st: dict, text: str) -> np.ndarray: - """Einen Satz erzeugen mit DOPPEL-Wächter (best-of-N): männlicher Kollaps (F0 neu generieren; am Ende den ref-ähnlichsten, - nicht-männlichen Kandidaten behalten. `st` = Zustand (STATE im Hauptprozess, _W im Worker).""" - best_a, best_score = None, -2.0 - m, vs, sr, ref_fp = st["m"], st["vs"], st["sr"], st.get("ref_fp") - for attempt in range(MAX_TRIES): - audio = m.generate_audio(vs, LEAD + text, frames_after_eos=FEOS) - a = audio.numpy() if hasattr(audio, "numpy") else np.asarray(audio) - a = np.asarray(a, dtype=np.float32).reshape(-1) - f0 = _voiced_f0(a, sr) - male = f0 == f0 and f0 < F0_FLOOR - cropped = _crop_lead(a, sr) # ohne Lead -> vergleichbar mit Referenz - # B3: FP-Drift nur bei genug stimmhafter Dauer prüfen (kurze Audios -> Fingerabdruck unzuverlässig -> Fehlalarm) - iv = librosa.effects.split(cropped, top_db=30) - voiced_s = (sum(int(e - s) for s, e in iv) / sr) if len(iv) else 0.0 - fp = _fingerprint(cropped, sr) if voiced_s >= FP_MIN_S else None - sim = float(np.dot(ref_fp, fp)) if (ref_fp is not None and fp is not None) else 1.0 - score = sim - (1.0 if male else 0.0) # männlich hart abstrafen - if score > best_score: - best_score, best_a = score, a - if not male and sim >= FP_FLOOR: # gut genug -> stop - break - log.warning("Stimm-Anomalie (F0=%.0f male=%s sim=%.3f<%.2f) -> regeneriere (try %d)", - f0, male, sim, FP_FLOOR, attempt + 1) - return best_a - -def _gen_gated(text: str) -> np.ndarray: - """Serieller Hauptprozess-Pfad (nutzt STATE). Wird auch von make_samples.py verwendet.""" - return _gen_gated_core(STATE, text) - -# --- B2: persistenter Worker-Pool (je Prozess eigene Modellinstanz + Voice-State aus A1-Cache) ----- -_W: dict = {} # Per-Prozess-Zustand des Workers - -def _worker_init(): - """Einmal pro Worker-Prozess: Torch-Threads pinnen (gegen Oversubscription), Modell laden, - Voice-State aus dem safetensors-Cache (A1) ziehen (Fallback: live klonen).""" - try: - import torch - torch.set_num_threads(int(os.environ.get("LUCY_WORKER_THREADS", "2"))) - except Exception: - pass - m = TTSModel.load_model(language=LANG, lsd_decode_steps=LSD, temp=TEMP, - noise_clamp=NOISE_CLAMP, quantize=QUANTIZE) - try: - vs = m.get_state_for_audio_prompt(VOICE_ST) - except Exception: - vs = m.get_state_for_audio_prompt(_prep_ref()) - ref_audio, _ = librosa.load(os.path.join(BASE, "ref.wav"), sr=m.sample_rate, mono=True) - _W.update(m=m, vs=vs, sr=m.sample_rate, ref_fp=_fingerprint(ref_audio, m.sample_rate)) - -def _worker_gen(text: str) -> np.ndarray: - """Im Worker: Satz mit Doppel-Wächter erzeugen + cleanup. Rückgabe = fertiges float32-PCM (picklebar).""" - return np.asarray(cleanup(_gen_gated_core(_W, text), _W["sr"]), dtype=np.float32) - -def _warmup(_): - if "m" not in _W: - _worker_init() - return _W["sr"] - -_SENT_RX = re.compile(r".+?(?:[.!?…]+(?:\s|$)|$)", re.S) - -def _split_sentences(text: str, min_len: int = 55, keep_first_short: bool = False) -> list[str]: - """Text in Sätze zerlegen und sehr kurze Teile bündeln. Für satzweise Generierung + - F0-Gate pro Satz -> ein Kollaps in der Mitte langer Antworten erreicht den Nutzer NIE. - keep_first_short=True: der ERSTE Teil bleibt eigenständig (auch wenn kurz) -> schnellste TTFB - im Stream (Lucy fängt früher an zu sprechen), Rest wird normal gebündelt.""" - parts = [m.group(0).strip() for m in _SENT_RX.finditer(text.strip())] - out: list[str] = [] - for p in parts: - if not p: - continue - if not out: - out.append(p) # erster Teil - elif keep_first_short and len(out) == 1: - out.append(p) # zweiter Teil startet frisch -> Index 0 bleibt kurz - elif len(out[-1]) < min_len: - out[-1] = f"{out[-1]} {p}" - else: - out.append(p) - return out or [text.strip()] - -def _to_pcm16(a: np.ndarray, gain: float) -> bytes: - """float -> 16-bit-PCM (LE), mit Gain + Sicherheits-Clip.""" - a = np.asarray(a, dtype=np.float32).reshape(-1) * gain - np.clip(a, -0.95, 0.95, out=a) - return (a * 32767.0).astype(" {OUT}") diff --git a/client/lucy-tts/speed_test.py b/client/lucy-tts/speed_test.py deleted file mode 100644 index 5017ace..0000000 --- a/client/lucy-tts/speed_test.py +++ /dev/null @@ -1,20 +0,0 @@ -import time -from llama_cpp import Llama - -MODEL = r"F:\Coding Stuff\mission-control-2\client\lucy-tts\models\OuteTTS-1.0-1B-Q8_0.gguf" - -t0 = time.time() -llm = Llama(model_path=MODEL, n_gpu_layers=999, n_ctx=8192, verbose=True) -print(f"[load] {time.time()-t0:.1f}s", flush=True) - -prompt = "Guten Tag, mein Name ist" -# warmup -llm(prompt, max_tokens=16, temperature=0.8) -# messen -for i in range(2): - t0 = time.time() - out = llm(prompt, max_tokens=300, temperature=0.8) - dt = time.time() - t0 - n = out["usage"]["completion_tokens"] - print(f"[run {i+1}] {n} tokens in {dt:.2f}s = {n/dt:.1f} tok/s", flush=True) -print("SPEED_DONE", flush=True) diff --git a/client/lucy-tts/stress_de.py b/client/lucy-tts/stress_de.py deleted file mode 100644 index b46c8b8..0000000 --- a/client/lucy-tts/stress_de.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: utf-8 -*- -"""Deutscher TTS-Stresstest: rendert 10 Sätze (typische DE-Fallen, alle Längen), transkribiert per -Whisper (SOLL vs IST) und misst Pausen/Prosodie. Server muss auf :8134 laufen (pocket_server /tts).""" -import os, io, json, urllib.request -import numpy as np, soundfile as sf, librosa -from faster_whisper import WhisperModel - -SERVER = "http://127.0.0.1:8134/tts" -OUT = r"C:\Users\TobisPC\Desktop\lucy_de_stress"; os.makedirs(OUT, exist_ok=True) - -TESTS = [ - ("01_kurz_umlaut", "kurz", "Schön, dass du da bist, Commander."), - ("02_kurz_zahlen", "kurz", "Es ist 21 Uhr 40, und wir haben noch 16 GB frei."), - ("03_komposita", "mittel", "Die Geschwindigkeitsbegrenzung und die Aufmerksamkeitsspanne sind heute besonders wichtig."), - ("04_ss_sch_ch", "mittel", "Ich weiß nicht, ob die Straße noch frei ist, aber ich schaue gleich mal nach."), - ("05_umlaut_haeufung", "mittel", "Über fünf Türme, größere Bäume und schöne Flüsse führt die Röhre nach Süden."), - ("06_fremdwoerter", "mittel", "Das Backup-Skript läuft im Terminal, der Router ist online und der Server antwortet sofort."), - ("07_lang_gemischt", "lang", "Guten Morgen, Commander. Das nächtliche Backup ist um 3 Uhr durchgelaufen, es gab keine Fehler, und die Datenbank läuft mit 92 Prozent Auslastung völlig stabil."), - ("08_sehr_lang", "sehr lang", "Also, Commander, wenn ich das kurz zusammenfassen darf: heute früh war die Verbindung weg, dann lief das Update durch, danach musste ich zweimal neu starten, und jetzt sind endlich alle Dienste oben, das Gedächtnis ist warm, und wir können ganz entspannt weitermachen."), - ("09_akronyme", "mittel", "Die CPU der RX 9070 XT und die GPU laufen mit ROCm, sagt der PC über das LAN."), - ("10_zungenbrecher", "kurz", "Der Frühstücksfleischklößchenlieferant frühstückt fröhlich am frühen Freitag."), -] - -def render(text): - req = urllib.request.Request(SERVER, data=json.dumps({"text": text}).encode("utf-8"), - headers={"Content-Type": "application/json"}) - return urllib.request.urlopen(req, timeout=180).read() - -w = WhisperModel("small", device="cpu", compute_type="int8") -for name, length, text in TESTS: - wav = render(text) - path = os.path.join(OUT, name + ".wav") - open(path, "wb").write(wav) - a, sr = sf.read(io.BytesIO(wav)); a = np.asarray(a, dtype=np.float32).reshape(-1); dur = len(a) / sr - segs, _ = w.transcribe(path, language="de", beam_size=5, word_timestamps=True) - words = [x for s in segs for x in (s.words or [])] - got = " ".join(x.word.strip() for x in words) - pauses = [(words[i].word.strip(), words[i + 1].start - words[i].end) - for i in range(len(words) - 1) if (words[i + 1].start - words[i].end) >= 0.25] - f0 = librosa.yin(a, fmin=80, fmax=400, sr=sr, frame_length=1024); f0v = f0[(f0 > 90) & (f0 < 380)] - med = np.median(f0v) if f0v.size else 0; rng = (np.percentile(f0v, 90) - np.percentile(f0v, 10)) if f0v.size else 0 - print(f"\n### {name} [{length}] {dur:.1f}s Tempo {len(words)/max(dur,.01):.1f}W/s F0 {med:.0f}Hz/Spanne {rng:.0f}") - print(f"SOLL: {text}") - print(f"IST : {got}") - if pauses: - print("PAUSEN: " + ", ".join(f'„{ww}"={gg*1000:.0f}ms' for ww, gg in sorted(pauses, key=lambda t: -t[1])[:6])) -print("\n=== STRESSTEST FERTIG ===") diff --git a/client/lucy-tts/sweep_b2.py b/client/lucy-tts/sweep_b2.py deleted file mode 100644 index 6bcaef0..0000000 --- a/client/lucy-tts/sweep_b2.py +++ /dev/null @@ -1,105 +0,0 @@ -# -*- coding: utf-8 -*- -"""sweep_b2.py — findet den B2-Sweet-Spot auf DIESER Maschine (Ryzen 9700X, 8C/16T). -Variiert WORKERS × THREADS-pro-Worker und misst je Konfig auf einer langen, mehrsätzigen Antwort: - - wall : Gesamt-Wall-Clock (Generierung der ganzen Antwort) - - ttfb : Time-to-first-audio (Reaktionszeit = erster Satz fertig) - - audio : erzeugte Audiolänge (variiert leicht, da temp>0 stochastisch) - - RTF : wall/audio (längen-normalisiert -> fairer Durchsatz-Vergleich; <1 = schneller als Echtzeit) -Nutzt die ECHTEN pocket_server-Funktionen (_worker_init/_warmup/_gen_sentences_ordered). -Schreibt sweep_b2_result.json + eine Tabelle und nennt am Ende den Sweet Spot. -""" -import os, time, json, statistics as st -import numpy as np, librosa -from concurrent.futures import ProcessPoolExecutor -from pocket_tts import TTSModel -import pocket_server as ps - -BASE = ps.BASE -LONG = ("Guten Morgen, Commander. " - "Das nächtliche Backup ist sauber durchgelaufen und es gab keine Fehler. " - "Der Dienst läuft stabil und die Engine antwortet zügig. " - "Ich habe die Modelle vorgewärmt und die Latenz im Blick behalten. " - "Die Protokolle zeigen keine Auffälligkeiten in den letzten Stunden. " - "Wenn du möchtest, fasse ich die offenen Punkte für heute zusammen. " - "Danach kümmere ich mich um die anstehenden Updates und melde mich wieder.") - -# (workers, threads_pro_worker). Ziel: workers*threads ~ 6–8 (8 physische Kerne). -CONFIGS = [("seriell", 0, 0), ("pool", 2, 4), ("pool", 2, 3), - ("pool", 3, 2), ("pool", 3, 3), ("pool", 4, 2)] -REPS = 3 - - -def _measure(sents): - """Eine Durchführung: (wall, ttfb, audio_s) über den aktuell in STATE gesetzten Pfad.""" - t0 = time.time(); first = None; total = 0 - for i, a in enumerate(ps._gen_sentences_ordered(sents)): - if i == 0: - first = time.time() - t0 - total += a.size - return time.time() - t0, first, total / 24000.0 - - -def run_serial(reps): - m = TTSModel.load_model(language=ps.LANG, lsd_decode_steps=ps.LSD, temp=ps.TEMP, - noise_clamp=ps.NOISE_CLAMP, quantize=ps.QUANTIZE) - ref = ps._prep_ref() - try: - vs = m.get_state_for_audio_prompt(ps.VOICE_ST) - except Exception: - vs = m.get_state_for_audio_prompt(ref) - ra, _ = librosa.load(ref, sr=m.sample_rate, mono=True) - ps.STATE.clear() - ps.STATE.update(m=m, vs=vs, sr=m.sample_rate, ref_fp=ps._fingerprint(ra, m.sample_rate)) - sents = ps._split_sentences(LONG) - rows = [_measure(sents) for _ in range(reps)] - ps.STATE.clear(); del m - return rows, len(sents) - - -def run_pool(workers, threads, reps): - os.environ["LUCY_WORKER_THREADS"] = str(threads) # vom Worker beim Spawn gelesen - pool = ProcessPoolExecutor(max_workers=workers, initializer=ps._worker_init) - list(pool.map(ps._warmup, range(workers))) - ref = ps._prep_ref(); ra, _ = librosa.load(ref, sr=24000, mono=True) - ps.STATE.clear() - ps.STATE.update(sr=24000, ref_fp=ps._fingerprint(ra, 24000), pool=pool) - sents = ps._split_sentences(LONG) - rows = [_measure(sents) for _ in range(reps)] - pool.shutdown(wait=True); ps.STATE.clear() - return rows, len(sents) - - -if __name__ == "__main__": - results = [] - print(f"Text: {len(LONG)} Zeichen, REPS={REPS}\n") - print(f"{'config':>14} | {'wall':>6} {'ttfb':>6} {'audio':>6} {'RTF':>5}") - print("-" * 48) - for kind, w, t in CONFIGS: - try: - rows, nsent = (run_serial(REPS) if kind == "seriell" else run_pool(w, t, REPS)) - except Exception as e: - print(f"{kind} w{w} t{t}: FEHLER {e}") - continue - wall = st.median([r[0] for r in rows]) - ttfb = st.median([r[1] for r in rows]) - audio = st.median([r[2] for r in rows]) - rtf = wall / max(audio, 0.01) - label = "seriell(1×all)" if kind == "seriell" else f"{w}w×{t}t" - print(f"{label:>14} | {wall:6.2f} {ttfb:6.2f} {audio:6.2f} {rtf:5.2f}") - results.append(dict(label=label, kind=kind, workers=(1 if kind == "seriell" else w), - threads=t, wall=wall, ttfb=ttfb, audio=audio, rtf=rtf, sents=nsent)) - - json.dump(results, open(os.path.join(BASE, "sweep_b2_result.json"), "w"), indent=2) - - pool_rows = [r for r in results if r["kind"] == "pool"] - if pool_rows: - best_tput = min(pool_rows, key=lambda r: r["rtf"]) - best_ttfb = min(pool_rows, key=lambda r: r["ttfb"]) - # Sweet Spot: bester Durchsatz, aber TTFB nicht >20% über dem TTFB-Sieger (Reaktion zählt) - cand = [r for r in pool_rows if r["ttfb"] <= best_ttfb["ttfb"] * 1.20] - sweet = min(cand, key=lambda r: r["rtf"]) if cand else best_tput - print("\n>> bester Durchsatz :", best_tput["label"], f"(RTF {best_tput['rtf']:.2f})") - print(">> beste Reaktion :", best_ttfb["label"], f"(TTFB {best_ttfb['ttfb']:.2f}s)") - print(">> SWEET SPOT :", sweet["label"], - f"-> LUCY_WORKERS={sweet['workers']} LUCY_WORKER_THREADS={sweet['threads']}") - print("SWEEP_DONE") diff --git a/client/lucy-tts/sweep_quality.py b/client/lucy-tts/sweep_quality.py deleted file mode 100644 index d046428..0000000 --- a/client/lucy-tts/sweep_quality.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: utf-8 -*- -"""Qualitäts-Sweep: noise_clamp (nie getestet, Hypothese: dämpft Artefakte+Kollaps) × lsd, temp 0.9. -Produktions-äquivalente Verarbeitung (LEAD + cleanup v4 wie der Server) -> faires A/B gegen lucy_final.""" -import os, time, numpy as np, soundfile as sf, librosa -from pocket_tts import TTSModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -OUT = r"C:\Users\TobisPC\Desktop\lucy_quality_sweep"; os.makedirs(OUT, exist_ok=True) -src, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) -srt, _ = librosa.effects.trim(src, top_db=30); ref = os.path.join(BASE, "ref.wav") -sf.write(ref, srt[:int(18*24000)], 24000) -LEAD, TARGET_RMS = "Tja. ", 0.09 -SENT = {"kurz":"Hallo Commander, ich höre dich.", - "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", - "lang":"Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft."} - -def crop_lead(a, sr): - iv = librosa.effects.split(a, top_db=35) - if len(iv) >= 2: - cut = max(iv[0][1], iv[1][0] - int(0.06*sr)); a = a[cut:] - return a -def cleanup(a, sr): - a = np.asarray(a, dtype=np.float32).reshape(-1) - if a.size == 0: return a - a = crop_lead(a, sr) - rev,_ = librosa.effects.trim(a[::-1], top_db=45); a = rev[::-1] if rev.size else a - rms = float(np.sqrt(np.mean(a**2))) or 1e-9; a = a*(TARGET_RMS/rms) - peak = float(np.max(np.abs(a))) - if peak > 0.9: a = a*(0.9/peak) - fi = min(int(0.008*sr), a.size//2) - if fi>0: a[:fi]*=np.linspace(0.,1.,fi,dtype=np.float32); a[-fi:]*=np.linspace(1.,0.,fi,dtype=np.float32) - pad = np.zeros(int(0.08*sr), dtype=np.float32) - return np.concatenate([pad, a, pad]) - -# (tag, lsd, noise_clamp) -COMBOS = [ - ("A_baseline_lsd6_ncNone", 6, None), - ("B_lsd6_nc2", 6, 2.0), - ("C_lsd6_nc3", 6, 3.0), - ("D_lsd10_nc3", 10, 3.0), -] -for tag, lsd, nc in COMBOS: - t0 = time.time() - m = TTSModel.load_model(language="german_24l", lsd_decode_steps=lsd, temp=0.9, noise_clamp=nc) - vs = m.get_state_for_audio_prompt(ref); sr = m.sample_rate - print(f"== {tag} (load {time.time()-t0:.1f}s) ==", flush=True) - for name, text in SENT.items(): - t0 = time.time(); a = m.generate_audio(vs, LEAD+text, frames_after_eos=4); dt = time.time()-t0 - a = a.numpy() if hasattr(a,"numpy") else np.asarray(a) - a = cleanup(a, sr); secs = a.size/sr - sf.write(os.path.join(OUT, f"{tag}_{name}.wav"), a, sr) - print(f" [{name:6}] gen={dt:4.1f}s audio={secs:4.1f}s RTF={dt/max(secs,0.01):.2f}", flush=True) -print("SWEEP_DONE", flush=True) diff --git a/client/lucy-tts/sweep_quality2.py b/client/lucy-tts/sweep_quality2.py deleted file mode 100644 index f757a61..0000000 --- a/client/lucy-tts/sweep_quality2.py +++ /dev/null @@ -1,45 +0,0 @@ -# -*- coding: utf-8 -*- -"""Sweep 2 (Feinschliff): lsd 10 (glättet Rauschen) × noise_clamp 2/2.5/3, temp 0.9. -Ziel: sauberes 'Commander' (nicht erzwungen, = niedrigeres nc) + wenig Rauschen (= höheres lsd).""" -import os, time, numpy as np, soundfile as sf, librosa -from pocket_tts import TTSModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -OUT = r"C:\Users\TobisPC\Desktop\lucy_sweep2"; os.makedirs(OUT, exist_ok=True) -src, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) -srt, _ = librosa.effects.trim(src, top_db=30); ref = os.path.join(BASE, "ref.wav") -sf.write(ref, srt[:int(18*24000)], 24000) -LEAD, TARGET_RMS = "Tja. ", 0.09 -SENT = {"kurz":"Hallo Commander, ich höre dich.", - "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", - "lang":"Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft."} - -def crop_lead(a, sr): - iv = librosa.effects.split(a, top_db=35) - if len(iv) >= 2: a = a[max(iv[0][1], iv[1][0]-int(0.06*sr)):] - return a -def cleanup(a, sr): - a = np.asarray(a, dtype=np.float32).reshape(-1) - if a.size == 0: return a - a = crop_lead(a, sr) - rev,_ = librosa.effects.trim(a[::-1], top_db=45); a = rev[::-1] if rev.size else a - rms = float(np.sqrt(np.mean(a**2))) or 1e-9; a = a*(TARGET_RMS/rms) - peak = float(np.max(np.abs(a))) - if peak > 0.9: a = a*(0.9/peak) - fi = min(int(0.008*sr), a.size//2) - if fi>0: a[:fi]*=np.linspace(0.,1.,fi,dtype=np.float32); a[-fi:]*=np.linspace(1.,0.,fi,dtype=np.float32) - return np.concatenate([np.zeros(int(0.08*sr),dtype=np.float32), a, np.zeros(int(0.08*sr),dtype=np.float32)]) - -for nc in [2.0, 2.5, 3.0]: - tag = f"lsd10_nc{str(nc).replace('.','p')}" - t0 = time.time() - m = TTSModel.load_model(language="german_24l", lsd_decode_steps=10, temp=0.9, noise_clamp=nc) - vs = m.get_state_for_audio_prompt(ref); sr = m.sample_rate - print(f"== {tag} (load {time.time()-t0:.1f}s) ==", flush=True) - for name, text in SENT.items(): - t0 = time.time(); a = m.generate_audio(vs, LEAD+text, frames_after_eos=4); dt = time.time()-t0 - a = a.numpy() if hasattr(a,"numpy") else np.asarray(a) - a = cleanup(a, sr); secs = a.size/sr - sf.write(os.path.join(OUT, f"{tag}_{name}.wav"), a, sr) - print(f" [{name:6}] gen={dt:4.1f}s audio={secs:4.1f}s RTF={dt/max(secs,0.01):.2f}", flush=True) -print("SWEEP2_DONE", flush=True) diff --git a/client/lucy-tts/test_text_norm.py b/client/lucy-tts/test_text_norm.py deleted file mode 100644 index 9db52f6..0000000 --- a/client/lucy-tts/test_text_norm.py +++ /dev/null @@ -1,28 +0,0 @@ -"""Prüft normalize_numbers: Einheiten/Uhrzeiten/Dezimalzahlen verbalisieren, Modellnummern schützen.""" -from text_norm import normalize_numbers as N - -def check(name, text, must_have=(), must_not=()): - out = N(text) - ok = all(h in out for h in must_have) and all(x not in out for x in must_not) - print(f"{'PASS' if ok else 'FAIL'} {name}: \"{text}\" -> \"{out}\"") - return ok - -allok = True -allok &= check("Uhrzeit", "Es ist 18:01 Uhr.", must_have=["achtzehn Uhr", "eins"], must_not=[":", "18:"]) -allok &= check("Uhrzeit :00", "Um 18:00.", must_have=["achtzehn Uhr"], must_not=[":"]) -allok &= check("Uhrzeit HH:MM", "Treffen um 9:30 Uhr.", must_have=["neun Uhr", "dreißig"], must_not=[":"]) -allok &= check("Einheit GB verbalisiert", "Sie hat 16 GB Speicher.", must_have=["sechzehn GB"], must_not=[" 16 "]) -allok &= check("Einheit TB + GB", "8 TB und 32 GB RAM.", must_have=["acht TB", "zweiunddreißig GB", "RAM"]) -allok &= check("Dezimal verbalisiert", "Läuft mit 4.5 GHz.", must_have=["vier Komma", "fünf", "GHz"], must_not=["4.5"]) -allok &= check("Modellnummer geschützt", "Die RX 9070 XT ist schnell.", must_have=["9070", "XT"], must_not=["neuntausend"]) -allok &= check("Version geschützt", "Qwen3.6 nutzt Version 2.", must_have=["Qwen3.6", "zwei"], must_not=["Qwen3.sechs"]) -allok &= check("Modell H100 geschützt", "Das braucht eine H100.", must_have=["H100"]) -allok &= check("Zahl im Text", "Ich habe 5 Äpfel.", must_have=["fünf", "Äpfel"], must_not=[" 5 "]) -allok &= check("Prozent", "Das sind 50 Prozent.", must_have=["fünfzig Prozent"]) -allok &= check("Grad", "Es sind 25 Grad.", must_have=["fünfundzwanzig Grad"]) -allok &= check("Jahr", "Im Jahr 2026.", must_have=["zweitausend"], must_not=["2026"]) -allok &= check("Datum-Ordinal", "Am 3. Januar.", must_have=["Januar"], must_not=["3. Januar", " 3 "]) -allok &= check("große ID roh", "Fehler 123456.", must_have=["123456"]) - -print("\nALLE TESTS GRÜN" if allok else "\nES GAB FEHLER") -raise SystemExit(0 if allok else 1) diff --git a/client/lucy-tts/text_norm.py b/client/lucy-tts/text_norm.py deleted file mode 100644 index 6795630..0000000 --- a/client/lucy-tts/text_norm.py +++ /dev/null @@ -1,120 +0,0 @@ -"""Deutsche Zahlen-/Uhrzeit-Normalisierung für Lucys Stimme (num2words). - -Eigenständig (nur re + num2words, KEIN torch/pocket_tts-Import), damit schnell testbar und von -pocket_server importierbar. - -Kernidee: Zahlen im Fließtext verbalisieren ("18:01" -> "achtzehn Uhr eins", "16 GB" -> "sechzehn -GB", "4.5" -> "vier Komma fünf"), aber Modell-/Versionsnummern SCHÜTZEN ("RX 9070 XT", "Qwen3.6", -"H100" bleiben roh — die soll man nicht als Kardinalzahl lesen). Abschaltbar via LUCY_NUM_NORM=0. -""" -import os -import re - -try: - from num2words import num2words as _n2w -except Exception: # Lib fehlt -> No-op (Stimme läuft trotzdem) - _n2w = None - -# AUS per Default (2026-07-01, empirisch via Whisper-Rücktranskription verifiziert): Pocket german_24l -# spricht ROHE Ziffern ("21 Uhr 40", "16 GB", "4.5 GHz", "9:30") sauber. Vorverbalisierte deutsche -# Kompositzahlen ("einundzwanzig") ZERBRICHT das Modell zu Kauderwelsch ("ein Mund", "ein Aus-20"). -# Also NICHT verbalisieren. Mit LUCY_NUM_NORM=1 wieder anschaltbar (falls je ein Modell es braucht). -NUM_NORM = os.environ.get("LUCY_NUM_NORM", "0") not in ("0", "false", "False") - -_MONTHS = "Januar Februar März April Mai Juni Juli August September Oktober November Dezember".split() -_MONTH_RX = "|".join(_MONTHS) -# FULLY-uppercase 2+-Einheiten, neben denen Zahlen VERBALISIERT werden (sechzehn GB) — im Gegensatz -# zu Modell-Akronymen (RX/XT/RTX), wo die Ziffern roh bleiben (RX 9070 XT). Gemischt-Case-Einheiten -# (GHz/MHz/kg/km/Grad/Prozent) werden von der Akronym-Regel eh nicht erfasst -> dort wird ohnehin verbalisiert. -_CAPS_UNITS = {"GB", "TB", "MB", "KB", "PB", "EB", "KW", "MW"} - - -# Garble-Kandidaten (Whisper-verifiziert): Pocket german_24l kann diese Akronyme/Codes NICHT sauber -# sprechen ("ROCm"->"AOC HM", "UTC"->Kauderwelsch) -> Ersatz durch gesprochene/buchstabierte Form. -# Erweiterbar via LUCY_ACRONYM_EXTRA="ABC=A B C,XYZ=..." (neue Fälle findet transcribe.py). -_ACRONYM_FIX = { - "ROCm": "Rockem", "UTC": "U T C", "GMT": "G M T", - "CEST": "C E S T", "CET": "C E T", "MESZ": "M E S Z", "MEZ": "M E Z", - "NVMe": "N V M E", "PCIe": "P C I E", -} - -def _build_acr(): - m = dict(_ACRONYM_FIX) - for pair in os.environ.get("LUCY_ACRONYM_EXTRA", "").split(","): - if "=" in pair: - k, v = pair.split("=", 1) - if k.strip(): - m[k.strip()] = v.strip() - return m - -_ACR_MAP = _build_acr() -_ACR_RX = re.compile(r"\b(" + "|".join(re.escape(k) for k in sorted(_ACR_MAP, key=len, reverse=True)) + r")\b") if _ACR_MAP else None - -ACR_ON = os.environ.get("LUCY_ACRONYM", "1") not in ("0", "false", "False") # A/B-Abschaltung - -def fix_acronyms(text: str) -> str: - """Garble-anfällige Akronyme durch gesprochene Form ersetzen (ROCm -> Rockem, UTC -> U T C).""" - return _ACR_RX.sub(lambda m: _ACR_MAP[m.group(0)], text) if (_ACR_RX and ACR_ON) else text - - -def _card(v) -> str: - try: - return _n2w(int(v), lang="de") - except Exception: - return str(v) - - -def normalize_numbers(text: str) -> str: - if not NUM_NORM or _n2w is None: - return text - - masks: list[str] = [] - def _mask(s: str) -> str: - masks.append(s) - return f"\x00{len(masks) - 1}\x00" - - # 1) Uhrzeiten: "18:01 Uhr"/"18:01" -> "18 Uhr 01", "18:00" -> "18 Uhr" (Ziffern verbalisiert Schritt 6) - text = re.sub(r"\b(\d{1,2}):00(\s*Uhr)?\b", r"\1 Uhr", text) - text = re.sub(r"\b(\d{1,2}):(\d{2})\s*Uhr\b", r"\1 Uhr \2", text) - text = re.sub(r"\b(\d{1,2}):(\d{2})\b", r"\1 Uhr \2", text) - - # 2) Datums-Ordinalzahlen: "3. Januar" -> "dritter Januar" - def _ord(m): - try: - return f"{_n2w(int(m.group(1)), to='ordinal', lang='de')} {m.group(2)}" - except Exception: - return m.group(0) - text = re.sub(rf"\b(\d{{1,2}})\.\s+({_MONTH_RX})\b", _ord, text) - - # 3) Modell-/Versions-Token (Buchstabe UND Ziffer, evtl. mit Punkten: Qwen3.6, H100, v2.1, RTX4090) - # -> ganzes Token maskieren (nie verbalisieren). Satz-Endpunkt/-Komma bleibt draußen. - def _mask_model(m): - tok = m.group(0); trail = "" - while tok and tok[-1] in ".,": - trail = tok[-1] + trail; tok = tok[:-1] - if re.search(r"[A-Za-zÄÖÜäöü]", tok) and re.search(r"\d", tok): - return _mask(tok) + trail - return m.group(0) - text = re.sub(r"[A-Za-zÄÖÜäöü0-9]+(?:[.,][A-Za-zÄÖÜäöü0-9]+)*", _mask_model, text) - - # 4) Standalone-Dezimalzahl (nur Ziffern, kein Buchstabe): "4.5" -> "vier Komma fünf" - # (Nachkommastellen ziffernweise, wie im Deutschen üblich). - def _dec(m): - return f"{_card(m.group(1))} Komma {' '.join(_card(d) for d in m.group(2))}" - text = re.sub(r"(? verbalisieren; Modell-Akronym (RX/XT) -> roh maskieren. - def _by_ctx(num, acr): - return num if acr.upper() in _CAPS_UNITS else _mask(num) - text = re.sub(r"\b([A-ZÄÖÜ]{2,})\s+(\d{1,6})\b", lambda m: f"{m.group(1)} {_by_ctx(m.group(2), m.group(1))}", text) - text = re.sub(r"\b(\d{1,6})\s+([A-ZÄÖÜ]{2,})\b", lambda m: f"{_by_ctx(m.group(1), m.group(2))} {m.group(2)}", text) - - # 6) verbleibende reine Ganzzahlen (0..9999) verbalisieren; größere roh lassen (IDs/Codes) - def _c(m): - v = int(m.group(0)) - return _n2w(v, lang="de") if v <= 9999 else m.group(0) - text = re.sub(r"(? 1 else r"C:\Users\TobisPC\Desktop\lucy_pocket_tune" -w = WhisperModel("small", device="cpu", compute_type="int8") -for p in sorted(glob.glob(os.path.join(DIR, "*.wav"))): - a, sr = sf.read(p) - seg, _ = w.transcribe(p, language="de", beam_size=5) - txt = " ".join(s.text for s in seg).strip() - print(f"[{os.path.basename(p)}] ({len(a)/sr:.1f}s)") - print(f" HÖRT WHISPER: {txt}\n") diff --git a/client/lucy-tts/ttfb_test.py b/client/lucy-tts/ttfb_test.py deleted file mode 100644 index ff2910d..0000000 --- a/client/lucy-tts/ttfb_test.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- -"""ttfb_test.py — misst die Stream-TTFB im SERIELLEN Pfad mit kurzem erstem Chunk an/aus. -Ein Modell-Load, dann je Modus 3 Durchläufe -> Median. Belegt, ob keep_first_short Lucys -Sprechbeginn beschleunigt, ohne den Rest zu verschlechtern. -""" -import time, statistics as st -import numpy as np, librosa -from pocket_tts import TTSModel -import pocket_server as ps - -LONG = ("Guten Morgen, Commander. " - "Das nächtliche Backup ist sauber durchgelaufen und es gab keine Fehler. " - "Der Dienst läuft stabil und die Engine antwortet zügig. " - "Ich habe die Modelle vorgewärmt und die Latenz im Blick behalten. " - "Die Protokolle zeigen keine Auffälligkeiten in den letzten Stunden. " - "Wenn du möchtest, fasse ich die offenen Punkte für heute zusammen. " - "Danach kümmere ich mich um die anstehenden Updates und melde mich wieder.") - -m = TTSModel.load_model(language=ps.LANG, lsd_decode_steps=ps.LSD, temp=ps.TEMP, - noise_clamp=ps.NOISE_CLAMP, quantize=ps.QUANTIZE) -ref = ps._prep_ref() -try: - vs = m.get_state_for_audio_prompt(ps.VOICE_ST) -except Exception: - vs = m.get_state_for_audio_prompt(ref) -ra, _ = librosa.load(ref, sr=m.sample_rate, mono=True) -ps.STATE.clear() -ps.STATE.update(m=m, vs=vs, sr=m.sample_rate, ref_fp=ps._fingerprint(ra, m.sample_rate)) - - -def measure(keep_first): - sents = ps._split_sentences(LONG, keep_first_short=keep_first) - t0 = time.time(); first = None; total = 0 - for i, a in enumerate(ps._gen_sentences_ordered(sents)): - if i == 0: - first = time.time() - t0 - total += a.size - return first, time.time() - t0, total / 24000.0, len(sents), sents[0] - - -if __name__ == "__main__": - for keep in (False, True): - ttfbs, walls = [], [] - n = s0 = None - for _ in range(3): - f, w, au, n, s0 = measure(keep) - ttfbs.append(f); walls.append(w) - print(f"keep_first_short={str(keep):5} | TTFB={st.median(ttfbs):4.2f}s wall={st.median(walls):5.2f}s " - f"chunks={n} erster='{s0[:38]}'") - print("TTFB_DONE") diff --git a/client/lucy-tts/tune_front_loud.py b/client/lucy-tts/tune_front_loud.py deleted file mode 100644 index 0f5f92b..0000000 --- a/client/lucy-tts/tune_front_loud.py +++ /dev/null @@ -1,79 +0,0 @@ -# -*- coding: utf-8 -*- -"""Fix: (1) 'vorne abgeschnitten' = Modell startet mid-Phonem -> Lead-Wort voranstellen, -in flow generieren, dann in der STILLE-LÜCKE davor schneiden (voller Onset bleibt). -(2) 'zu laut' = RMS-Normalisierung auf Zielpegel statt Peak 0.95.""" -import os, numpy as np, soundfile as sf, librosa -from pocket_tts import TTSModel -from faster_whisper import WhisperModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -OUT = r"C:\Users\TobisPC\Desktop\lucy_front_loud"; os.makedirs(OUT, exist_ok=True) -src, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) -srt, _ = librosa.effects.trim(src, top_db=30); ref = os.path.join(BASE, "ref.wav") -sf.write(ref, srt[:int(18*24000)], 24000) - -SENT = { - "kurz": "Hallo Commander, ich höre dich.", - "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", -} -LEAD = "Tja. " # Wegwerf-Lead -> erzeugt natürlichen Onset fürs echte erste Wort - -def drop_tail_blip(a, sr): - for _ in range(3): - iv = librosa.effects.split(a, top_db=35) - if len(iv) < 2: break - srms = float(np.median([np.sqrt(np.mean(a[s:e]**2)) for s,e in iv[:-1]])) - s,e = iv[-1]; dur=(e-s)/sr; rms=float(np.sqrt(np.mean(a[s:e]**2))); gap=(s-iv[-2][1])/sr - if gap>0.35 and rms<0.30*srms and dur<0.35: a = a[:iv[-2][1]] - else: break - return a - -def crop_lead(a, sr): - """Schneide in der Lücke NACH dem Lead-Wort -> echtes 1. Wort voll erhalten.""" - iv = librosa.effects.split(a, top_db=35) - if len(iv) >= 2: - # Ende des 1. (Lead-)Segments + kleiner Sicherheitsabstand in die Lücke - cut = iv[0][1] + int(0.03*sr) - nxt = iv[1][0] - cut = min(cut, max(iv[0][1], nxt - int(0.04*sr))) # mind. 40ms Stille vor echtem Wort lassen - a = a[cut:] - return a - -def finalize(a, sr, target_rms, peak_cap=0.9, front_trim=False): - a = np.asarray(a, dtype=np.float32).reshape(-1) - if front_trim: - yt,_ = librosa.effects.trim(a, top_db=45); a = yt if yt.size else a - else: - # nur HINTEN trimmen (vorne unangetastet lassen) - rev,_ = librosa.effects.trim(a[::-1], top_db=45); a = rev[::-1] if rev.size else a - # RMS-Normalisierung auf Zielpegel - rms = float(np.sqrt(np.mean(a**2))) or 1e-9 - a = a * (target_rms / rms) - peak = float(np.max(np.abs(a))) - if peak > peak_cap: a = a * (peak_cap / peak) # Sicherheits-Clamp - fi = min(int(0.008*sr), a.size//2) - if fi>0: - a[:fi]*=np.linspace(0.,1.,fi,dtype=np.float32); a[-fi:]*=np.linspace(1.,0.,fi,dtype=np.float32) - pad = np.zeros(int(0.08*sr), dtype=np.float32) - return np.concatenate([pad, a, pad]) - -m = TTSModel.load_model(language="german_24l", lsd_decode_steps=6, temp=0.9) -vs = m.get_state_for_audio_prompt(ref); sr = m.sample_rate -w = WhisperModel("small", device="cpu", compute_type="int8") - -for name, text in SENT.items(): - # Onset-Fix-Roh: mit Lead generieren, Tail-Blip weg, Lead wegschneiden - raw = m.generate_audio(vs, LEAD + text, frames_after_eos=4) - raw = raw.numpy() if hasattr(raw,"numpy") else np.asarray(raw) - raw = np.asarray(raw, dtype=np.float32).reshape(-1) - raw = drop_tail_blip(raw, sr) - cropped = crop_lead(raw, sr) - for tr in [0.12, 0.09, 0.06]: - out = finalize(cropped, sr, tr, front_trim=False) - sf.write(os.path.join(OUT, f"{name}_onset_rms{int(tr*100):02d}.wav"), out, sr) - # Whisper-Check: Output darf NICHT mit Lead beginnen - sf.write(os.path.join(OUT, f"_chk_{name}.wav"), finalize(cropped, sr, 0.09), sr) - seg,_ = w.transcribe(os.path.join(OUT, f"_chk_{name}.wav"), language="de", beam_size=5) - txt = " ".join(s.text for s in seg).strip() - print(f"[{name}] Whisper-Start: {txt[:55]!r}", flush=True) -print("FRONT_LOUD_DONE", flush=True) diff --git a/client/lucy-tts/tune_lsd.py b/client/lucy-tts/tune_lsd.py deleted file mode 100644 index 0307ce7..0000000 --- a/client/lucy-tts/tune_lsd.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -import os, time, glob, numpy as np, soundfile as sf, librosa -from pocket_tts import TTSModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -OUT = os.path.join(BASE, "out_tune"); os.makedirs(OUT, exist_ok=True) -y, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) -yt, _ = librosa.effects.trim(y, top_db=30); ref = os.path.join(BASE, "ref.wav") -sf.write(ref, yt[:int(18*24000)], 24000) - -SENT = { - "kurz": "Hallo Commander, ich höre dich.", - "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", - "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", -} -def light_trim(a, sr): - a = np.asarray(a, dtype=np.float32).reshape(-1) - yt, _ = librosa.effects.trim(a, top_db=30) - return yt if yt.size else a - -for lsd in [2, 4, 8]: - t0 = time.time() - m = TTSModel.load_model(language="german_24l", lsd_decode_steps=lsd) - vs = m.get_state_for_audio_prompt(ref) - print(f"== lsd={lsd} (load {time.time()-t0:.1f}s) ==", flush=True) - for name, text in SENT.items(): - t0 = time.time(); audio = m.generate_audio(vs, text); dt = time.time()-t0 - a = audio.numpy() if hasattr(audio, "numpy") else np.asarray(audio) - a = light_trim(a, m.sample_rate) - secs = a.size / m.sample_rate - sf.write(os.path.join(OUT, f"lsd{lsd}_{name}.wav"), a, m.sample_rate) - print(f" [{name:6}] gen={dt:5.2f}s audio={secs:5.2f}s RTF={dt/max(secs,0.01):.2f}", flush=True) -print("TUNE_DONE", flush=True) diff --git a/client/lucy-tts/tune_lsd_v2.py b/client/lucy-tts/tune_lsd_v2.py deleted file mode 100644 index 7538954..0000000 --- a/client/lucy-tts/tune_lsd_v2.py +++ /dev/null @@ -1,56 +0,0 @@ -# -*- coding: utf-8 -*- -"""Sweep v2: lsd 4/5/6 + FIX gegen Vorne/Hinten-Abschneiden & Clipping. -- peak-normalize auf 0.95 (killt PCM-16-Clipping/Distortion; roh war peak bis 1.56) -- KEIN aggressiver Front-Trim mehr (Modell startet bei 0ms Stille -> Trim fraß 1. Phonem) -- nur tiefe Stille sanft trimmen (top_db=45), dann feste 90ms-Pause vorne+hinten (Atem) -- frames_after_eos=4 (kurze Sätze bekamen sonst 0ms Schwanz = abgeschnitten) -""" -import os, time, numpy as np, soundfile as sf, librosa -from pocket_tts import TTSModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -OUT = r"C:\Users\TobisPC\Desktop\lucy_lsd_v2"; os.makedirs(OUT, exist_ok=True) -y, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) -yt, _ = librosa.effects.trim(y, top_db=30); ref = os.path.join(BASE, "ref.wav") -sf.write(ref, yt[:int(18*24000)], 24000) - -SENT = { - "kurz": "Hallo Commander, ich höre dich.", - "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", - "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", -} - -def cleanup_v2(a, sr): - a = np.asarray(a, dtype=np.float32).reshape(-1) - if a.size == 0: return a - # 1) Peak-Normalisierung gegen Clipping/Distortion - peak = float(np.max(np.abs(a))) - if peak > 0: a = a * (0.95 / peak) - # 2) nur TIEFE Stille sanft wegtrimmen (top_db=45 = wenig aggressiv, lässt weiche Onsets) - yt, _ = librosa.effects.trim(a, top_db=45) - a = yt if yt.size else a - # 3) kurze 10ms-Fades an den echten Audiokanten (gegen Klicks) - fi = min(int(0.01 * sr), a.size // 2) - if fi > 0: - a[:fi] *= np.linspace(0.0, 1.0, fi, dtype=np.float32) - a[-fi:] *= np.linspace(1.0, 0.0, fi, dtype=np.float32) - # 4) feste 90ms Atem-Pause vorne+hinten (kein abruptes Einsetzen/Abschneiden) - pad = np.zeros(int(0.09 * sr), dtype=np.float32) - return np.concatenate([pad, a, pad]) - -for lsd in [4, 5, 6]: - t0 = time.time() - m = TTSModel.load_model(language="german_24l", lsd_decode_steps=lsd) - vs = m.get_state_for_audio_prompt(ref) - sr = m.sample_rate - print(f"== lsd={lsd} (load {time.time()-t0:.1f}s) ==", flush=True) - for name, text in SENT.items(): - t0 = time.time() - audio = m.generate_audio(vs, text, frames_after_eos=4) - dt = time.time() - t0 - a = audio.numpy() if hasattr(audio, "numpy") else np.asarray(audio) - a = cleanup_v2(a, sr) - secs = a.size / sr - sf.write(os.path.join(OUT, f"lsd{lsd}_{name}.wav"), a, sr) - print(f" [{name:6}] gen={dt:5.2f}s audio={secs:5.2f}s RTF={dt/max(secs,0.01):.2f} peak={np.abs(a).max():.3f}", flush=True) -print("TUNE_V2_DONE", flush=True) diff --git a/client/lucy-tts/tune_natural.py b/client/lucy-tts/tune_natural.py deleted file mode 100644 index b3b5c39..0000000 --- a/client/lucy-tts/tune_natural.py +++ /dev/null @@ -1,61 +0,0 @@ -# -*- coding: utf-8 -*- -"""Naturalness-Sweep gegen 'Roboter/abgehackt': temperature, lsd hoch, + 2 Referenz-Fenster. -Wörter sind laut Whisper alle da -> Problem ist Prosodie/Timbre, nicht Content.""" -import os, time, numpy as np, soundfile as sf, librosa -from pocket_tts import TTSModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -OUT = r"C:\Users\TobisPC\Desktop\lucy_natural"; os.makedirs(OUT, exist_ok=True) - -# Zwei Referenz-Fenster aus der EL-Saber-MP3 -src, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) -srt, _ = librosa.effects.trim(src, top_db=30) -ref18 = os.path.join(BASE, "ref.wav") # aktuell: erste 18s -sf.write(ref18, srt[:int(18*24000)], 24000) -refC = os.path.join(BASE, "ref_C.wav") # XTTS-Liebling: Sek 18..27 (9s) -segC = src[int(18*24000):int(27*24000)] -segCt, _ = librosa.effects.trim(segC, top_db=30) -sf.write(refC, segCt, 24000) - -SENT = { - "kurz": "Hallo Commander, ich höre dich.", - "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", -} - -def cleanup_v2(a, sr): - a = np.asarray(a, dtype=np.float32).reshape(-1) - if a.size == 0: return a - peak = float(np.max(np.abs(a))) - if peak > 0: a = a * (0.95 / peak) - yt, _ = librosa.effects.trim(a, top_db=45); a = yt if yt.size else a - fi = min(int(0.01*sr), a.size//2) - if fi > 0: - a[:fi] *= np.linspace(0.,1.,fi,dtype=np.float32) - a[-fi:] *= np.linspace(1.,0.,fi,dtype=np.float32) - pad = np.zeros(int(0.09*sr), dtype=np.float32) - return np.concatenate([pad, a, pad]) - -# (tag, lsd, temp, ref) -COMBOS = [ - ("A_lsd6_t070_ref18", 6, 0.70, ref18), - ("B_lsd6_t090_ref18", 6, 0.90, ref18), - ("C_lsd6_t105_ref18", 6, 1.05, ref18), - ("D_lsd8_t090_ref18", 8, 0.90, ref18), - ("E_lsd12_t090_ref18",12, 0.90, ref18), - ("F_lsd6_t090_refC", 6, 0.90, refC), -] - -for tag, lsd, temp, ref in COMBOS: - t0 = time.time() - m = TTSModel.load_model(language="german_24l", lsd_decode_steps=lsd, temp=temp) - vs = m.get_state_for_audio_prompt(ref) - sr = m.sample_rate - print(f"== {tag} (load {time.time()-t0:.1f}s) ==", flush=True) - for name, text in SENT.items(): - t0 = time.time() - audio = m.generate_audio(vs, text, frames_after_eos=4); dt = time.time()-t0 - a = audio.numpy() if hasattr(audio,"numpy") else np.asarray(audio) - a = cleanup_v2(a, sr); secs = a.size/sr - sf.write(os.path.join(OUT, f"{tag}_{name}.wav"), a, sr) - print(f" [{name:6}] gen={dt:5.2f}s audio={secs:5.2f}s RTF={dt/max(secs,0.01):.2f}", flush=True) -print("NATURAL_DONE", flush=True) diff --git a/client/lucy-tts/tune_tailfix.py b/client/lucy-tts/tune_tailfix.py deleted file mode 100644 index 62f8a3e..0000000 --- a/client/lucy-tts/tune_tailfix.py +++ /dev/null @@ -1,63 +0,0 @@ -# -*- coding: utf-8 -*- -"""Tail-Blip-Killer gegen das End-'taa' (isolierter, leiser Hall nach großer Lücke). -Verifiziert auf kurz/mittel/lang @ lsd6/t0.9: Blip weg, echte Endungen unangetastet.""" -import os, numpy as np, soundfile as sf, librosa -from pocket_tts import TTSModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -OUT = r"C:\Users\TobisPC\Desktop\lucy_tailfix"; os.makedirs(OUT, exist_ok=True) -src, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) -srt, _ = librosa.effects.trim(src, top_db=30); ref = os.path.join(BASE, "ref.wav") -sf.write(ref, srt[:int(18*24000)], 24000) - -SENT = { - "kurz": "Hallo Commander, ich höre dich.", - "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", - "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", -} - -def drop_tail_blip(a, sr): - """Entferne isolierten, leisen/kurzen Schwanz-Blip (Modell-Halluzination).""" - for _ in range(3): # bis zu 3 Blips hintereinander - iv = librosa.effects.split(a, top_db=35) - if len(iv) < 2: - break - speech_rms = float(np.median([np.sqrt(np.mean(a[s:e]**2)) for s, e in iv[:-1]])) - s, e = iv[-1] - last_dur = (e - s) / sr - last_rms = float(np.sqrt(np.mean(a[s:e]**2))) - gap = (s - iv[-2][1]) / sr - # isoliert (große Lücke) UND (kurz ODER deutlich leiser als Sprache) -> Halluzination - if gap > 0.30 and (last_dur < 0.30 or last_rms < 0.45 * speech_rms): - a = a[: iv[-2][1]] - else: - break - return a - -def cleanup_v3(a, sr): - a = np.asarray(a, dtype=np.float32).reshape(-1) - if a.size == 0: return a - a = drop_tail_blip(a, sr) # NEU: End-'taa' weg - peak = float(np.max(np.abs(a))) - if peak > 0: a = a * (0.95 / peak) - yt, _ = librosa.effects.trim(a, top_db=45); a = yt if yt.size else a - fi = min(int(0.01*sr), a.size//2) - if fi > 0: - a[:fi] *= np.linspace(0.,1.,fi,dtype=np.float32); a[-fi:] *= np.linspace(1.,0.,fi,dtype=np.float32) - pad = np.zeros(int(0.09*sr), dtype=np.float32) - return np.concatenate([pad, a, pad]) - -m = TTSModel.load_model(language="german_24l", lsd_decode_steps=6, temp=0.9) -vs = m.get_state_for_audio_prompt(ref); sr = m.sample_rate -for name, text in SENT.items(): - raw = m.generate_audio(vs, text, frames_after_eos=4) - raw = raw.numpy() if hasattr(raw,"numpy") else np.asarray(raw) - raw = np.asarray(raw, dtype=np.float32).reshape(-1) - fixed = cleanup_v3(raw, sr) - sf.write(os.path.join(OUT, f"t090_{name}.wav"), fixed, sr) - # Verifikations-Log: letzte Segmente vorher/nachher - iv0 = librosa.effects.split(raw, top_db=35) - print(f"[{name:6}] raw_dur={raw.size/sr:.2f}s -> fixed_dur={fixed.size/sr:.2f}s raw_segmente={len(iv0)}", flush=True) - if len(iv0): - s,e = iv0[-1]; print(f" raw letztes Segment: {s/sr:.2f}..{e/sr:.2f}s rms={np.sqrt(np.mean(raw[s:e]**2)):.3f}", flush=True) -print("TAILFIX_DONE", flush=True) diff --git a/client/lucy-tts/tune_temp_final.py b/client/lucy-tts/tune_temp_final.py deleted file mode 100644 index 0adf580..0000000 --- a/client/lucy-tts/tune_temp_final.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -"""Letzter Schliff: lsd6 + ref18, temp 0.70 vs 0.90 auf ALLEN Längen (inkl. lang).""" -import os, time, numpy as np, soundfile as sf, librosa -from pocket_tts import TTSModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -OUT = r"C:\Users\TobisPC\Desktop\lucy_temp_final"; os.makedirs(OUT, exist_ok=True) -src, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) -srt, _ = librosa.effects.trim(src, top_db=30); ref = os.path.join(BASE, "ref.wav") -sf.write(ref, srt[:int(18*24000)], 24000) - -SENT = { - "kurz": "Hallo Commander, ich höre dich.", - "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", - "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", -} -def cleanup_v2(a, sr): - a = np.asarray(a, dtype=np.float32).reshape(-1) - if a.size == 0: return a - peak = float(np.max(np.abs(a))) - if peak > 0: a = a*(0.95/peak) - yt,_ = librosa.effects.trim(a, top_db=45); a = yt if yt.size else a - fi = min(int(0.01*sr), a.size//2) - if fi>0: - a[:fi]*=np.linspace(0.,1.,fi,dtype=np.float32); a[-fi:]*=np.linspace(1.,0.,fi,dtype=np.float32) - pad = np.zeros(int(0.09*sr),dtype=np.float32) - return np.concatenate([pad,a,pad]) - -for temp in [0.70, 0.90]: - m = TTSModel.load_model(language="german_24l", lsd_decode_steps=6, temp=temp) - vs = m.get_state_for_audio_prompt(ref); sr = m.sample_rate - tag = f"t{int(temp*100):03d}" - print(f"== temp={temp} ==", flush=True) - for name, text in SENT.items(): - a = m.generate_audio(vs, text, frames_after_eos=4) - a = a.numpy() if hasattr(a,"numpy") else np.asarray(a) - a = cleanup_v2(a, sr) - sf.write(os.path.join(OUT, f"{tag}_{name}.wav"), a, sr) - print(f" {name}", flush=True) -print("TEMP_FINAL_DONE", flush=True) diff --git a/client/lucy-tts/umlaut_test.py b/client/lucy-tts/umlaut_test.py deleted file mode 100644 index 1a82a61..0000000 --- a/client/lucy-tts/umlaut_test.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- -"""umlaut_test.py — prüft den Umlaut-Normalizer. -A) Logik: bekannte ASCII-Umlaut-Wörter -> Umlaut, normale Wörter (neue/aktuell/Steuer) UNVERÄNDERT. -B) Audio: erzeugt vorher (roh ASCII) vs nachher (mit Fix) auf den Desktop zum Reinhören. -""" -import os, time -import numpy as np, soundfile as sf, librosa -import pocket_server as ps - -DESK = os.path.join(os.path.expanduser("~"), "Desktop", "lucy_samples") -os.makedirs(DESK, exist_ok=True) - -# --- A) Logik --- -POS = {"ueber": "über", "Schoen": "Schön", "fuer": "für", "maerz": "März", - "natuerlich": "natürlich", "Groesse": "Größe", "moeglich": "möglich", "muessen": "müssen"} -NEG = ["neue", "aktuell", "Steuer", "Quelle", "Feuer", "treue", "Museum", "Dauer", "heute", - "Frauen", "genau", "blaue"] -ok = True -for a, exp in POS.items(): - got = ps._fix_umlauts(a); good = got == exp; ok &= good - print(f"[pos] {a!r:14}-> {got!r:14} erwartet {exp!r:12} {'OK' if good else 'FAIL'}") -for w in NEG: - got = ps._fix_umlauts(w); good = got == w; ok &= good - print(f"[neg] {w!r:14}-> {got!r:14} {'OK (unverändert)' if good else 'FAIL: GEÄNDERT!'}") -S = "Ueber fuenf moegliche Gespraeche, natuerlich auch die Groesse." -print("SENT roh :", S) -print("SENT fix :", ps._fix_umlauts(S)) -print("LOGIC_OK" if ok else "LOGIC_FAIL") - -# --- B) Audio vorher/nachher --- -from pocket_tts import TTSModel -m = TTSModel.load_model(language=ps.LANG, lsd_decode_steps=ps.LSD, temp=ps.TEMP, - noise_clamp=ps.NOISE_CLAMP, quantize=ps.QUANTIZE) -ref = ps._prep_ref() -try: - vs = m.get_state_for_audio_prompt(ps.VOICE_ST) -except Exception: - vs = m.get_state_for_audio_prompt(ref) -ra, _ = librosa.load(ref, sr=m.sample_rate, mono=True) -ps.STATE.clear() -ps.STATE.update(m=m, vs=vs, sr=m.sample_rate, ref_fp=ps._fingerprint(ra, m.sample_rate)) - -def gen(text): - return ps.cleanup(ps._gen_gated(text), m.sample_rate) - -sf.write(os.path.join(DESK, "umlaut_vorher.wav"), gen(S), m.sample_rate) # roh ASCII (falsch) -sf.write(os.path.join(DESK, "umlaut_nachher.wav"), gen(ps._fix_umlauts(S)), m.sample_rate) # mit Fix -print("Samples: umlaut_vorher.wav (roh) + umlaut_nachher.wav (fix) ->", DESK) -print("UMLAUT_DONE") diff --git a/client/lucy-tts/verify_clip.py b/client/lucy-tts/verify_clip.py deleted file mode 100644 index b4b78e5..0000000 --- a/client/lucy-tts/verify_clip.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- -"""Verify: fehlen WÖRTER (Content-Cut) oder ist es nur gefühltes abruptes Einsetzen? -Whisper-Rücktranskription der v2-Samples + Energie am 1./letzten Audio-Sample.""" -import os, numpy as np, soundfile as sf -from faster_whisper import WhisperModel - -DIR = r"C:\Users\TobisPC\Desktop\lucy_lsd_v2" -EXPECT = { - "kurz": "Hallo Commander, ich höre dich.", - "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", - "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", -} -w = WhisperModel("small", device="cpu", compute_type="int8") -for lsd in [5, 6]: - print(f"=== lsd {lsd} ===") - for name in ["kurz", "mittel", "lang"]: - p = os.path.join(DIR, f"lsd{lsd}_{name}.wav") - a, sr = sf.read(p) - a = np.asarray(a, dtype=np.float32).reshape(-1) - # Energie der ersten/letzten 100ms NICHT-Pad (überspringe 90ms Pad) - pad = int(0.09*sr) - core = a[pad:-pad] if a.size > 2*pad else a - seg, _ = w.transcribe(p, language="de", beam_size=5) - txt = " ".join(s.text for s in seg).strip() - print(f"[{name:6}] EXPECT: {EXPECT[name]}") - print(f" GOT : {txt}") - print(f" dur={a.size/sr:.2f}s core_start_amp={np.abs(core[:5]).max():.3f} core_end_amp={np.abs(core[-5:]).max():.3f}") -print("VERIFY_DONE")

Vwqc6-}*eIa%a!1fF&p^CK4{!P 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 z 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 W$d(0BQtl0=R)?C57 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%0DZx&A=06X|W^t!p|eC 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 Mjq|3cL-P0k065pdJ^%m! diff --git a/client/lucy-desktop/src/renderer/src/App.tsx b/client/lucy-desktop/src/renderer/src/App.tsx deleted file mode 100644 index 4577ace..0000000 --- a/client/lucy-desktop/src/renderer/src/App.tsx +++ /dev/null @@ -1,234 +0,0 @@ -import { useCallback, useEffect, useRef, useState } from "react" -import { Avatar3D } from "./components/Avatar3D" -import { AuraGlow } from "./components/AuraGlow" -import { ChatMarkdown } from "./components/ChatMarkdown" -import { useVoiceAgent } from "./lib/voice/useVoiceAgent" -import { useDanceAudio } from "./lib/voice/useDanceAudio" - -const FIXED_AVATAR = "/avatar.vrm" - -const STATUS_LABEL: Record = { - warming: "Lucy waermt auf …", - idle: "Bereit — halte zum Sprechen", - listening: "Hoere zu …", - transcribing: "Verstehe …", - thinking: "Lucy denkt …", - speaking: "Lucy spricht …", - error: "Fehler", -} - -export default function App() { - const { status, ready, messages, error, recording, audioLevel, emotion, pressStart, pressEnd, reset, - inputMode, setInputMode, vadListening, lookAtScreen } = useVoiceAgent() - const { danceLevel, dancing, toggleDance } = useDanceAudio() - const holding = useRef(false) - const endRef = useRef(null) - const cursor = useRef({ x: 0, y: 0 }) // Mauszeiger relativ zu Lucys Kopf (Blickfolgen) - const pat = useRef(0) // Zaehler: Antippen/Streicheln des Avatars - const [mode, setMode] = useState<"full" | "overlay">("full") - const [pinned, setPinned] = useState(false) - const [ghost, setGhost] = useState(false) // Geistmodus: Fenster durchklickbar (nur Overlay) - - useEffect(() => { endRef.current?.scrollIntoView({ behavior: "smooth", block: "end" }) }, [messages]) - - // Fenster-Modus vom Main synchronisieren (Tray/Hotkey koennen ihn aendern) - useEffect(() => { - window.lucy?.getMode().then(setMode).catch(() => {}) - return window.lucy?.onMode(setMode) - }, []) - - // Geistmodus (Overlay v2): Fenster durchklickbar, AUSSER der Zeiger ist ueber Lucys Bedienelementen - // (.clickable). So sitzt sie auf dem Desktop, du arbeitest dahinter weiter, kannst sie aber bedienen. - useEffect(() => { - if (!(ghost && mode === "overlay")) { void window.lucy?.setClickThrough(false); return } - let ignoring = false - const set = (ig: boolean) => { if (ig !== ignoring) { ignoring = ig; void window.lucy?.setClickThrough(ig) } } - set(true) - const onMove = (e: MouseEvent) => { - const el = document.elementFromPoint(e.clientX, e.clientY) as HTMLElement | null - set(!(el && el.closest(".clickable"))) - } - window.addEventListener("mousemove", onMove) - return () => { window.removeEventListener("mousemove", onMove); void window.lucy?.setClickThrough(false) } - }, [ghost, mode]) - useEffect(() => { if (mode !== "overlay") setGhost(false) }, [mode]) // Geistmodus nur im Overlay - - // Mauszeiger-Verfolgung (MateEngine-Idee): Position vom Main-Prozess in den Avatar-Blick fuettern - useEffect(() => window.lucy?.onCursor((p) => { cursor.current = p }), []) - - // Leertaste = Push-to-talk (halten) - useEffect(() => { - const isField = (el: EventTarget | null) => - el instanceof HTMLElement && /^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName) - const down = (e: KeyboardEvent) => { - if (e.code !== "Space" || e.repeat || holding.current || isField(e.target)) return - e.preventDefault(); holding.current = true; pressStart() - } - const up = (e: KeyboardEvent) => { - if (e.code !== "Space" || !holding.current) return - e.preventDefault(); holding.current = false; pressEnd() - } - window.addEventListener("keydown", down); window.addEventListener("keyup", up) - return () => { window.removeEventListener("keydown", down); window.removeEventListener("keyup", up) } - }, [pressStart, pressEnd]) - - // Global-Hotkey = TOGGLE (Global-Shortcuts liefern kein key-up) -> Druck startet/stoppt Aufnahme - const recRef = useRef(recording); recRef.current = recording - useEffect(() => { - return window.lucy?.onHotkey(() => { - if (recRef.current || holding.current) { holding.current = false; pressEnd() } - else { holding.current = true; pressStart() } - }) - }, [pressStart, pressEnd]) - - const toggleMode = useCallback(() => { - const next = mode === "full" ? "overlay" : "full" - window.lucy?.setMode(next).then(setMode).catch(() => setMode(next)) - }, [mode]) - const togglePin = useCallback(() => { window.lucy?.togglePin().then(setPinned).catch(() => {}) }, []) - - const speaking = status === "speaking" - const busy = status === "transcribing" || status === "thinking" - const statusColor = status === "error" ? "#f87171" : speaking ? "#7dd3fc" : "#9ca3af" - const overlay = mode === "overlay" - const lastAssistant = [...messages].reverse().find((m) => m.role === "assistant")?.text?.trim() || "" - // Overlay-Blasen: Links/Code aus der letzten Antwort griffbereit (im Overlay gibt es kein Chat-Panel) - const ovLinks = overlay ? Array.from(new Set(lastAssistant.match(/https?:\/\/[^\s)]+/g) || [])).slice(0, 3) : [] - const ovCode = overlay ? (lastAssistant.match(/```[\w]*\n?([\s\S]*?)```/)?.[1] || "").trim() : "" - const shortUrl = (u: string) => u.replace(/^https?:\/\/(www\.)?/, "") - - const micBtn = ( - - ) - - return ( -