VoiceWake: track listening state for PTT

This commit is contained in:
Peter Steinberger
2025-12-08 23:17:11 +01:00
parent 05bd452f76
commit 2b7adeb220

View File

@@ -10,6 +10,8 @@ import AppKit
actor VoiceWakeRuntime { actor VoiceWakeRuntime {
static let shared = VoiceWakeRuntime() static let shared = VoiceWakeRuntime()
enum ListeningState { case idle, voiceWake, pushToTalk }
private let logger = Logger(subsystem: "com.steipete.clawdis", category: "voicewake.runtime") private let logger = Logger(subsystem: "com.steipete.clawdis", category: "voicewake.runtime")
private var recognizer: SFSpeechRecognizer? private var recognizer: SFSpeechRecognizer?
@@ -28,6 +30,7 @@ actor VoiceWakeRuntime {
private var volatileTranscript: String = "" private var volatileTranscript: String = ""
private var cooldownUntil: Date? private var cooldownUntil: Date?
private var currentConfig: RuntimeConfig? private var currentConfig: RuntimeConfig?
private var listeningState: ListeningState = .idle
// Tunables // Tunables
// Silence threshold once we've captured user speech (post-trigger). // Silence threshold once we've captured user speech (post-trigger).
@@ -152,6 +155,7 @@ actor VoiceWakeRuntime {
self.audioEngine.inputNode.removeTap(onBus: 0) self.audioEngine.inputNode.removeTap(onBus: 0)
self.audioEngine.stop() self.audioEngine.stop()
self.currentConfig = nil self.currentConfig = nil
self.listeningState = .idle
self.logger.debug("voicewake runtime stopped") self.logger.debug("voicewake runtime stopped")
guard dismissOverlay else { return } guard dismissOverlay else { return }
@@ -224,6 +228,7 @@ actor VoiceWakeRuntime {
} }
private func beginCapture(transcript: String, config: RuntimeConfig) async { private func beginCapture(transcript: String, config: RuntimeConfig) async {
self.listeningState = .voiceWake
self.isCapturing = true self.isCapturing = true
let trimmed = Self.trimmedAfterTrigger(transcript, triggers: config.triggers) let trimmed = Self.trimmedAfterTrigger(transcript, triggers: config.triggers)
self.capturedTranscript = trimmed self.capturedTranscript = trimmed
@@ -360,7 +365,8 @@ actor VoiceWakeRuntime {
} }
func pauseForPushToTalk() { func pauseForPushToTalk() {
self.stop() self.listeningState = .pushToTalk
self.stop(dismissOverlay: false)
} }
private func updateHeardBeyondTrigger(withTrimmed trimmed: String) { private func updateHeardBeyondTrigger(withTrimmed trimmed: String) {