From 4e7591ebb1294f611e7b85082be55313dd53820f Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Wed, 03 Jun 2026 13:25:19 +0800
Subject: [PATCH] Implement Round 3 Moonshine English model

---
 privatevoice.src/internal/engine/engine_darwin.go |   44 ++++++++++++++++++++++++++++++++++----------
 1 files changed, 34 insertions(+), 10 deletions(-)

diff --git a/privatevoice.src/internal/engine/engine_darwin.go b/privatevoice.src/internal/engine/engine_darwin.go
index 7a7f9c1..7e5b70f 100755
--- a/privatevoice.src/internal/engine/engine_darwin.go
+++ b/privatevoice.src/internal/engine/engine_darwin.go
@@ -17,22 +17,21 @@
 }
 
 func newPlatformEngine(resolved model.ResolvedModel) (Engine, error) {
+	if !isSupportedBackend(resolved.BackendKind) {
+		return nil, fmt.Errorf("unsupported backend kind: %s", resolved.BackendKind)
+	}
+
 	providers := darwinProviders(resolved.ProviderOrder)
 
 	for _, p := range providers {
-		config := sherpa.OfflineRecognizerConfig{}
-		config.FeatConfig.SampleRate = 16000
-		config.FeatConfig.FeatureDim = 80
-		config.ModelConfig.SenseVoice.Model = resolved.Files["model"]
-		config.ModelConfig.SenseVoice.UseInverseTextNormalization = 1
-		config.ModelConfig.Tokens = resolved.Files["tokens"]
-		config.ModelConfig.NumThreads = resolved.Profile.NumThreads
-		config.ModelConfig.Provider = p.provider
-		config.DecodingMethod = "greedy_search"
+		config, err := offlineConfigForResolvedModel(resolved, p.provider)
+		if err != nil {
+			return nil, err
+		}
 
 		recognizer := sherpa.NewOfflineRecognizer(&config)
 		if recognizer != nil {
-			info := fmt.Sprintf("SenseVoice · %s", p.name)
+			info := fmt.Sprintf("%s · %s", resolved.Profile.DisplayName, p.name)
 			logger.Info("Engine initialized: %s", info)
 			return &sherpaEngine{
 				recognizer: recognizer,
@@ -45,6 +44,31 @@
 	return nil, fmt.Errorf("failed to initialize sherpa-onnx with any provider")
 }
 
+func offlineConfigForResolvedModel(resolved model.ResolvedModel, provider string) (sherpa.OfflineRecognizerConfig, error) {
+	config := sherpa.OfflineRecognizerConfig{}
+	config.FeatConfig.SampleRate = 16000
+	config.FeatConfig.FeatureDim = 80
+	config.ModelConfig.Tokens = resolved.Files["tokens"]
+	config.ModelConfig.NumThreads = resolved.Profile.NumThreads
+	config.ModelConfig.Provider = provider
+	config.DecodingMethod = "greedy_search"
+
+	switch resolved.BackendKind {
+	case model.BackendSenseVoice:
+		config.ModelConfig.SenseVoice.Model = resolved.Files["model"]
+		config.ModelConfig.SenseVoice.UseInverseTextNormalization = 1
+	case model.BackendMoonshine:
+		config.ModelConfig.Moonshine.Preprocessor = resolved.Files["preprocessor"]
+		config.ModelConfig.Moonshine.Encoder = resolved.Files["encoder"]
+		config.ModelConfig.Moonshine.UncachedDecoder = resolved.Files["uncached_decoder"]
+		config.ModelConfig.Moonshine.CachedDecoder = resolved.Files["cached_decoder"]
+	default:
+		return sherpa.OfflineRecognizerConfig{}, fmt.Errorf("unsupported backend kind: %s", resolved.BackendKind)
+	}
+
+	return config, nil
+}
+
 func darwinProviders(providerOrder []string) []struct {
 	name     string
 	provider string

--
Gitblit v1.9.3