Skip to content

Commit 940917b

Browse files
committed
[TASK] Save and load tts specific settings
1 parent 1e86bd1 commit 940917b

File tree

4 files changed

+228
-54
lines changed

4 files changed

+228
-54
lines changed
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
package SpecialTextToSpeechSettings
2+
3+
import (
4+
"reflect"
5+
"strconv"
6+
"whispering-tiger-ui/SendMessageChannel"
7+
"whispering-tiger-ui/Settings"
8+
)
9+
10+
func UpdateSpecialTTSSettings(specialSettingType string, stringName string, value interface{}) {
11+
// Ensure outer map exists
12+
if Settings.Config.Special_settings == nil {
13+
Settings.Config.Special_settings = make(map[string]interface{})
14+
}
15+
16+
// Ensure inner map exists and has correct type
17+
inner, ok := Settings.Config.Special_settings[specialSettingType].(map[string]interface{})
18+
if !ok || inner == nil {
19+
inner = make(map[string]interface{})
20+
Settings.Config.Special_settings[specialSettingType] = inner
21+
}
22+
23+
// If the value is the same, do nothing (safe compare for non-comparable types)
24+
if old, exists := inner[stringName]; exists && reflect.DeepEqual(old, value) {
25+
return
26+
}
27+
28+
// Update and notify
29+
inner[stringName] = value
30+
31+
sendMessage := SendMessageChannel.SendMessageStruct{
32+
Type: "special_settings",
33+
Name: specialSettingType,
34+
Value: inner,
35+
}
36+
sendMessage.SendMessage()
37+
}
38+
39+
func GetSpecialTTSSettings(specialSettingType string, stringName string) interface{} {
40+
// Ensure outer map exists
41+
if Settings.Config.Special_settings == nil {
42+
Settings.Config.Special_settings = make(map[string]interface{})
43+
}
44+
45+
// Ensure inner map exists and has correct type
46+
inner, ok := Settings.Config.Special_settings[specialSettingType].(map[string]interface{})
47+
if !ok || inner == nil {
48+
inner = make(map[string]interface{})
49+
Settings.Config.Special_settings[specialSettingType] = inner
50+
}
51+
52+
// Return value if present
53+
if val, ok := inner[stringName]; ok {
54+
return val
55+
}
56+
return nil
57+
}
58+
59+
func GetSpecialSettingFallback(specialSettingType string, key string, fallback interface{}) interface{} {
60+
if Settings.Config.Special_settings == nil {
61+
return fallback
62+
}
63+
val, ok := Settings.Config.Special_settings[specialSettingType]
64+
if !ok || val == nil {
65+
return fallback
66+
}
67+
// Support both map[string]interface{} and map[interface{}]interface{} (e.g. YAML)
68+
var settingMap map[string]interface{}
69+
switch m := val.(type) {
70+
case map[string]interface{}:
71+
settingMap = m
72+
case map[interface{}]interface{}:
73+
settingMap = make(map[string]interface{}, len(m))
74+
for k, v := range m {
75+
ks, ok := k.(string)
76+
if !ok {
77+
continue
78+
}
79+
settingMap[ks] = v
80+
}
81+
default:
82+
return fallback
83+
}
84+
85+
raw, ok := settingMap[key]
86+
if !ok || raw == nil {
87+
return fallback
88+
}
89+
90+
// Coerce based on the fallback type to ensure safe return types.
91+
switch fb := fallback.(type) {
92+
case string:
93+
if s, ok := raw.(string); ok {
94+
return s
95+
}
96+
return fb
97+
case float64:
98+
switch r := raw.(type) {
99+
case float64:
100+
return r
101+
case float32:
102+
return float64(r)
103+
case int:
104+
return float64(r)
105+
case int64:
106+
return float64(r)
107+
case int32:
108+
return float64(r)
109+
case string:
110+
if f, err := strconv.ParseFloat(r, 64); err == nil {
111+
return f
112+
}
113+
return fb
114+
default:
115+
return fb
116+
}
117+
default:
118+
// Unknown target type, return fallback to be safe.
119+
return fallback
120+
}
121+
}

Pages/SpecialTextToSpeechSettings/KokoroSpecialSettings.go

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"fyne.io/fyne/v2/layout"
88
"fyne.io/fyne/v2/widget"
99
"whispering-tiger-ui/CustomWidget"
10-
"whispering-tiger-ui/SendMessageChannel"
1110
)
1211

1312
func BuildKokoroSpecialSettings() fyne.CanvasObject {
@@ -24,26 +23,43 @@ func BuildKokoroSpecialSettings() fyne.CanvasObject {
2423
{Text: "Chinese", Value: "z"},
2524
},
2625
func(option CustomWidget.TextValueOption) {
27-
2826
},
2927
0,
3028
)
3129

