Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -1,272 +1,273 @@
|
|
1 |
-
# CUDA_VISIBLE_DEVICES=7 python app.py
|
2 |
-
import gradio as gr
|
3 |
-
import os
|
4 |
-
import random
|
5 |
-
from datetime import datetime
|
6 |
-
import string
|
7 |
-
import json
|
8 |
-
import theme
|
9 |
-
import logging
|
10 |
-
from argparse import ArgumentParser
|
11 |
-
from datetime import datetime
|
12 |
-
from fractions import Fraction
|
13 |
-
from pathlib import Path
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
<a href=""
|
36 |
-
<a href=""
|
37 |
-
<a href=""
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
-
|
241 |
-
|
242 |
-
|
243 |
-
|
244 |
-
|
245 |
-
|
246 |
-
|
247 |
-
|
248 |
-
|
249 |
-
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
-
|
264 |
-
|
265 |
-
|
266 |
-
|
267 |
-
|
268 |
-
|
269 |
-
|
270 |
-
|
271 |
-
|
|
|
272 |
battle_page.queue().launch(enable_monitoring=True)
|
|
|
1 |
+
# CUDA_VISIBLE_DEVICES=7 python app.py
|
2 |
+
import gradio as gr
|
3 |
+
import os
|
4 |
+
import random
|
5 |
+
from datetime import datetime
|
6 |
+
import string
|
7 |
+
import json
|
8 |
+
import theme
|
9 |
+
import logging
|
10 |
+
from argparse import ArgumentParser
|
11 |
+
from datetime import datetime
|
12 |
+
from fractions import Fraction
|
13 |
+
from pathlib import Path
|
14 |
+
|
15 |
+
os.system("pip install gradio==4.44.1")
|
16 |
+
|
17 |
+
# 设置环境变量
|
18 |
+
os.environ["no_proxy"] = "localhost,127.0.0.1,::1"
|
19 |
+
|
20 |
+
# 设置参数
|
21 |
+
style = theme.Style()
|
22 |
+
|
23 |
+
def toggle_audio_options(enable_audio):
|
24 |
+
return gr.update(visible=enable_audio)
|
25 |
+
|
26 |
+
def toggle_speech_options(enable_speech):
|
27 |
+
return gr.update(visible=enable_speech)
|
28 |
+
|
29 |
+
with gr.Blocks(theme=style) as battle_page:
|
30 |
+
gr.Markdown("""
|
31 |
+
<div style="text-align: center; font-size: 32px; font-weight: bold; margin-bottom: 20px;">
|
32 |
+
Medical Sora Demo Space🤗
|
33 |
+
</div>
|
34 |
+
<div style="text-align: center;">
|
35 |
+
<a href="">📜 arxiv </a> |
|
36 |
+
<a href="">🤗 Model Hub</a> |
|
37 |
+
<a href="">🌐 Github</a> |
|
38 |
+
<a href="">📦 Dataset</a>
|
39 |
+
</div>
|
40 |
+
<div style="text-align: center; font-size: 15px; font-weight: bold; color: red; margin-bottom: 20px;">
|
41 |
+
⚠️ This demo is for academic research and experiential use only.
|
42 |
+
</div>
|
43 |
+
""")
|
44 |
+
|
45 |
+
title_markdown = """
|
46 |
+
## 📃How to use it?
|
47 |
+
|
48 |
+
<div style="display: flex; justify-content: left; align-items: flex-start; text-align: left; background: linear-gradient(45deg, rgba(220,220,220, 1), rgba(255,255,255, 1)); border-radius: 10px; box-shadow: 0 8px 16px 0 rgba(0,0,0,0.1); padding: 20px;">
|
49 |
+
<div>
|
50 |
+
<ul>
|
51 |
+
<p style="color: black; font-weight: bold; margin-top: 10px;">
|
52 |
+
<li>Inter your prompt and adjust the parameters for generating the video.</li>
|
53 |
+
</p>
|
54 |
+
<p style="color: black; font-weight: bold; margin-bottom: 0;">
|
55 |
+
<li>Click <strong>"Add Synchronized Audio"</strong> to add background sound to the generated video.</li>
|
56 |
+
</p>
|
57 |
+
<p style="color: black; font-weight: bold; margin-bottom: 0;">
|
58 |
+
<li>Click <strong>"Add Speech Synthesis"</strong> to add spoken language descriptions to the generated video.</li>
|
59 |
+
</p>
|
60 |
+
</ul>
|
61 |
+
</div>
|
62 |
+
</div>
|
63 |
+
"""
|
64 |
+
gr.Markdown(title_markdown)
|
65 |
+
|
66 |
+
with gr.Row():
|
67 |
+
with gr.Column():
|
68 |
+
prompt = gr.Textbox(label="Prompt", placeholder="Enter your prompt here", lines=5)
|
69 |
+
with gr.Row():
|
70 |
+
gr.Markdown(
|
71 |
+
"✨Upon pressing the enhanced prompt button, we will use `GLM-4-Flash` model to polish the prompt and overwrite the original one.",
|
72 |
+
)
|
73 |
+
enhance_button = gr.Button("✨ Enhance EN Prompt (Optional)", scale=1)
|
74 |
+
enhance_button_zh = gr.Button("✨ Enhance ZH Prompt (Optional)", scale=1)
|
75 |
+
with gr.Row():
|
76 |
+
hunyuan_video_height = gr.Number(value=320, label="Height")
|
77 |
+
hunyuan_video_width = gr.Number(value=512, label="Width")
|
78 |
+
with gr.Row():
|
79 |
+
hunyuan_video_num_frames = gr.Number(value=61, label="Num Frames")
|
80 |
+
hunyuan_video_num_inference_steps = gr.Number(value=6, label="Num Inference Steps")
|
81 |
+
hunyuan_video_fps = gr.Number(value=15, label="FPS")
|
82 |
+
with gr.Accordion("Add Synchronized Audio", open=False):
|
83 |
+
enable_audio = gr.Checkbox(label="Add Synchronized Audio", value=False)
|
84 |
+
with gr.Column(visible=False) as audio_options:
|
85 |
+
with gr.Row():
|
86 |
+
mmaudio_positive_prompt = gr.Text(label='Positive prompt', placeholder="To help generate more accurate synchronized audio, optional.", value='', scale=2)
|
87 |
+
gen_positive_button = gr.Button("✨ Generate Positive Prompt(Optional)", scale=1)
|
88 |
+
mmaudio_negative_prompt = gr.Text(label='Negative prompt', placeholder="To help generate more accurate synchronized audio, optional.", value='')
|
89 |
+
mmaudio_seed = gr.Slider(label='Seed', value=0, minimum=-1)
|
90 |
+
mmaudio_num_steps = gr.Slider(label='Num steps', value=25, minimum=1)
|
91 |
+
mmaudio_guidance_strength = gr.Slider(label='Guidance Strength', value=4.5, minimum=1)
|
92 |
+
mmaudio_duration = gr.Slider(label='Duration (sec)', value=8, minimum=1)
|
93 |
+
with gr.Accordion("Add Speech Synthesis", open=False):
|
94 |
+
enable_speech = gr.Checkbox(label="Add Speech Synthesis", value=False)
|
95 |
+
with gr.Column(visible=False) as speech_options:
|
96 |
+
cosyvoice2_refer_audio = gr.Audio(sources='upload', type='filepath', label='Speech Reference', value="/sds_wangby/models/cjy/wrs/gradio/CosyVoice/zero_shot_prompt.wav")
|
97 |
+
cosyvoice2_language = gr.Dropdown(["EN", "ZH"], label="Language")
|
98 |
+
with gr.Column():
|
99 |
+
cosyvoice2_subtitle = gr.Checkbox(label="Add the speech content to the video subtitles", value=False)
|
100 |
+
|
101 |
+
generate_button = gr.Button("🎬 Generate Video")
|
102 |
+
|
103 |
+
with gr.Column():
|
104 |
+
video_output = gr.Video(label="Medical Sora Generate Video", width=720, height=480, autoplay=True, loop=True)
|
105 |
+
with gr.Row():
|
106 |
+
download_video_button = gr.File(label="📥 Download Video", visible=False)
|
107 |
+
|
108 |
+
with gr.Accordion("🎥 Expand to see video gallery", open=False):
|
109 |
+
gr.Markdown("""
|
110 |
+
<table border="0" style="width: 100%; text-align: left; margin-top: 20px;">
|
111 |
+
<tr>
|
112 |
+
<td style="width: 25%; vertical-align: top; font-size: 0.9em;">
|
113 |
+
<p>A garden comes to life as a kaleidoscope of butterflies flutters amidst the blossoms, their delicate wings casting shadows on the petals below. In the background, a grand fountain cascades water with a gentle splendor, its rhythmic sound providing a soothing backdrop. Beneath the cool shade of a mature tree, a solitary wooden chair invites solitude and reflection, its smooth surface worn by the touch of countless visitors seeking a moment of tranquility in nature's embrace.</p>
|
114 |
+
</td>
|
115 |
+
<td style="width: 25%; vertical-align: top;">
|
116 |
+
<video src="https://github.com/user-attachments/assets/cf5953ea-96d3-48fd-9907-c4708752c714" width="100%" controls autoplay loop></video>
|
117 |
+
</td>
|
118 |
+
<td style="width: 25%; vertical-align: top; font-size: 0.9em;">
|
119 |
+
<p>A small boy, head bowed and determination etched on his face, sprints through the torrential downpour as lightning crackles and thunder rumbles in the distance. The relentless rain pounds the ground, creating a chaotic dance of water droplets that mirror the dramatic sky's anger. In the far background, the silhouette of a cozy home beckons, a faint beacon of safety and warmth amidst the fierce weather. The scene is one of perseverance and the unyielding spirit of a child braving the elements.</p>
|
120 |
+
</td>
|
121 |
+
<td style="width: 25%; vertical-align: top;">
|
122 |
+
<video src="https://github.com/user-attachments/assets/fe0a78e6-b669-4800-8cf0-b5f9b5145b52" width="100%" controls autoplay loop></video>
|
123 |
+
</td>
|
124 |
+
</tr>
|
125 |
+
<tr>
|
126 |
+
<td style="width: 25%; vertical-align: top; font-size: 0.9em;">
|
127 |
+
<p>A suited astronaut, with the red dust of Mars clinging to their boots, reaches out to shake hands with an alien being, their skin a shimmering blue, under the pink-tinged sky of the fourth planet. In the background, a sleek silver rocket, a beacon of human ingenuity, stands tall, its engines powered down, as the two representatives of different worlds exchange a historic greeting amidst the desolate beauty of the Martian landscape.</p>
|
128 |
+
</td>
|
129 |
+
<td style="width: 25%; vertical-align: top;">
|
130 |
+
<video src="https://github.com/user-attachments/assets/c182f606-8f8c-421d-b414-8487070fcfcb" width="100%" controls autoplay loop></video>
|
131 |
+
</td>
|
132 |
+
<td style="width: 25%; vertical-align: top; font-size: 0.9em;">
|
133 |
+
<p>An elderly gentleman, with a serene expression, sits at the water's edge, a steaming cup of tea by his side. He is engrossed in his artwork, brush in hand, as he renders an oil painting on a canvas that's propped up against a small, weathered table. The sea breeze whispers through his silver hair, gently billowing his loose-fitting white shirt, while the salty air adds an intangible element to his masterpiece in progress. The scene is one of tranquility and inspiration, with the artist's canvas capturing the vibrant hues of the setting sun reflecting off the tranquil sea.</p>
|
134 |
+
</td>
|
135 |
+
<td style="width: 25%; vertical-align: top;">
|
136 |
+
<video src="https://github.com/user-attachments/assets/7db2bbce-194d-434d-a605-350254b6c298" width="100%" controls autoplay loop></video>
|
137 |
+
</td>
|
138 |
+
</tr>
|
139 |
+
<tr>
|
140 |
+
<td style="width: 25%; vertical-align: top; font-size: 0.9em;">
|
141 |
+
<p>In a dimly lit bar, purplish light bathes the face of a mature man, his eyes blinking thoughtfully as he ponders in close-up, the background artfully blurred to focus on his introspective expression, the ambiance of the bar a mere suggestion of shadows and soft lighting.</p>
|
142 |
+
</td>
|
143 |
+
<td style="width: 25%; vertical-align: top;">
|
144 |
+
<video src="https://github.com/user-attachments/assets/62b01046-8cab-44cc-bd45-4d965bb615ec" width="100%" controls autoplay loop></video>
|
145 |
+
</td>
|
146 |
+
<td style="width: 25%; vertical-align: top; font-size: 0.9em;">
|
147 |
+
<p>A golden retriever, sporting sleek black sunglasses, with its lengthy fur flowing in the breeze, sprints playfully across a rooftop terrace, recently refreshed by a light rain. The scene unfolds from a distance, the dog's energetic bounds growing larger as it approaches the camera, its tail wagging with unrestrained joy, while droplets of water glisten on the concrete behind it. The overcast sky provides a dramatic backdrop, emphasizing the vibrant golden coat of the canine as it dashes towards the viewer.</p>
|
148 |
+
</td>
|
149 |
+
<td style="width: 25%; vertical-align: top;">
|
150 |
+
<video src="https://github.com/user-attachments/assets/d78e552a-4b3f-4b81-ac3f-3898079554f6" width="100%" controls autoplay loop></video>
|
151 |
+
</td>
|
152 |
+
</tr>
|
153 |
+
<tr>
|
154 |
+
<td style="width: 25%; vertical-align: top; font-size: 0.9em;">
|
155 |
+
<p>On a brilliant sunny day, the lakeshore is lined with an array of willow trees, their slender branches swaying gently in the soft breeze. The tranquil surface of the lake reflects the clear blue sky, while several elegant swans glide gracefully through the still water, leaving behind delicate ripples that disturb the mirror-like quality of the lake. The scene is one of serene beauty, with the willows' greenery providing a picturesque frame for the peaceful avian visitors.</p>
|
156 |
+
</td>
|
157 |
+
<td style="width: 25%; vertical-align: top;">
|
158 |
+
<video src="https://github.com/user-attachments/assets/30894f12-c741-44a2-9e6e-ddcacc231e5b" width="100%" controls autoplay loop></video>
|
159 |
+
</td>
|
160 |
+
<td style="width: 25%; vertical-align: top; font-size: 0.9em;">
|
161 |
+
<p>A Chinese mother, draped in a soft, pastel-colored robe, gently rocks back and forth in a cozy rocking chair positioned in the tranquil setting of a nursery. The dimly lit bedroom is adorned with whimsical mobiles dangling from the ceiling, casting shadows that dance on the walls. Her baby, swaddled in a delicate, patterned blanket, rests against her chest, the child's earlier cries now replaced by contented coos as the mother's soothing voice lulls the little one to sleep. The scent of lavender fills the air, adding to the serene atmosphere, while a warm, orange glow from a nearby nightlight illuminates the scene with a gentle hue, capturing a moment of tender love and comfort.</p>
|
162 |
+
</td>
|
163 |
+
<td style="width: 25%; vertical-align: top;">
|
164 |
+
<video src="https://github.com/user-attachments/assets/926575ca-7150-435b-a0ff-4900a963297b" width="100%" controls autoplay loop></video>
|
165 |
+
</td>
|
166 |
+
</tr>
|
167 |
+
</table>
|
168 |
+
""")
|
169 |
+
|
170 |
+
gr.Markdown("""
|
171 |
+
## 🔔Terms of service
|
172 |
+
Users are required to agree to the following terms before using the service:
|
173 |
+
|
174 |
+
The service is a research preview. It only provides limited safety measures and may generate offensive content.
|
175 |
+
|
176 |
+
## 📬Connect with us
|
177 |
+
If you have any questions, please feel free to contact us. Our email is <a href= "mailto: [email protected]"> [email protected] </a>.
|
178 |
+
""")
|
179 |
+
|
180 |
+
def all_generate(
|
181 |
+
prompt,
|
182 |
+
enable_audio,
|
183 |
+
enable_speech,
|
184 |
+
hunyuan_video_height,
|
185 |
+
hunyuan_video_width,
|
186 |
+
hunyuan_video_num_frames,
|
187 |
+
hunyuan_video_num_inference_steps,
|
188 |
+
hunyuan_video_fps,
|
189 |
+
mmaudio_positive_prompt,
|
190 |
+
mmaudio_negative_prompt,
|
191 |
+
mmaudio_seed,
|
192 |
+
mmaudio_num_steps,
|
193 |
+
mmaudio_guidance_strength,
|
194 |
+
mmaudio_duration,
|
195 |
+
cosyvoice2_refer_audio,
|
196 |
+
cosyvoice2_language,
|
197 |
+
cosyvoice2_subtitle
|
198 |
+
):
|
199 |
+
gen_video_path = fastvideo_infer(
|
200 |
+
prompt,
|
201 |
+
hunyuan_video_height,
|
202 |
+
hunyuan_video_width,
|
203 |
+
hunyuan_video_num_frames,
|
204 |
+
hunyuan_video_num_inference_steps,
|
205 |
+
hunyuan_video_fps
|
206 |
+
)
|
207 |
+
|
208 |
+
if enable_audio:
|
209 |
+
# mmaudio_infer(video, prompt, negative_prompt, seed, num_steps, cfg_strength, duration)
|
210 |
+
gen_video_path = mmaudio_infer(
|
211 |
+
gen_video_path,
|
212 |
+
mmaudio_positive_prompt,
|
213 |
+
mmaudio_negative_prompt,
|
214 |
+
mmaudio_seed,
|
215 |
+
mmaudio_num_steps,
|
216 |
+
mmaudio_guidance_strength,
|
217 |
+
mmaudio_duration
|
218 |
+
)
|
219 |
+
if enable_speech:
|
220 |
+
# refer_audio, prompt_audio, language, subtitle
|
221 |
+
gen_video_path = cosyvoice2_infer(
|
222 |
+
cosyvoice2_refer_audio,
|
223 |
+
prompt,
|
224 |
+
cosyvoice2_language,
|
225 |
+
cosyvoice2_subtitle
|
226 |
+
)
|
227 |
+
|
228 |
+
video_update = gr.update(visible=True, value=gen_video_path)
|
229 |
+
|
230 |
+
return gen_video_path, video_update
|
231 |
+
|
232 |
+
def enhance_prompt_func(prompt):
|
233 |
+
return convert_prompt(prompt, retry_times=1)
|
234 |
+
|
235 |
+
def enhance_prompt_zh_func(prompt):
|
236 |
+
return convert_prompt_zh(prompt, retry_times=1)
|
237 |
+
|
238 |
+
def gen_pos_prompt_func(prompt):
|
239 |
+
return positive_prompt(prompt, retry_times=1)
|
240 |
+
|
241 |
+
generate_button.click(
|
242 |
+
all_generate,
|
243 |
+
inputs=[
|
244 |
+
prompt,
|
245 |
+
enable_audio,
|
246 |
+
enable_speech,
|
247 |
+
hunyuan_video_height,
|
248 |
+
hunyuan_video_width,
|
249 |
+
hunyuan_video_num_frames,
|
250 |
+
hunyuan_video_num_inference_steps,
|
251 |
+
hunyuan_video_fps,
|
252 |
+
mmaudio_positive_prompt,
|
253 |
+
mmaudio_negative_prompt,
|
254 |
+
mmaudio_seed,
|
255 |
+
mmaudio_num_steps,
|
256 |
+
mmaudio_guidance_strength,
|
257 |
+
mmaudio_duration,
|
258 |
+
cosyvoice2_refer_audio,
|
259 |
+
cosyvoice2_language,
|
260 |
+
cosyvoice2_subtitle
|
261 |
+
],
|
262 |
+
outputs=[video_output, download_video_button],
|
263 |
+
)
|
264 |
+
|
265 |
+
enhance_button.click(enhance_prompt_func, inputs=[prompt], outputs=[prompt])
|
266 |
+
enhance_button_zh.click(enhance_prompt_zh_func, inputs=[prompt], outputs=[prompt])
|
267 |
+
|
268 |
+
gen_positive_button.click(gen_pos_prompt_func, inputs=[prompt], outputs=[mmaudio_positive_prompt])
|
269 |
+
|
270 |
+
enable_audio.change(fn=toggle_audio_options, inputs=[enable_audio], outputs=[audio_options])
|
271 |
+
enable_speech.change(fn=toggle_speech_options, inputs=[enable_speech], outputs=[speech_options])
|
272 |
+
|
273 |
battle_page.queue().launch(enable_monitoring=True)
|