From 0ffbf1935c9d091cce22a5583275ac0902f7a693 Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Thu, 02 Jul 2026 03:04:51 +0800
Subject: [PATCH] Add Cantonese language model support

---
 privatevoice.src/internal/model/registry.go |   41 +++++++++++++++++++++++++++++++++++++++++
 1 files changed, 41 insertions(+), 0 deletions(-)

diff --git a/privatevoice.src/internal/model/registry.go b/privatevoice.src/internal/model/registry.go
index 5da545f..641adc4 100644
--- a/privatevoice.src/internal/model/registry.go
+++ b/privatevoice.src/internal/model/registry.go
@@ -16,6 +16,7 @@
 
 var languageProfileOrder = []string{
 	DefaultLanguageID,
+	CantoneseLanguageID,
 	EnglishLanguageID,
 	FrenchLanguageID,
 	GermanLanguageID,
@@ -355,6 +356,35 @@
 		ProviderOrder: []string{"cpu"},
 		NumThreads:    1,
 	},
+	SenseVoiceYueModelID: {
+		ID:                   SenseVoiceYueModelID,
+		DisplayName:          "SenseVoice Yue",
+		BackendKind:          BackendSenseVoice,
+		Tier:                 "default",
+		SupportedLanguageIDs: []string{CantoneseLanguageID},
+		RecommendedFor:       []string{CantoneseLanguageID},
+		Description:          "粤语专项离线模型,基于 SenseVoice 并使用粤语数据增强。",
+		ApproxSize:           "约 226 MiB 模型文件;下载包大小以实际 HTTP HEAD 为准",
+		LanguageParam:        "yue",
+		DownloadURLs: []string{
+			"https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-int8-2025-09-09.tar.bz2",
+		},
+		InstallDirName: "sensevoice-yue-2025-09-09",
+		RequiredFiles: []RequiredFileRule{
+			{
+				Role:     "model",
+				AllOf:    []string{"model.int8.onnx"},
+				Required: true,
+			},
+			{
+				Role:     "tokens",
+				AllOf:    []string{"tokens.txt"},
+				Required: true,
+			},
+		},
+		ProviderOrder: []string{"coreml", "cpu"},
+		NumThreads:    4,
+	},
 }
 
 var languageProfiles = map[string]LanguageProfile{
@@ -366,6 +396,14 @@
 		SystemMatchers:  []string{"zh", "zh-CN", "zh-Hans", "zh-Hant"},
 		DefaultModelID:  DefaultModelID,
 		UpgradeModelIDs: []string{Qwen3ASRModelID, XASRZhEn960ModelID},
+	},
+	CantoneseLanguageID: {
+		ID:             CantoneseLanguageID,
+		DisplayName:    "Cantonese",
+		NativeName:     "粤语",
+		UILocale:       "zh",
+		SystemMatchers: []string{"yue", "yue-HK"},
+		DefaultModelID: SenseVoiceYueModelID,
 	},
 	EnglishLanguageID: {
 		ID:              EnglishLanguageID,
@@ -507,6 +545,9 @@
 }
 
 func NormalizeLanguageID(id string) string {
+	if id == "yue" {
+		return CantoneseLanguageID
+	}
 	if _, err := GetLanguageProfile(id); err != nil {
 		return DefaultLanguageID
 	}

--
Gitblit v1.9.3