From 1ab8a6a2fea932dc30de9678f17c64d2512fac02 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sun, 29 Mar 2026 18:50:09 +0200 Subject: [PATCH] addes speed config for voice --- bridge/aria_bridge.py | 11 ++++++++++- diagnostic/index.html | 19 +++++++++++++++++-- diagnostic/server.js | 1 + 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/bridge/aria_bridge.py b/bridge/aria_bridge.py index dd3f163..62b17de 100644 --- a/bridge/aria_bridge.py +++ b/bridge/aria_bridge.py @@ -38,6 +38,7 @@ import websockets from faster_whisper import WhisperModel from openwakeword.model import Model as WakeWordModel from piper import PiperVoice +from piper.config import SynthesisConfig from modes import Mode, detect_mode_switch, should_speak @@ -131,6 +132,7 @@ class VoiceEngine: self.voices: dict[str, PiperVoice] = {} self.default_voice = "ramona" self.highlight_voice = "thorsten" + self.speech_speed = 1.0 # 0.5 = langsam, 1.0 = normal, 2.0 = schnell def initialize(self) -> None: """Laedt die Piper-Stimmen aus dem Voices-Verzeichnis.""" @@ -216,8 +218,9 @@ class VoiceEngine: continue with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as tmp: tmp_path = tmp.name + syn_config = SynthesisConfig(length_scale=1.0 / max(0.3, self.speech_speed)) with wave.open(tmp_path, "wb") as wav_file: - voice.synthesize_wav(sentence, wav_file) + voice.synthesize_wav(sentence, wav_file, syn_config=syn_config) with wave.open(tmp_path, "rb") as wav_file: if sample_rate is None: sample_rate = wav_file.getframerate() @@ -494,6 +497,7 @@ class ARIABridge: vc = json.load(f) self.voice_engine.default_voice = vc.get("defaultVoice", "ramona") self.voice_engine.highlight_voice = vc.get("highlightVoice", "thorsten") + self.voice_engine.speech_speed = vc.get("speechSpeed", 1.0) self.tts_enabled = vc.get("ttsEnabled", True) logger.info("Voice-Config geladen: %s", vc) except Exception as e: @@ -1024,6 +1028,10 @@ class ARIABridge: self.tts_enabled = bool(payload["ttsEnabled"]) logger.info("[rvs] TTS %s", "aktiviert" if self.tts_enabled else "deaktiviert") changed = True + if "speechSpeed" in payload: + self.voice_engine.speech_speed = max(0.3, min(2.0, float(payload["speechSpeed"]))) + logger.info("[rvs] Sprechgeschwindigkeit: %.1f", self.voice_engine.speech_speed) + changed = True # Persistent speichern in Shared Volume if changed: try: @@ -1032,6 +1040,7 @@ class ARIABridge: "defaultVoice": self.voice_engine.default_voice, "highlightVoice": self.voice_engine.highlight_voice, "ttsEnabled": getattr(self, "tts_enabled", True), + "speechSpeed": self.voice_engine.speech_speed, } with open("/shared/config/voice_config.json", "w") as f: json.dump(config_data, f, indent=2) diff --git a/diagnostic/index.html b/diagnostic/index.html index 4190b4d..e97a1e0 100644 --- a/diagnostic/index.html +++ b/diagnostic/index.html @@ -414,10 +414,21 @@ -
+
+
+ +
+
+ 0.5x + + 2.0x +
@@ -646,6 +657,9 @@ document.getElementById('diag-default-voice').value = msg.defaultVoice || 'ramona'; document.getElementById('diag-highlight-voice').value = msg.highlightVoice || 'thorsten'; document.getElementById('diag-tts-enabled').checked = msg.ttsEnabled !== false; + const speed = msg.speechSpeed || 1.0; + document.getElementById('diag-speech-speed').value = speed; + document.getElementById('speed-label').textContent = speed + 'x'; return; } @@ -1143,7 +1157,8 @@ const defaultVoice = document.getElementById('diag-default-voice').value; const highlightVoice = document.getElementById('diag-highlight-voice').value; const ttsEnabled = document.getElementById('diag-tts-enabled').checked; - send({ action: 'send_voice_config', defaultVoice, highlightVoice, ttsEnabled }); + const speechSpeed = parseFloat(document.getElementById('diag-speech-speed').value); + send({ action: 'send_voice_config', defaultVoice, highlightVoice, ttsEnabled, speechSpeed }); } // ── Highlight-Trigger ──────────────────────── diff --git a/diagnostic/server.js b/diagnostic/server.js index 8302142..e970f93 100644 --- a/diagnostic/server.js +++ b/diagnostic/server.js @@ -1135,6 +1135,7 @@ wss.on("connection", (ws) => { defaultVoice: msg.defaultVoice || "ramona", highlightVoice: msg.highlightVoice || "thorsten", ttsEnabled: msg.ttsEnabled !== false, + speechSpeed: msg.speechSpeed || 1.0, }; try { fs.mkdirSync("/shared/config", { recursive: true });