Ariver
2026-06-24 7999e66c9c78ada3666eb7cea7c22a352bb4cbf0
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) {
@@ -113,6 +118,10 @@
      config.ModelConfig.Moonshine.Encoder = resolved.Files["encoder"]
      config.ModelConfig.Moonshine.UncachedDecoder = resolved.Files["uncached_decoder"]
      config.ModelConfig.Moonshine.CachedDecoder = resolved.Files["cached_decoder"]
   case model.BackendTransducer:
      config.ModelConfig.Transducer.Encoder = resolved.Files["encoder"]
      config.ModelConfig.Transducer.Decoder = resolved.Files["decoder"]
      config.ModelConfig.Transducer.Joiner = resolved.Files["joiner"]
   case model.BackendNemoTransducer:
      config.ModelConfig.Transducer.Encoder = resolved.Files["encoder"]
      config.ModelConfig.Transducer.Decoder = resolved.Files["decoder"]
@@ -235,6 +244,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 +308,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 +327,10 @@
   return xasrReleaseTailDelay
}
func (e *xasrStreamingEngine) HoldPreCaptureEnabled() bool {
   return true
}
func (e *sherpaEngine) Close() {
   if e.recognizer != nil {
      sherpa.DeleteOfflineRecognizer(e.recognizer)