32-
languageSelect.SetSelected("a")
33-
34-
updateSpecialTTSSettings := func() {
35-
sendMessage := SendMessageChannel.SendMessageStruct{
36-
Type: "tts_setting_special",
37-
Value: struct {
38-
Language string `json:"language"`
39-
}{
40-
Language: languageSelect.GetSelected().Value,
41-
},
42-
}
43-
sendMessage.SendMessage()
30+
// check if Settings.Config.Special_settings has tts_language key
31+
//if val, ok := Settings.Config.Special_settings["tts_kokoro_language"]; ok {
32+
// languageSelect.SetSelected(val.(string))
33+
//} else {
34+
// languageSelect.SetSelected("a")
35+
//}
36+
37+
languageSetting := GetSpecialTTSSettings("tts_kokoro", "language")
38+
if languageSetting != nil {
39+
languageSelect.SetSelected(languageSetting.(string))
40+
} else {
41+
languageSelect.SetSelected("a")
42+
}
43+
44+
updateSpecialTTSSettingsKokoro := func() {
45+
languageSelection := languageSelect.GetSelected().Value
46+
47+
UpdateSpecialTTSSettings("tts_kokoro", "language", languageSelection)
48+
49+
//Settings.Config.Special_settings["tts_kokoro"].(map[string]interface{})["tts_kokoro_language"] = languageSelection
50+
//sendMessage := SendMessageChannel.SendMessageStruct{
51+
// Type: "special_settings",
52+
// Name: "tts_kokoro",
53+
// Value: struct {
54+
// TtsLanguage string `json:"language"`
55+
// }{
56+
// TtsLanguage: languageSelection,
57+
// },
58+
//}
59+
//sendMessage.SendMessage()
4460
}
4561
languageSelect.OnChanged = func(option CustomWidget.TextValueOption) {
46-
updateSpecialTTSSettings()
62+
updateSpecialTTSSettingsKokoro()
4763
}
4864

4965
advancedSettings := container.New(layout.NewVBoxLayout(),

Pages/SpecialTextToSpeechSettings/ZonosSpecialSettings.go

Lines changed: 75 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"fyne.io/fyne/v2/layout"
88
"fyne.io/fyne/v2/widget"
99
"whispering-tiger-ui/CustomWidget"
10-
"whispering-tiger-ui/SendMessageChannel"
1110
)
1211

1312
func BuildZonosSpecialSettings() fyne.CanvasObject {
@@ -129,35 +128,59 @@ func BuildZonosSpecialSettings() fyne.CanvasObject {
129128
0,
130129
)
131130

132-
languageSelect.SetSelected("en-us")
131+
// Load language with safe fallback
132+
language := GetSpecialSettingFallback("tts_zonos", "language", "en-us").(string)
133+
languageSelect.SetSelected(language)
133134

134135
seedInput := widget.NewEntry()
135136
seedInput.PlaceHolder = lang.L("Enter manual seed")
137+
// Load seed (optional)
138+
if seed := GetSpecialSettingFallback("tts_zonos", "seed", "").(string); seed != "" {
139+
seedInput.SetText(seed)
140+
}
141+
142+
// Clamp helper to keep values in [0,1]
143+
clamp01 := func(v float64) float64 {
144+
if v < 0 {
145+
return 0
146+
}
147+
if v > 1 {
148+
return 1
149+
}
150+
return v
151+
}
136152

137153
happinessSlider := widget.NewSlider(0.0, 1.0)
138154
happinessSlider.Step = 0.0001
139-
happinessSlider.SetValue(0.3077)
155+
happinessSlider.SetValue(clamp01(GetSpecialSettingFallback("tts_zonos", "happiness", 0.3077).(float64)))
156+
140157
sadnessSlider := widget.NewSlider(0.0, 1.0)
141158
sadnessSlider.Step = 0.0001
142-
sadnessSlider.SetValue(0.0256)
159+
sadnessSlider.SetValue(clamp01(GetSpecialSettingFallback("tts_zonos", "sadness", 0.0256).(float64)))
160+
143161
disgustSlider := widget.NewSlider(0.0, 1.0)
144162
disgustSlider.Step = 0.0001
145-
disgustSlider.SetValue(0.0256)
163+
disgustSlider.SetValue(clamp01(GetSpecialSettingFallback("tts_zonos", "disgust", 0.0256).(float64)))
164+
146165
fearSlider := widget.NewSlider(0.0, 1.0)
147166
fearSlider.Step = 0.0001
148-
fearSlider.SetValue(0.0256)
167+
fearSlider.SetValue(clamp01(GetSpecialSettingFallback("tts_zonos", "fear", 0.0256).(float64)))
168+
149169
surpriseSlider := widget.NewSlider(0.0, 1.0)
150170
surpriseSlider.Step = 0.0001
151-
surpriseSlider.SetValue(0.0256)
171+
surpriseSlider.SetValue(clamp01(GetSpecialSettingFallback("tts_zonos", "surprise", 0.0256).(float64)))
172+
152173
angerSlider := widget.NewSlider(0.0, 1.0)
153174
angerSlider.Step = 0.0001
154-
angerSlider.SetValue(0.0256)
175+
angerSlider.SetValue(clamp01(GetSpecialSettingFallback("tts_zonos", "anger", 0.0256).(float64)))
176+
155177
otherSlider := widget.NewSlider(0.0, 1.0)
156178
otherSlider.Step = 0.0001
157-
otherSlider.SetValue(0.2564)
179+
otherSlider.SetValue(clamp01(GetSpecialSettingFallback("tts_zonos", "other", 0.2564).(float64)))
180+
158181
neutralSlider := widget.NewSlider(0.0, 1.0)
159182
neutralSlider.Step = 0.0001
160-
neutralSlider.SetValue(0.3077)
183+
neutralSlider.SetValue(clamp01(GetSpecialSettingFallback("tts_zonos", "neutral", 0.3077).(float64)))
161184

162185
// ignore list checkboxes
163186
emotionCheck := widget.NewCheck("", func(b bool) {})
@@ -200,35 +223,48 @@ func BuildZonosSpecialSettings() fyne.CanvasObject {
200223
ignoreList = []string{}
201224
}
202225

203-
sendMessage := SendMessageChannel.SendMessageStruct{
204-
Type: "tts_setting_special",
205-
Value: struct {
206-
Language string `json:"language"`
207-
Seed string `json:"seed"`
208-
Happiness float64 `json:"happiness"`
209-
Sadness float64 `json:"sadness"`
210-
Disgust float64 `json:"disgust"`
211-
Fear float64 `json:"fear"`
212-
Surprise float64 `json:"surprise"`
213-
Anger float64 `json:"anger"`
214-
Other float64 `json:"other"`
215-
Neutral float64 `json:"neutral"`
216-
IgnoreList []string `json:"ignore_list"`
217-
}{
218-
Language: languageSelect.GetSelected().Value,
219-
Seed: seedInput.Text,
220-
Happiness: happinessSlider.Value,
221-
Sadness: sadnessSlider.Value,
222-
Disgust: disgustSlider.Value,
223-
Fear: fearSlider.Value,
224-
Surprise: surpriseSlider.Value,
225-
Anger: angerSlider.Value,
226-
Other: otherSlider.Value,
227-
Neutral: neutralSlider.Value,
228-
IgnoreList: ignoreList,
229-
},
230-
}
231-
sendMessage.SendMessage()
226+
UpdateSpecialTTSSettings("tts_zonos", "language", languageSelect.GetSelected().Value)
227+
UpdateSpecialTTSSettings("tts_zonos", "seed", seedInput.Text)
228+
UpdateSpecialTTSSettings("tts_zonos", "happiness", happinessSlider.Value)
229+
UpdateSpecialTTSSettings("tts_zonos", "sadness", sadnessSlider.Value)
230+
UpdateSpecialTTSSettings("tts_zonos", "disgust", disgustSlider.Value)
231+
UpdateSpecialTTSSettings("tts_zonos", "fear", fearSlider.Value)
232+
UpdateSpecialTTSSettings("tts_zonos", "surprise", surpriseSlider.Value)
233+
UpdateSpecialTTSSettings("tts_zonos", "anger", angerSlider.Value)
234+
UpdateSpecialTTSSettings("tts_zonos", "other", otherSlider.Value)
235+
UpdateSpecialTTSSettings("tts_zonos", "neutral", neutralSlider.Value)
236+
UpdateSpecialTTSSettings("tts_zonos", "ignore_list", ignoreList)
237+
238+
//sendMessage := SendMessageChannel.SendMessageStruct{
239+
// Type: "special_settings",
240+
// Name: "tts_zonos",
241+
// Value: struct {
242+
// Language string `json:"language"`
243+
// Seed string `json:"seed"`
244+
// Happiness float64 `json:"happiness"`
245+
// Sadness float64 `json:"sadness"`
246+
// Disgust float64 `json:"disgust"`
247+
// Fear float64 `json:"fear"`
248+
// Surprise float64 `json:"surprise"`
249+
// Anger float64 `json:"anger"`
250+
// Other float64 `json:"other"`
251+
// Neutral float64 `json:"neutral"`
252+
// IgnoreList []string `json:"ignore_list"`
253+
// }{
254+
// Language: languageSelect.GetSelected().Value,
255+
// Seed: seedInput.Text,
256+
// Happiness: happinessSlider.Value,
257+
// Sadness: sadnessSlider.Value,
258+
// Disgust: disgustSlider.Value,
259+
// Fear: fearSlider.Value,
260+
// Surprise: surpriseSlider.Value,
261+
// Anger: angerSlider.Value,
262+
// Other: otherSlider.Value,
263+
// Neutral: neutralSlider.Value,
264+
// IgnoreList: ignoreList,
265+
// },
266+
//}
267+
//sendMessage.SendMessage()
232268
}
233269
languageSelect.OnChanged = func(option CustomWidget.TextValueOption) {
234270
updateSpecialTTSSettings()

Settings/settings.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ type Conf struct {
212212

213213
// others
214214
Last_auto_txt_translate_lang string
215+
Special_settings map[string]interface{} `yaml:"special_settings,omitempty" json:"special_settings,omitempty"`
215216
}
216217

217218
var ConfigValues map[string]interface{} = nil

0 commit comments

Comments
 (0)