diff --git a/CHANGELOG.md b/CHANGELOG.md index f0af1f63..48171bd5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,16 @@ ## [Unreleased] +## [v0.51.556] — 2026-06-21 — Release TO (Indonesian Edge TTS voice + Listen button state fix) + +### Added + +- **Indonesian Edge TTS voice (`Gadis`).** Added `id-ID-GadisNeural` to the Edge TTS voice allowlist and the voice picker. Thanks @latipun7. + +### Fixed + +- **The Listen (text-to-speech) button now reflects playing state for chunked Edge TTS playback.** It marks the speaking state at the start of playback so the button shows it's active instead of looking idle while audio plays. Thanks @latipun7. + ## [v0.51.555] — 2026-06-21 — Release TN (mobile reloads recover after compression rotation) ### Fixed diff --git a/api/routes.py b/api/routes.py index 47d9bad0..58404f4d 100644 --- a/api/routes.py +++ b/api/routes.py @@ -13577,6 +13577,7 @@ def _handle_tts(handler, parsed): "fr-CA-AntoineNeural", "fr-CA-JeanNeural", "fr-CA-SylvieNeural", "fr-CA-ThierryNeural", "fr-FR-DeniseNeural", "fr-FR-EloiseNeural", "fr-FR-HenriNeural", + "id-ID-GadisNeural", } if voice not in allowed: from api.helpers import bad as _bad diff --git a/static/panels.js b/static/panels.js index bd320023..d6b5067c 100644 --- a/static/panels.js +++ b/static/panels.js @@ -7372,6 +7372,7 @@ async function loadSettingsPanel(){ {value:'zh-CN-YunyangNeural',label:'Yunyang (Chinese, Male)'}, {value:'en-US-AriaNeural',label:'Aria (English, Female)'}, {value:'en-US-GuyNeural',label:'Guy (English, Male)'}, + {value:'id-ID-GadisNeural',label:'Gadis (Indonesian, Female)'}, ]; ttsVoiceSel.innerHTML=''; edgeVoices.forEach(v=>{ diff --git a/static/ui.js b/static/ui.js index 5a4f05d0..7346fed8 100644 --- a/static/ui.js +++ b/static/ui.js @@ -6095,6 +6095,8 @@ function _buildBrowserUtterance(text, btn){ } function _playEdgeTtsChunked(text, btn){ + _ttsSpeaking=true; + if(btn) btn.dataset.speaking='1'; const chunks=_splitForTTS(text); const _playOne=function(idx){ if(idx>=chunks.length){