Spaces:
Runtime error
Runtime error
Upload folder using huggingface_hub
Browse files- app.py +35 -28
- assets/audios/Welcome1.wav +0 -0
- assets/audios/Welcome2.wav +0 -0
- assets/audios/Welcome3.wav +0 -0
- assets/audios/Welcome4.wav +0 -0
- assets/audios/Welcome5.wav +0 -0
- assets/audios/Welcome6.wav +0 -0
- assets/audios/Welcome7.wav +0 -0
- css/style.css +13 -0
app.py
CHANGED
@@ -1,3 +1,4 @@
|
|
|
|
1 |
import nltk
|
2 |
import ssl
|
3 |
|
@@ -27,11 +28,9 @@ device = config.webui_config.device
|
|
27 |
if device == "mps":
|
28 |
os.environ["PYTORCH_ENABLE_MPS_FALLBACK"] = "1"
|
29 |
|
30 |
-
|
31 |
def speak_fn(
|
32 |
text: str,
|
33 |
exceed_flag,
|
34 |
-
bubble_text,
|
35 |
speaker="TalkFlower_CNzh",
|
36 |
sdp_ratio=0.2, # SDP/DP混合比
|
37 |
noise_scale=0.6, # 感情
|
@@ -45,11 +44,12 @@ def speak_fn(
|
|
45 |
text = text.replace("\n\n", "\n")
|
46 |
if len(text) > 100:
|
47 |
print(f"Too Long Text: {text}")
|
48 |
-
gr.Warning("Too long! No more than 100 characters. 一口气不要超过 100 个字,憋坏我了。")
|
49 |
if exceed_flag:
|
50 |
-
|
|
|
51 |
else:
|
52 |
-
|
|
|
53 |
audio_list = []
|
54 |
if len(text) > 42:
|
55 |
print(f"Long Text: {text}")
|
@@ -74,13 +74,9 @@ def speak_fn(
|
|
74 |
silence = np.zeros((int)(44100 * interval_between_sent))
|
75 |
audio_list_sent.append(silence)
|
76 |
if (interval_between_para - interval_between_sent) > 0:
|
77 |
-
silence = np.zeros(
|
78 |
-
(int)(44100 * (interval_between_para - interval_between_sent))
|
79 |
-
)
|
80 |
audio_list_sent.append(silence)
|
81 |
-
audio16bit = gr.processing_utils.convert_to_16_bit_wav(
|
82 |
-
np.concatenate(audio_list_sent)
|
83 |
-
) # 对完整句子做音量归一
|
84 |
audio_list.append(audio16bit)
|
85 |
else:
|
86 |
print(f"Short Text: {text}")
|
@@ -104,17 +100,29 @@ def speak_fn(
|
|
104 |
audio_list.append(silence) # 将静音添加到列表中
|
105 |
|
106 |
audio_concat = np.concatenate(audio_list)
|
107 |
-
return (hps.data.sampling_rate, audio_concat), exceed_flag,
|
108 |
|
109 |
|
110 |
-
def
|
111 |
-
return gr.update(
|
112 |
|
113 |
|
114 |
def init_fn():
|
115 |
-
gr.Info("2023-11-23: 有什么建议可以在 Community 中提哦。")
|
116 |
gr.Info("2023-11-24: 优化长句生成效果;增加示例;更新了一些小彩蛋;画了一些大饼)")
|
117 |
-
gr.Info("Only support Chinese now. Trying to train a mutilingual model.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
118 |
|
119 |
|
120 |
with open("./css/style.css", "r", encoding="utf-8") as f:
|
@@ -122,8 +130,8 @@ with open("./css/style.css", "r", encoding="utf-8") as f:
|
|
122 |
|
123 |
with gr.Blocks(css=customCSS) as demo:
|
124 |
exceed_flag = gr.State(value=False)
|
125 |
-
bubble_text = gr.State(value="
|
126 |
-
character_area = gr.HTML(get_character_html("
|
127 |
with gr.Tab("Speak", elem_id="tab-speak"):
|
128 |
speak_input = gr.Textbox(lines=1, label="Talking Flower will say:", elem_classes="wonder-card", elem_id="input_text")
|
129 |
speak_button = gr.Button("Speak!", elem_id="speak_button", elem_classes="main-button wonder-card")
|
@@ -136,22 +144,21 @@ with gr.Blocks(css=customCSS) as demo:
|
|
136 |
mimic_button = gr.Button("Mimic!", elem_id="mimic_button", elem_classes="main-button wonder-card")
|
137 |
audio_output = gr.Audio(label="输出音频", show_label=False, autoplay=True, elem_id="audio_output", elem_classes="wonder-card")
|
138 |
|
139 |
-
|
140 |
demo.load(
|
141 |
init_fn,
|
142 |
inputs=[],
|
143 |
-
outputs=[]
|
144 |
)
|
145 |
-
speak_input.submit(
|
146 |
speak_fn,
|
147 |
-
inputs=[speak_input, exceed_flag
|
148 |
-
outputs=[audio_output, exceed_flag,
|
149 |
-
)
|
150 |
-
speak_button.click(
|
151 |
speak_fn,
|
152 |
-
inputs=[speak_input, exceed_flag
|
153 |
-
outputs=[audio_output, exceed_flag,
|
154 |
-
)
|
155 |
|
156 |
|
157 |
if __name__ == "__main__":
|
|
|
1 |
+
import random
|
2 |
import nltk
|
3 |
import ssl
|
4 |
|
|
|
28 |
if device == "mps":
|
29 |
os.environ["PYTORCH_ENABLE_MPS_FALLBACK"] = "1"
|
30 |
|
|
|
31 |
def speak_fn(
|
32 |
text: str,
|
33 |
exceed_flag,
|
|
|
34 |
speaker="TalkFlower_CNzh",
|
35 |
sdp_ratio=0.2, # SDP/DP混合比
|
36 |
noise_scale=0.6, # 感情
|
|
|
44 |
text = text.replace("\n\n", "\n")
|
45 |
if len(text) > 100:
|
46 |
print(f"Too Long Text: {text}")
|
|
|
47 |
if exceed_flag:
|
48 |
+
text = "不要超过100字!"
|
49 |
+
return gr.update(value="./assets/audios/nomorethan100.wav"), get_character_html(text), False, gr.update(interactive=True)
|
50 |
else:
|
51 |
+
text = "这句太长了,憋坏我啦!"
|
52 |
+
return gr.update(value="./assets/audios/overlength.wav"), get_character_html(text), True, gr.update(interactive=True)
|
53 |
audio_list = []
|
54 |
if len(text) > 42:
|
55 |
print(f"Long Text: {text}")
|
|
|
74 |
silence = np.zeros((int)(44100 * interval_between_sent))
|
75 |
audio_list_sent.append(silence)
|
76 |
if (interval_between_para - interval_between_sent) > 0:
|
77 |
+
silence = np.zeros((int)(44100 * (interval_between_para - interval_between_sent)))
|
|
|
|
|
78 |
audio_list_sent.append(silence)
|
79 |
+
audio16bit = gr.processing_utils.convert_to_16_bit_wav(np.concatenate(audio_list_sent)) # 对完整句子做音量归一
|
|
|
|
|
80 |
audio_list.append(audio16bit)
|
81 |
else:
|
82 |
print(f"Short Text: {text}")
|
|
|
100 |
audio_list.append(silence) # 将静音添加到列表中
|
101 |
|
102 |
audio_concat = np.concatenate(audio_list)
|
103 |
+
return (hps.data.sampling_rate, audio_concat), get_character_html(text), exceed_flag, gr.update(interactive=True)
|
104 |
|
105 |
|
106 |
+
def submit_lock_fn():
|
107 |
+
return gr.update(interactive=False)
|
108 |
|
109 |
|
110 |
def init_fn():
|
|
|
111 |
gr.Info("2023-11-24: 优化长句生成效果;增加示例;更新了一些小彩蛋;画了一些大饼)")
|
112 |
+
gr.Info("Only support Chinese now. Trying to train a mutilingual model. 欢迎在 Community 中提建议~")
|
113 |
+
|
114 |
+
index = random.randint(1,7)
|
115 |
+
welcome_dict = {
|
116 |
+
1: "哇!你来找我玩啦!",
|
117 |
+
2: "你好呀!",
|
118 |
+
3: "哇!你来啦~",
|
119 |
+
4: "真高兴见到你!",
|
120 |
+
5: "我一朵花好无聊啊!",
|
121 |
+
6: "欢迎你!",
|
122 |
+
7: "来找我玩啦!",
|
123 |
+
}
|
124 |
+
|
125 |
+
return gr.update(value=f"./assets/audios/Welcome{index}.wav"), get_character_html(welcome_dict[index])
|
126 |
|
127 |
|
128 |
with open("./css/style.css", "r", encoding="utf-8") as f:
|
|
|
130 |
|
131 |
with gr.Blocks(css=customCSS) as demo:
|
132 |
exceed_flag = gr.State(value=False)
|
133 |
+
bubble_text = gr.State(value="感谢你来找我玩!")
|
134 |
+
character_area = gr.HTML(get_character_html("感谢你来找我玩!"), elem_id="character_area")
|
135 |
with gr.Tab("Speak", elem_id="tab-speak"):
|
136 |
speak_input = gr.Textbox(lines=1, label="Talking Flower will say:", elem_classes="wonder-card", elem_id="input_text")
|
137 |
speak_button = gr.Button("Speak!", elem_id="speak_button", elem_classes="main-button wonder-card")
|
|
|
144 |
mimic_button = gr.Button("Mimic!", elem_id="mimic_button", elem_classes="main-button wonder-card")
|
145 |
audio_output = gr.Audio(label="输出音频", show_label=False, autoplay=True, elem_id="audio_output", elem_classes="wonder-card")
|
146 |
|
|
|
147 |
demo.load(
|
148 |
init_fn,
|
149 |
inputs=[],
|
150 |
+
outputs=[audio_output, character_area]
|
151 |
)
|
152 |
+
speak_input.submit(submit_lock_fn, show_progress=False).then(
|
153 |
speak_fn,
|
154 |
+
inputs=[speak_input, exceed_flag],
|
155 |
+
outputs=[audio_output, character_area, exceed_flag, speak_button],
|
156 |
+
)
|
157 |
+
speak_button.click(submit_lock_fn, show_progress=False).then(
|
158 |
speak_fn,
|
159 |
+
inputs=[speak_input, exceed_flag],
|
160 |
+
outputs=[audio_output, character_area, exceed_flag, speak_button],
|
161 |
+
)
|
162 |
|
163 |
|
164 |
if __name__ == "__main__":
|
assets/audios/Welcome1.wav
ADDED
Binary file (222 kB). View file
|
|
assets/audios/Welcome2.wav
ADDED
Binary file (113 kB). View file
|
|
assets/audios/Welcome3.wav
ADDED
Binary file (174 kB). View file
|
|
assets/audios/Welcome4.wav
ADDED
Binary file (155 kB). View file
|
|
assets/audios/Welcome5.wav
ADDED
Binary file (184 kB). View file
|
|
assets/audios/Welcome6.wav
ADDED
Binary file (109 kB). View file
|
|
assets/audios/Welcome7.wav
ADDED
Binary file (149 kB). View file
|
|
css/style.css
CHANGED
@@ -67,6 +67,12 @@ gradio-app {
|
|
67 |
width: var(--card-width) !important;
|
68 |
align-self: center;
|
69 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
70 |
.character {
|
71 |
display: flex;
|
72 |
flex-direction: row;
|
@@ -191,6 +197,9 @@ gradio-app {
|
|
191 |
#input_text label textarea {
|
192 |
width: 80%;
|
193 |
}
|
|
|
|
|
|
|
194 |
#input_text {
|
195 |
display: flex;
|
196 |
background: #ffffff !important;
|
@@ -231,6 +240,10 @@ gradio-app {
|
|
231 |
|
232 |
transform: translate(-2px,-2px) !important;
|
233 |
}
|
|
|
|
|
|
|
|
|
234 |
#speak_button {
|
235 |
background: var(--color-yellow) !important;
|
236 |
color: var(--color-accent-black) !important;
|
|
|
67 |
width: var(--card-width) !important;
|
68 |
align-self: center;
|
69 |
}
|
70 |
+
#character_area .pending {
|
71 |
+
opacity: 1 !important;
|
72 |
+
}
|
73 |
+
#character_area div.wrap {
|
74 |
+
display: none;
|
75 |
+
}
|
76 |
.character {
|
77 |
display: flex;
|
78 |
flex-direction: row;
|
|
|
197 |
#input_text label textarea {
|
198 |
width: 80%;
|
199 |
}
|
200 |
+
#input_text div.wrap {
|
201 |
+
display: none;
|
202 |
+
}
|
203 |
#input_text {
|
204 |
display: flex;
|
205 |
background: #ffffff !important;
|
|
|
240 |
|
241 |
transform: translate(-2px,-2px) !important;
|
242 |
}
|
243 |
+
.main-button:disabled,
|
244 |
+
.main-button[disabled]{
|
245 |
+
opacity: 100% !important;
|
246 |
+
}
|
247 |
#speak_button {
|
248 |
background: var(--color-yellow) !important;
|
249 |
color: var(--color-accent-black) !important;
|