From e86df221fa8f9d6796fb7fe59020767d7c806fac Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Sun, 14 Jun 2026 20:57:40 +0800
Subject: [PATCH] Fix X-ASR hold pre-capture
---
privatevoice.src/internal/engine/engine_darwin.go | 30 +++++++++++++++++++++++++-----
1 files changed, 25 insertions(+), 5 deletions(-)
diff --git a/privatevoice.src/internal/engine/engine_darwin.go b/privatevoice.src/internal/engine/engine_darwin.go
index d530c83..5caceb8 100755
--- a/privatevoice.src/internal/engine/engine_darwin.go
+++ b/privatevoice.src/internal/engine/engine_darwin.go
@@ -16,11 +16,15 @@
const (
asrSampleRate = 16000
+ xasrHeadPaddingSamples = asrSampleRate / 4
xasrTailPaddingSamples = asrSampleRate + asrSampleRate/2
xasrReleaseTailDelay = 300 * time.Millisecond
)
-var xasrTailPadding = make([]float32, xasrTailPaddingSamples)
+var (
+ xasrHeadPadding = make([]float32, xasrHeadPaddingSamples)
+ xasrTailPadding = make([]float32, xasrTailPaddingSamples)
+)
type sherpaEngine struct {
recognizer *sherpa.OfflineRecognizer
@@ -34,10 +38,11 @@
}
type xasrStreamingSession struct {
- engine *xasrStreamingEngine
- stream *sherpa.OnlineStream
- lastText string
- finished bool
+ engine *xasrStreamingEngine
+ stream *sherpa.OnlineStream
+ lastText string
+ hasAcceptedSamples bool
+ finished bool
}
func newPlatformEngine(resolved model.ResolvedModel) (Engine, error) {
@@ -235,6 +240,10 @@
if s.stream == nil || s.finished {
return s.lastText, nil
}
+ if !s.hasAcceptedSamples {
+ samples = xasrSamplesWithHeadPadding(samples)
+ s.hasAcceptedSamples = true
+ }
s.engine.mu.Lock()
defer s.engine.mu.Unlock()
@@ -295,6 +304,13 @@
return nextText
}
+func xasrSamplesWithHeadPadding(samples []float32) []float32 {
+ padded := make([]float32, 0, len(xasrHeadPadding)+len(samples))
+ padded = append(padded, xasrHeadPadding...)
+ padded = append(padded, samples...)
+ return padded
+}
+
func (e *sherpaEngine) HardwareInfo() string {
return e.hwInfo
}
@@ -307,6 +323,10 @@
return xasrReleaseTailDelay
}
+func (e *xasrStreamingEngine) HoldPreCaptureEnabled() bool {
+ return true
+}
+
func (e *sherpaEngine) Close() {
if e.recognizer != nil {
sherpa.DeleteOfflineRecognizer(e.recognizer)
--
Gitblit v1.9.3