merge: tail audio ASR fix (P0+P1) into feature/polish-style-packs

Co-authored-by: Rocky <hkgood@users.noreply.github.com>
This commit is contained in:
Cursor Agent
2026-07-26 10:34:05 +00:00
20 changed files with 741 additions and 45 deletions
+12 -8
View File
@@ -7,11 +7,7 @@ import Foundation
import os
enum MacMLXLiveCapture {
private static let tailDrainPolicy = FlowCaptureTailDrainPolicy(
silenceRMSThreshold: 0.015,
silenceDurationSeconds: 0.35,
maxDrainSeconds: 0.75
)
private static let tailDrainPolicy = FlowCaptureTailDrainPolicy.macMLX
/// Runs MLX streaming ASR until `finishSignal` fires, then tail-drains and finalizes.
static func run(
@@ -47,6 +43,7 @@ enum MacMLXLiveCapture {
let drainTracker = FlowCaptureDrainTracker()
let draining = OSAllocatedUnfairLock(initialState: false)
let drainComplete = OSAllocatedUnfairLock(initialState: false)
let pendingFeed = OSAllocatedUnfairLock(initialState: [Float]())
let feedIntervalSamples = 1_600 // 100 ms @ 16 kHz
@@ -60,6 +57,11 @@ enum MacMLXLiveCapture {
for await _ in finishSignal {
draining.withLock { $0 = true }
drainTracker.beginDrain()
_ = await FlowUtteranceEndCoordinator.awaitTailCapture(
tracker: drainTracker,
policy: tailDrainPolicy
)
drainComplete.withLock { $0 = true }
break
}
}
@@ -67,10 +69,12 @@ enum MacMLXLiveCapture {
group.addTask {
for await snapshot in audioStream {
if Task.isCancelled { break }
if drainComplete.withLock({ $0 }) { break }
if draining.withLock({ $0 }) {
drainTracker.noteAudio(samples: snapshot.samples, policy: tailDrainPolicy)
let decision = drainTracker.shouldFinish(policy: tailDrainPolicy)
if decision.finished { break }
drainTracker.noteAudio(
samples: snapshot.samples,
policy: tailDrainPolicy
)
}
pendingFeed.withLock { buffer in
buffer.append(contentsOf: snapshot.samples)