21
21
custom_path : Optional [str ] = None
22
22
23
23
has_interrupted = False
24
+ is_in_generate = False
25
+
26
+ seed_min = 1
27
+ seed_max = 4294967295
24
28
25
29
# 音色选项:用于预置合适的音色
26
30
voices = {
38
42
39
43
40
44
def generate_seed ():
41
- return gr .update (value = random .randint (1 , 100000000 ))
45
+ return gr .update (value = random .randint (seed_min , seed_max ))
42
46
43
47
44
48
# 返回选择音色对应的seed
45
49
def on_voice_change (vocie_selection ):
46
50
return voices .get (vocie_selection )["seed" ]
47
51
52
+ def on_audio_seed_change (audio_seed_input ):
53
+ with TorchSeedContext (audio_seed_input ):
54
+ rand_spk = chat .sample_random_speaker ()
55
+ return rand_spk
56
+
48
57
49
58
def load_chat (cust_path : Optional [str ], coef : Optional [str ]) -> bool :
50
59
if cust_path == None :
@@ -79,6 +88,12 @@ def load_chat(cust_path: Optional[str], coef: Optional[str]) -> bool:
79
88
80
89
81
90
def reload_chat (coef : Optional [str ]) -> str :
91
+ global is_in_generate
92
+
93
+ if is_in_generate :
94
+ gr .Warning ("Cannot reload when generating!" )
95
+ return coef
96
+
82
97
chat .unload ()
83
98
gr .Info ("Model unloaded." )
84
99
if len (coef ) != 230 :
@@ -119,37 +134,33 @@ def refine_text(
119
134
120
135
return text [0 ] if isinstance (text , list ) else text
121
136
122
- def generate_audio (text , temperature , top_P , top_K , audio_seed_input , stream ):
137
+ def generate_audio (text , temperature , top_P , top_K , spk_emb_text : str , stream ):
123
138
global chat , has_interrupted
124
139
125
- if not text or has_interrupted :
140
+ if not text or has_interrupted or not spk_emb_text . startswith ( "蘁淰" ) :
126
141
return None
127
142
128
- with TorchSeedContext (audio_seed_input ):
129
- rand_spk = chat .sample_random_speaker ()
130
-
131
143
params_infer_code = ChatTTS .Chat .InferCodeParams (
132
- spk_emb = rand_spk ,
144
+ spk_emb = spk_emb_text ,
133
145
temperature = temperature ,
134
146
top_P = top_P ,
135
147
top_K = top_K ,
136
148
)
137
149
138
- with TorchSeedContext (audio_seed_input ):
139
- wav = chat .infer (
140
- text ,
141
- skip_refine_text = True ,
142
- params_infer_code = params_infer_code ,
143
- stream = stream ,
144
- )
145
- if stream :
146
- for gen in wav :
147
- audio = gen [0 ]
148
- if audio is not None and len (audio ) > 0 :
149
- yield wav_arr_to_mp3_view (audio [0 ]).tobytes ()
150
- del audio
151
- else :
152
- yield wav_arr_to_mp3_view (np .array (wav [0 ]).flatten ()).tobytes ()
150
+ wav = chat .infer (
151
+ text ,
152
+ skip_refine_text = True ,
153
+ params_infer_code = params_infer_code ,
154
+ stream = stream ,
155
+ )
156
+ if stream :
157
+ for gen in wav :
158
+ audio = gen [0 ]
159
+ if audio is not None and len (audio ) > 0 :
160
+ yield wav_arr_to_mp3_view (audio [0 ]).tobytes ()
161
+ del audio
162
+ else :
163
+ yield wav_arr_to_mp3_view (np .array (wav [0 ]).flatten ()).tobytes ()
153
164
154
165
155
166
def interrupt_generate ():
@@ -159,17 +170,20 @@ def interrupt_generate():
159
170
chat .interrupt ()
160
171
161
172
def set_buttons_before_generate (generate_button , interrupt_button ):
162
- global has_interrupted
173
+ global has_interrupted , is_in_generate
163
174
164
175
has_interrupted = False
176
+ is_in_generate = True
165
177
166
178
return _set_generate_buttons (
167
179
generate_button ,
168
180
interrupt_button ,
169
181
)
170
182
171
183
def set_buttons_after_generate (generate_button , interrupt_button , audio_output ):
172
- global has_interrupted
184
+ global has_interrupted , is_in_generate
185
+
186
+ is_in_generate = False
173
187
174
188
return _set_generate_buttons (
175
189
generate_button ,
0 commit comments