From 4a0341ed035cae117ee560def33a74e87dd036ef Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Fri, 20 Mar 2026 10:45:32 +0530 Subject: [PATCH] fix(review): address talk cleanup feedback --- .../ai/openclaw/app/voice/TalkModeManager.kt | 7 +- src/gateway/server-methods/talk.ts | 99 +++++++------------ 2 files changed, 39 insertions(+), 67 deletions(-) diff --git a/apps/android/app/src/main/java/ai/openclaw/app/voice/TalkModeManager.kt b/apps/android/app/src/main/java/ai/openclaw/app/voice/TalkModeManager.kt index 4ba2c2ef043..be62498e24e 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/voice/TalkModeManager.kt +++ b/apps/android/app/src/main/java/ai/openclaw/app/voice/TalkModeManager.kt @@ -756,12 +756,9 @@ class TalkModeManager( } val suffix = resolveGatewayAudioSuffix(speech) val tempFile = - withContext(Dispatchers.IO) { - File.createTempFile("tts_", suffix, context.cacheDir).apply { - writeBytes(audioBytes) - } - } + withContext(Dispatchers.IO) { File.createTempFile("tts_", suffix, context.cacheDir) } try { + withContext(Dispatchers.IO) { tempFile.writeBytes(audioBytes) } val player = MediaPlayer() this.player = player val finished = CompletableDeferred() diff --git a/src/gateway/server-methods/talk.ts b/src/gateway/server-methods/talk.ts index 33cb6d7f116..85f78e91b6a 100644 --- a/src/gateway/server-methods/talk.ts +++ b/src/gateway/server-methods/talk.ts @@ -112,83 +112,58 @@ function buildTalkTtsConfig( auto: "always", provider, }; + const baseUrl = trimString(providerConfig.baseUrl); + const voiceId = trimString(providerConfig.voiceId); + const modelId = trimString(providerConfig.modelId); + const languageCode = trimString(providerConfig.languageCode); if (provider === "elevenlabs") { + const seed = finiteNumber(providerConfig.seed); + const applyTextNormalization = normalizeTextNormalization( + providerConfig.applyTextNormalization, + ); + const voiceSettings = readTalkVoiceSettings(providerConfig); talkTts.elevenlabs = { ...baseTts.elevenlabs, ...(providerConfig.apiKey === undefined ? {} : { apiKey: providerConfig.apiKey }), - ...(trimString(providerConfig.baseUrl) == null - ? {} - : { baseUrl: trimString(providerConfig.baseUrl) }), - ...(trimString(providerConfig.voiceId) == null - ? {} - : { voiceId: trimString(providerConfig.voiceId) }), - ...(trimString(providerConfig.modelId) == null - ? {} - : { modelId: trimString(providerConfig.modelId) }), - ...(finiteNumber(providerConfig.seed) == null - ? {} - : { seed: finiteNumber(providerConfig.seed) }), - ...(normalizeTextNormalization(providerConfig.applyTextNormalization) == null - ? {} - : { - applyTextNormalization: normalizeTextNormalization( - providerConfig.applyTextNormalization, - ), - }), - ...(trimString(providerConfig.languageCode) == null - ? {} - : { languageCode: trimString(providerConfig.languageCode) }), - ...(readTalkVoiceSettings(providerConfig) == null - ? {} - : { voiceSettings: readTalkVoiceSettings(providerConfig) }), + ...(baseUrl == null ? {} : { baseUrl }), + ...(voiceId == null ? {} : { voiceId }), + ...(modelId == null ? {} : { modelId }), + ...(seed == null ? {} : { seed }), + ...(applyTextNormalization == null ? {} : { applyTextNormalization }), + ...(languageCode == null ? {} : { languageCode }), + ...(voiceSettings == null ? {} : { voiceSettings }), }; } else if (provider === "openai") { + const speed = finiteNumber(providerConfig.speed); + const instructions = trimString(providerConfig.instructions); talkTts.openai = { ...baseTts.openai, ...(providerConfig.apiKey === undefined ? {} : { apiKey: providerConfig.apiKey }), - ...(trimString(providerConfig.baseUrl) == null - ? {} - : { baseUrl: trimString(providerConfig.baseUrl) }), - ...(trimString(providerConfig.modelId) == null - ? {} - : { model: trimString(providerConfig.modelId) }), - ...(trimString(providerConfig.voiceId) == null - ? {} - : { voice: trimString(providerConfig.voiceId) }), - ...(finiteNumber(providerConfig.speed) == null - ? {} - : { speed: finiteNumber(providerConfig.speed) }), - ...(trimString(providerConfig.instructions) == null - ? {} - : { instructions: trimString(providerConfig.instructions) }), + ...(baseUrl == null ? {} : { baseUrl }), + ...(modelId == null ? {} : { model: modelId }), + ...(voiceId == null ? {} : { voice: voiceId }), + ...(speed == null ? {} : { speed }), + ...(instructions == null ? {} : { instructions }), }; } else if (provider === "microsoft") { + const outputFormat = trimString(providerConfig.outputFormat); + const pitch = trimString(providerConfig.pitch); + const rate = trimString(providerConfig.rate); + const volume = trimString(providerConfig.volume); + const proxy = trimString(providerConfig.proxy); + const timeoutMs = finiteNumber(providerConfig.timeoutMs); talkTts.microsoft = { ...baseTts.microsoft, enabled: true, - ...(trimString(providerConfig.voiceId) == null - ? {} - : { voice: trimString(providerConfig.voiceId) }), - ...(trimString(providerConfig.languageCode) == null - ? {} - : { lang: trimString(providerConfig.languageCode) }), - ...(trimString(providerConfig.outputFormat) == null - ? {} - : { outputFormat: trimString(providerConfig.outputFormat) }), - ...(trimString(providerConfig.pitch) == null - ? {} - : { pitch: trimString(providerConfig.pitch) }), - ...(trimString(providerConfig.rate) == null ? {} : { rate: trimString(providerConfig.rate) }), - ...(trimString(providerConfig.volume) == null - ? {} - : { volume: trimString(providerConfig.volume) }), - ...(trimString(providerConfig.proxy) == null - ? {} - : { proxy: trimString(providerConfig.proxy) }), - ...(finiteNumber(providerConfig.timeoutMs) == null - ? {} - : { timeoutMs: finiteNumber(providerConfig.timeoutMs) }), + ...(voiceId == null ? {} : { voice: voiceId }), + ...(languageCode == null ? {} : { lang: languageCode }), + ...(outputFormat == null ? {} : { outputFormat }), + ...(pitch == null ? {} : { pitch }), + ...(rate == null ? {} : { rate }), + ...(volume == null ? {} : { volume }), + ...(proxy == null ? {} : { proxy }), + ...(timeoutMs == null ? {} : { timeoutMs }), }; } else { return { error: `talk.speak unavailable: unsupported talk provider '${resolved.provider}'` };