diff --git a/src/dashboard/routes/voice.py b/src/dashboard/routes/voice.py index 10ea95ad..746e743c 100644 --- a/src/dashboard/routes/voice.py +++ b/src/dashboard/routes/voice.py @@ -66,10 +66,51 @@ async def tts_speak(text: str = Form(...)): # ── Voice button page ──────────────────────────────────────────────────── +@router.post("/settings") +async def update_voice_settings( + voice_id: str = Form(None), + rate: int = Form(None), + volume: float = Form(None), +): + """Update TTS settings.""" + try: + from timmy_serve.voice_tts import voice_tts + if voice_id: + voice_tts.set_voice(voice_id) + if rate: + voice_tts.set_rate(rate) + if volume is not None: + voice_tts.set_volume(volume) + return {"status": "ok", "message": "Voice settings updated"} + except Exception as exc: + return {"status": "error", "message": str(exc)} + + @router.get("/button", response_class=HTMLResponse) async def voice_button_page(request: Request): """Render the voice button UI.""" - return templates.TemplateResponse(request, "voice_button.html") + try: + from timmy_serve.voice_tts import voice_tts + voices = voice_tts.get_voices() if voice_tts.available else [] + current_voice = voice_tts._engine.getProperty("voice") if voice_tts._engine else None + current_rate = voice_tts._rate + current_volume = voice_tts._volume + except Exception: + voices = [] + current_voice = None + current_rate = 175 + current_volume = 0.9 + + return templates.TemplateResponse( + request, + "voice_button.html", + { + "voices": voices, + "current_voice": current_voice, + "current_rate": current_rate, + "current_volume": current_volume + } + ) @router.post("/command") diff --git a/src/dashboard/templates/voice_button.html b/src/dashboard/templates/voice_button.html index 5f79247b..ac088f33 100644 --- a/src/dashboard/templates/voice_button.html +++ b/src/dashboard/templates/voice_button.html @@ -30,6 +30,27 @@ +
+

// VOICE CUSTOMIZATION

+
+ + +
+
+ + +
+
+ + +
+ +
+

Try saying: