From 1645be8a97a83981c5abb75079a64607cb5a7c0f Mon Sep 17 00:00:00 2001 From: Bruno Deanoz Date: Tue, 23 Jun 2026 00:39:34 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20sync=20TTS=20voice=20from=20server=20?= =?UTF-8?q?=E2=80=94=20app=20reads=20ttsVoice=20from=20/api/v1/me?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Voice preference set in web settings now automatically applies in the app. Falls back to "Kore" if no server preference set. --- app/src/main/java/dev/kaizen/app/chat/ChatScreen.kt | 4 +++- app/src/main/java/dev/kaizen/app/net/KaizenApi.kt | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/dev/kaizen/app/chat/ChatScreen.kt b/app/src/main/java/dev/kaizen/app/chat/ChatScreen.kt index 5325b0d..dd33555 100644 --- a/app/src/main/java/dev/kaizen/app/chat/ChatScreen.kt +++ b/app/src/main/java/dev/kaizen/app/chat/ChatScreen.kt @@ -126,6 +126,7 @@ fun ChatScreen( // TTS playback state var playingTtsForId by remember { mutableStateOf(null) } val ttsPlayerRef = remember { mutableStateOf(null) } + var ttsVoice by remember { mutableStateOf("Kore") } // Navigation State var currentScreen by remember { mutableStateOf(AppScreen.Chat) } @@ -261,7 +262,7 @@ fun ChatScreen( } ttsPlayerRef.value?.release() playingTtsForId = messageId - val voice = "Kore" + val voice = ttsVoice scope.launch { val cached = chat.messageDao.getTtsUrl(wireId, voice) if (cached != null) { @@ -297,6 +298,7 @@ fun ChatScreen( KaizenApi.fetchMe(cfg.baseUrl, cfg.token)?.let { me -> me.name?.let { settingsViewModel.updateUserName(it) } me.email?.let { settingsViewModel.updateUserEmail(it) } + me.ttsVoice?.let { ttsVoice = it } } chat.conversationRepo.refresh(cfg.baseUrl, cfg.token) if (errors.isNotEmpty()) { diff --git a/app/src/main/java/dev/kaizen/app/net/KaizenApi.kt b/app/src/main/java/dev/kaizen/app/net/KaizenApi.kt index 587c3f0..91b5ac8 100644 --- a/app/src/main/java/dev/kaizen/app/net/KaizenApi.kt +++ b/app/src/main/java/dev/kaizen/app/net/KaizenApi.kt @@ -27,6 +27,7 @@ import java.util.concurrent.TimeUnit val name: String? = null, val email: String? = null, val defaultModel: String? = null, + val ttsVoice: String? = null, ) @Serializable data class WireMessage(val role: String, val content: String) @Serializable private data class ChatRequest(