Skip to content

Commit 5942b10

Browse files
MKV21obviyus
authored andcommitted
Android: route voice replies through reply speaker
1 parent b4f0e5a commit 5942b10

1 file changed

Lines changed: 9 additions & 11 deletions

File tree

apps/android/app/src/main/java/ai/openclaw/app/NodeRuntime.kt

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -381,11 +381,10 @@ class NodeRuntime(
381381
parseChatSendRunId(response) ?: idempotencyKey
382382
},
383383
speakAssistantReply = { text ->
384-
// Skip if TalkModeManager is handling TTS (ttsOnAllResponses) to avoid
385-
// double-speaking the same assistant reply from both pipelines.
386-
if (!talkMode.ttsOnAllResponses) {
387-
voiceReplySpeaker.speakAssistantReply(text)
388-
}
384+
// Voice-tab replies should speak through the dedicated reply speaker.
385+
// Relying on talkMode.ttsOnAllResponses here can drop playback if the
386+
// chat-event path misses the terminal event for this turn.
387+
voiceReplySpeaker.speakAssistantReply(text)
389388
},
390389
)
391390
}
@@ -596,12 +595,11 @@ class NodeRuntime(
596595

597596
scope.launch {
598597
prefs.talkEnabled.collect { enabled ->
599-
// MicCaptureManager handles STT + send to gateway.
600-
// TalkModeManager plays TTS on assistant responses.
598+
// MicCaptureManager handles STT + send to gateway, while the dedicated
599+
// reply speaker handles TTS for assistant replies in the voice tab.
601600
micCapture.setMicEnabled(enabled)
602601
if (enabled) {
603-
// Mic on = user is on voice screen and wants TTS responses.
604-
talkMode.ttsOnAllResponses = true
602+
talkMode.ttsOnAllResponses = false
605603
scope.launch { talkMode.ensureChatSubscribed() }
606604
}
607605
externalAudioCaptureActive.value = enabled
@@ -763,7 +761,7 @@ class NodeRuntime(
763761
if (value) {
764762
// Tapping mic on interrupts any active TTS (barge-in)
765763
talkMode.stopTts()
766-
talkMode.ttsOnAllResponses = true
764+
talkMode.ttsOnAllResponses = false
767765
scope.launch { talkMode.ensureChatSubscribed() }
768766
}
769767
micCapture.setMicEnabled(value)
@@ -778,7 +776,7 @@ class NodeRuntime(
778776
if (voiceReplySpeakerLazy.isInitialized()) {
779777
voiceReplySpeaker.setPlaybackEnabled(value)
780778
}
781-
// Keep TalkMode in sync so speaker mute works when ttsOnAllResponses is active.
779+
// Keep TalkMode in sync so any active Talk playback also respects speaker mute.
782780
talkMode.setPlaybackEnabled(value)
783781
}
784782

0 commit comments

Comments
 (0)