|
|
@ -81,8 +81,8 @@ public final class AppDelegate: NSObject, NSApplicationDelegate { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
self.pendingStopWorkItem = workItem |
|
|
self.pendingStopWorkItem = workItem |
|
|
// Trailing grace period: 0.5s (500ms) buffer so trailing words/syllables are never clipped |
|
|
|
|
|
DispatchQueue.main.asyncAfter(deadline: .now() + 0.50, execute: workItem) |
|
|
|
|
|
|
|
|
// Trailing grace period: 1.0s (1000ms) buffer so trailing words/syllables right up to key release are never clipped |
|
|
|
|
|
DispatchQueue.main.asyncAfter(deadline: .now() + 1.00, execute: workItem) |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
@ -338,7 +338,7 @@ public final class AppDelegate: NSObject, NSApplicationDelegate { |
|
|
|
|
|
|
|
|
// Dynamic safety timeout watchdog: scale with audio length & network transit |
|
|
// Dynamic safety timeout watchdog: scale with audio length & network transit |
|
|
let durationSec = Double(pcmData.count) / 32000.0 |
|
|
let durationSec = Double(pcmData.count) / 32000.0 |
|
|
let finalizeTimeout = max(4.0, min(16.0, durationSec * 0.25 + 3.5)) |
|
|
|
|
|
|
|
|
let finalizeTimeout = InputBoxManager.shared.hasStreamedText ? 0.8 : max(1.2, min(4.0, durationSec * 0.15 + 1.2)) |
|
|
|
|
|
|
|
|
let watchdog = DispatchWorkItem { [weak self] in |
|
|
let watchdog = DispatchWorkItem { [weak self] in |
|
|
guard let self = self, self.isBusyFinalizing else { return } |
|
|
guard let self = self, self.isBusyFinalizing else { return } |
|
|
|