Ariver
2026-07-13 2d1d4ad406228ef62ab078724cb7d1556e003d01
C1.source/privatevoice.src/internal/engine/engine_darwin.go
@@ -29,11 +29,13 @@
type sherpaEngine struct {
   recognizer  *sherpa.OfflineRecognizer
   backendKind string
   provider    string
   hwInfo      string
}
type xasrStreamingEngine struct {
   recognizer *sherpa.OnlineRecognizer
   provider   string
   hwInfo     string
   mu         sync.Mutex
}
@@ -69,6 +71,7 @@
         return &sherpaEngine{
            recognizer:  recognizer,
            backendKind: resolved.BackendKind,
            provider:    p.provider,
            hwInfo:      info,
         }, nil
      }
@@ -93,6 +96,7 @@
         logger.Info("Engine initialized: %s", info)
         return &xasrStreamingEngine{
            recognizer: recognizer,
            provider:   p.provider,
            hwInfo:     info,
         }, nil
      }
@@ -196,28 +200,72 @@
}
func (e *sherpaEngine) Recognize(samples []float32) (string, error) {
   totalStart := time.Now()
   streamStart := time.Now()
   stream := sherpa.NewOfflineStream(e.recognizer)
   streamMS := durationMS(time.Since(streamStart))
   defer sherpa.DeleteOfflineStream(stream)
   acceptStart := time.Now()
   stream.AcceptWaveform(asrSampleRate, samples)
   acceptMS := durationMS(time.Since(acceptStart))
   decodeStart := time.Now()
   e.recognizer.Decode(stream)
   decodeMS := durationMS(time.Since(decodeStart))
   resultStart := time.Now()
   result := stream.GetResult()
   resultMS := durationMS(time.Since(resultStart))
   logger.Info(
      "PERF engine_recognize_detail backend=%q provider=%q engine=%q samples=%d audio_ms=%d create_stream_ms=%d accept_ms=%d decode_ms=%d result_ms=%d total_ms=%d",
      e.backendKind,
      e.provider,
      e.hwInfo,
      len(samples),
      audioDurationMS(samples),
      streamMS,
      acceptMS,
      decodeMS,
      resultMS,
      durationMS(time.Since(totalStart)),
   )
   return result.Text, nil
}
func (e *xasrStreamingEngine) Recognize(samples []float32) (string, error) {
   totalStart := time.Now()
   sessionStart := time.Now()
   session, err := e.NewStreamingSession()
   if err != nil {
      return "", err
   }
   sessionMS := durationMS(time.Since(sessionStart))
   defer session.Close()
   acceptStart := time.Now()
   if _, err := session.Accept(samples); err != nil {
      return "", err
   }
   return session.Finish()
   acceptMS := durationMS(time.Since(acceptStart))
   finishStart := time.Now()
   text, err := session.Finish()
   finishMS := durationMS(time.Since(finishStart))
   if err == nil {
      logger.Info(
         "PERF engine_recognize_detail backend=%q provider=%q engine=%q samples=%d audio_ms=%d create_session_ms=%d accept_ms=%d finish_ms=%d total_ms=%d",
         model.BackendXASRStreaming,
         e.provider,
         e.hwInfo,
         len(samples),
         audioDurationMS(samples),
         sessionMS,
         acceptMS,
         finishMS,
         durationMS(time.Since(totalStart)),
      )
   }
   return text, err
}
func (e *xasrStreamingEngine) NewStreamingSession() (StreamingSession, error) {
@@ -316,6 +364,10 @@
   return e.hwInfo
}
func (e *sherpaEngine) Provider() string {
   return e.provider
}
func (e *sherpaEngine) ReleaseTailCaptureDelay() time.Duration {
   if e.backendKind == model.BackendSenseVoice {
      return senseVoiceReleaseTailDelay
@@ -327,6 +379,10 @@
   return e.hwInfo
}
func (e *xasrStreamingEngine) Provider() string {
   return e.provider
}
func (e *xasrStreamingEngine) ReleaseTailCaptureDelay() time.Duration {
   return xasrReleaseTailDelay
}