diff --git a/CHANGELOG.md b/CHANGELOG.md
index 95cf775..7c9bad3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,13 @@ Follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) · versioned wi
---
+## [1.9.3] — 2026-06-26
+
+### Added
+- **Native Speed for Try it out & Read aloud**: a **Native Speed** control (range 0.5×–2.0×, default 1.0) is now available in both the *Try it out* and *Read aloud* sections. It passes the `speed` parameter directly to the TTS generation request (natively via the faster-qwen3-tts backend), producing audio at the target tempo from the model rather than using post-processing pitch/time-shift. Try it out persists the chosen speed in localStorage (per browser); Read aloud saves it with the document in the library (each book remembers its own speed).
+
+---
+
## [1.9.2] — 2026-06-26
### Fixed
diff --git a/VERSION b/VERSION
index 8fdcf38..77fee73 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.9.2
+1.9.3
diff --git a/routes/tts.py b/routes/tts.py
index 6371cb0..5836f1a 100644
--- a/routes/tts.py
+++ b/routes/tts.py
@@ -470,6 +470,14 @@ async def tts_preview(request: Request):
_overrides[_k] = int(_v) if _k == "seed" else float(_v)
except (TypeError, ValueError):
pass
+ _speed_v = data.get("speed")
+ if _speed_v is not None and _speed_v != "":
+ try:
+ _speed_f = float(_speed_v)
+ if _speed_f != 1.0:
+ _overrides["speed"] = max(0.1, min(4.0, _speed_f))
+ except (TypeError, ValueError):
+ pass
if _overrides:
from core.config import _tts_extra_params
settings = dict(settings)
diff --git a/static/index.html b/static/index.html
index 2a4b3a2..54c909b 100644
--- a/static/index.html
+++ b/static/index.html
@@ -26,7 +26,7 @@
-
+
@@ -308,7 +308,7 @@
-
+