Update app.py
Browse files
app.py
CHANGED
|
@@ -31,12 +31,10 @@ from einops import rearrange
|
|
| 31 |
from scipy.io import wavfile
|
| 32 |
from transformers import pipeline
|
| 33 |
|
| 34 |
-
# ๋น๋์ค ๋ฐฐ๊ฒฝ์ ๊ฑฐ ๊ด๋ จ import
|
| 35 |
# ๋น๋์ค ๋ฐฐ๊ฒฝ์ ๊ฑฐ ๊ด๋ จ import
|
| 36 |
from transformers import AutoModelForImageSegmentation
|
| 37 |
from torchvision import transforms
|
| 38 |
|
| 39 |
-
|
| 40 |
# โโ moviepy import โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 41 |
try:
|
| 42 |
from moviepy.editor import (
|
|
@@ -151,7 +149,6 @@ from concurrent.futures import ThreadPoolExecutor
|
|
| 151 |
import httpx
|
| 152 |
from datetime import datetime
|
| 153 |
|
| 154 |
-
|
| 155 |
# ํ๊ฒฝ ๋ณ์ ์ค์ ์ผ๋ก torch.load ์ฒดํฌ ์ฐํ (์์ ํด๊ฒฐ์ฑ
)
|
| 156 |
os.environ["TRANSFORMERS_ALLOW_UNSAFE_DESERIALIZATION"] = "1"
|
| 157 |
|
|
@@ -207,11 +204,10 @@ TRANSLATOR = None
|
|
| 207 |
# API URLs
|
| 208 |
TEXT2IMG_API_URL = "http://211.233.58.201:7896"
|
| 209 |
VIDEO_API_URL = "http://211.233.58.201:7875"
|
| 210 |
-
|
| 211 |
ANIM_API_URL = os.getenv("ANIM_API_URL", "http://211.233.58.201:7862/")
|
| 212 |
|
| 213 |
-
# HTTP ํ์์์ ์ค์
|
| 214 |
-
ANIM_TIMEOUT = httpx.Timeout(connect=30.0, read=120.0, write=120.0, pool=30.0
|
| 215 |
|
| 216 |
# Image size presets
|
| 217 |
IMAGE_PRESETS = {
|
|
@@ -993,7 +989,6 @@ def merge_videos_with_audio(video_files, audio_file, audio_mode, audio_volume, o
|
|
| 993 |
traceback.print_exc()
|
| 994 |
return None, f"โ ์ค๋ฅ ๋ฐ์: {str(e)}"
|
| 995 |
|
| 996 |
-
|
| 997 |
def test_anim_api_connection():
|
| 998 |
"""์ ๋๋ฉ์ด์
์๋ฒ ์ฐ๊ฒฐ ํ
์คํธ"""
|
| 999 |
now = datetime.now().strftime("%H:%M:%S")
|
|
@@ -1296,8 +1291,7 @@ with demo:
|
|
| 1296 |
interactive=False
|
| 1297 |
)
|
| 1298 |
|
| 1299 |
-
|
| 1300 |
-
# ๋ค ๋ฒ์งธ ํญ: ๋น๋์ค ํธ์ง ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ด ์์
|
| 1301 |
with gr.Tab("๋น๋์ค ํธ์ง", elem_classes="tabitem"):
|
| 1302 |
with gr.Row(equal_height=True):
|
| 1303 |
# ์
๋ ฅ ์ปฌ๋ผ
|
|
@@ -1331,7 +1325,6 @@ with demo:
|
|
| 1331 |
- ์ต์์ ๊ฒฐ๊ณผ๋ฅผ ์ํด ๊ฐ์ ํฌ๊ธฐ์ ๋น๋์ค๋ฅผ ์ฌ์ฉํ์ธ์
|
| 1332 |
""")
|
| 1333 |
|
| 1334 |
-
|
| 1335 |
with gr.Group(elem_classes="panel-box"):
|
| 1336 |
gr.Markdown("### ๐ต ์ค๋์ค ์ค์ (์ ํ)")
|
| 1337 |
|
|
@@ -1505,9 +1498,7 @@ with demo:
|
|
| 1505 |
๊ธด ๋น๋์ค๋ ์์ ์กฐ๊ฐ์ผ๋ก ๋๋์ด ์ฒ๋ฆฌํ์ธ์.
|
| 1506 |
""")
|
| 1507 |
|
| 1508 |
-
|
| 1509 |
-
|
| 1510 |
-
# ์ฌ์ฏ ๋ฒ์งธ ํญ: ์ด๋ฏธ์งto์๋ฐํ
|
| 1511 |
with gr.Tab("์ด๋ฏธ์งto์๋ฐํ", elem_classes="tabitem"):
|
| 1512 |
with gr.Row(equal_height=True):
|
| 1513 |
# ์
๋ ฅ ์ปฌ๋ผ
|
|
@@ -1615,118 +1606,6 @@ with demo:
|
|
| 1615 |
- ๋ฐฐ๊ฒฝ์ด ๋จ์ํ ์ด๋ฏธ์ง๊ฐ ๋ ์ข์ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํฉ๋๋ค
|
| 1616 |
- ์ค๋์ค์ ์์ฑ์ด ๋ช
ํํ ์๋ก ๋ฆฝ์ฑํฌ๊ฐ ์ ํํฉ๋๋ค
|
| 1617 |
""")
|
| 1618 |
-
|
| 1619 |
-
# ์ฌ์ฏ ๋ฒ์งธ ํญ: ์ด๋ฏธ์งto์๋ฐํ
|
| 1620 |
-
with gr.Tab("์ด๋ฏธ์งto์๋ฐํ", elem_classes="tabitem"):
|
| 1621 |
-
with gr.Row(equal_height=True):
|
| 1622 |
-
# ์
๋ ฅ ์ปฌ๋ผ
|
| 1623 |
-
with gr.Column(scale=1):
|
| 1624 |
-
with gr.Group(elem_classes="panel-box"):
|
| 1625 |
-
gr.Markdown("### ๐ญ ์๋ฐํ ์ ๋๋ฉ์ด์
์์ฑ")
|
| 1626 |
-
gr.Markdown("""
|
| 1627 |
-
ํฌํธ๋ ์ดํธ ์ด๋ฏธ์ง์ ์ค๋์ค๋ฅผ ์
๋ก๋ํ๋ฉด ๋งํ๋ ์๋ฐํ ์ ๋๋ฉ์ด์
์ ์์ฑํฉ๋๋ค.
|
| 1628 |
-
|
| 1629 |
-
**๊ถ์ฅ ์ฌํญ**:
|
| 1630 |
-
- ์ด๋ฏธ์ง: ์ ๋ฉด์ ๋ณด๊ณ ์๋ ์ผ๊ตด ์ฌ์ง
|
| 1631 |
-
- ์ค๋์ค: ๋ช
ํํ ์์ฑ์ด ๋ด๊ธด ์ค๋์ค ํ์ผ
|
| 1632 |
-
""")
|
| 1633 |
-
|
| 1634 |
-
avatar_image = gr.Image(
|
| 1635 |
-
label="ํฌํธ๋ ์ดํธ ์ด๋ฏธ์ง",
|
| 1636 |
-
type="filepath",
|
| 1637 |
-
elem_classes="panel-box"
|
| 1638 |
-
)
|
| 1639 |
-
|
| 1640 |
-
avatar_audio = gr.Audio(
|
| 1641 |
-
label="๋๋ผ์ด๋น ์ค๋์ค",
|
| 1642 |
-
type="filepath",
|
| 1643 |
-
elem_classes="panel-box"
|
| 1644 |
-
)
|
| 1645 |
-
|
| 1646 |
-
with gr.Group(elem_classes="panel-box"):
|
| 1647 |
-
gr.Markdown("### โ๏ธ ์์ฑ ์ค์ ")
|
| 1648 |
-
|
| 1649 |
-
guidance_scale = gr.Slider(
|
| 1650 |
-
minimum=1.0,
|
| 1651 |
-
maximum=10.0,
|
| 1652 |
-
value=3.0,
|
| 1653 |
-
step=0.1,
|
| 1654 |
-
label="๊ฐ์ด๋์ค ์ค์ผ์ผ",
|
| 1655 |
-
info="๋์์๋ก ์ค๋์ค์ ๋ ์ถฉ์คํ ์์ง์ ์์ฑ"
|
| 1656 |
-
)
|
| 1657 |
-
|
| 1658 |
-
inference_steps = gr.Slider(
|
| 1659 |
-
minimum=5,
|
| 1660 |
-
maximum=30,
|
| 1661 |
-
value=10,
|
| 1662 |
-
step=1,
|
| 1663 |
-
label="์ถ๋ก ์คํ
",
|
| 1664 |
-
info="๋์์๋ก ํ์ง์ด ์ข์์ง์ง๋ง ์์ฑ ์๊ฐ์ด ์ฆ๊ฐ"
|
| 1665 |
-
)
|
| 1666 |
-
|
| 1667 |
-
# ์๋ฒ ์ํ ์ฒดํฌ
|
| 1668 |
-
with gr.Row():
|
| 1669 |
-
test_connection_btn = gr.Button(
|
| 1670 |
-
"๐ ์๋ฒ ์ฐ๊ฒฐ ํ
์คํธ",
|
| 1671 |
-
elem_id="test-connection-btn",
|
| 1672 |
-
scale=1
|
| 1673 |
-
)
|
| 1674 |
-
|
| 1675 |
-
anim_status = gr.Textbox(
|
| 1676 |
-
label="์๋ฒ ์ํ",
|
| 1677 |
-
interactive=False,
|
| 1678 |
-
elem_classes="panel-box"
|
| 1679 |
-
)
|
| 1680 |
-
|
| 1681 |
-
generate_avatar_btn = gr.Button(
|
| 1682 |
-
"๐ฌ ์๋ฐํ ์์ฑ",
|
| 1683 |
-
variant="primary",
|
| 1684 |
-
elem_id="avatar-btn"
|
| 1685 |
-
)
|
| 1686 |
-
|
| 1687 |
-
# ์ถ๋ ฅ ์ปฌ๋ผ
|
| 1688 |
-
with gr.Column(scale=1):
|
| 1689 |
-
with gr.Group(elem_classes="panel-box"):
|
| 1690 |
-
gr.Markdown("### ๐ญ ์์ฑ ๊ฒฐ๊ณผ")
|
| 1691 |
-
|
| 1692 |
-
avatar_result = gr.Video(
|
| 1693 |
-
label="์ ๋๋ฉ์ด์
๊ฒฐ๊ณผ",
|
| 1694 |
-
elem_classes="panel-box"
|
| 1695 |
-
)
|
| 1696 |
-
|
| 1697 |
-
avatar_comparison = gr.Video(
|
| 1698 |
-
label="์๋ณธ ๋๋น ๊ฒฐ๊ณผ (Side-by-Side)",
|
| 1699 |
-
elem_classes="panel-box"
|
| 1700 |
-
)
|
| 1701 |
-
|
| 1702 |
-
with gr.Accordion("์คํ ๋ก๊ทธ", open=False):
|
| 1703 |
-
avatar_logs = gr.Textbox(
|
| 1704 |
-
label="๋ก๊ทธ",
|
| 1705 |
-
lines=10,
|
| 1706 |
-
max_lines=20,
|
| 1707 |
-
interactive=False,
|
| 1708 |
-
elem_classes="panel-box"
|
| 1709 |
-
)
|
| 1710 |
-
|
| 1711 |
-
gr.Markdown("""
|
| 1712 |
-
### โน๏ธ ์ฌ์ฉ ์๋ด
|
| 1713 |
-
|
| 1714 |
-
1. **ํฌํธ๋ ์ดํธ ์ด๋ฏธ์ง ์
๋ก๋**: ์ ๋ฉด์ ๋ณด๊ณ ์๋ ์ ๋ช
ํ ์ผ๊ตด ์ฌ์ง
|
| 1715 |
-
2. **์ค๋์ค ์
๋ก๋**: ์ ๋๋ฉ์ด์
์ ์ฌ์ฉํ ์์ฑ ํ์ผ
|
| 1716 |
-
3. **์ค์ ์กฐ์ **: ๊ฐ์ด๋์ค ์ค์ผ์ผ๊ณผ ์ถ๋ก ์คํ
์กฐ์
|
| 1717 |
-
4. **์์ฑ ์์**: '์๋ฐํ ์์ฑ' ๋ฒํผ ํด๋ฆญ
|
| 1718 |
-
|
| 1719 |
-
**์ฒ๋ฆฌ ์๊ฐ**:
|
| 1720 |
-
- ์ผ๋ฐ์ ์ผ๋ก 2-5๋ถ ์์
|
| 1721 |
-
- ๊ธด ์ค๋์ค์ผ์๋ก ์ฒ๋ฆฌ ์๊ฐ ์ฆ๊ฐ
|
| 1722 |
-
|
| 1723 |
-
**ํ**:
|
| 1724 |
-
- ๋ฐฐ๊ฒฝ์ด ๋จ์ํ ์ด๋ฏธ์ง๊ฐ ๋ ์ข์ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํฉ๋๋ค
|
| 1725 |
-
- ์ค๋์ค์ ์์ฑ์ด ๋ช
ํํ ์๋ก ๋ฆฝ์ฑํฌ๊ฐ ์ ํํฉ๋๋ค
|
| 1726 |
-
""")
|
| 1727 |
-
|
| 1728 |
-
|
| 1729 |
-
|
| 1730 |
|
| 1731 |
# ๋ชจ๋ธ ๋ก๋ ํจ์ ์คํ
|
| 1732 |
def on_demo_load():
|
|
@@ -1777,7 +1656,6 @@ with demo:
|
|
| 1777 |
)
|
| 1778 |
|
| 1779 |
# ์ด๋ฒคํธ ์ฐ๊ฒฐ - ๋ค ๋ฒ์งธ ํญ (๋น๋์ค ํธ์ง)
|
| 1780 |
-
|
| 1781 |
def toggle_original_volume(mode):
|
| 1782 |
return gr.update(visible=(mode == "๋ฐฑ๊ทธ๋ผ์ด๋ ๋ฎค์ง"))
|
| 1783 |
|
|
@@ -1787,12 +1665,12 @@ with demo:
|
|
| 1787 |
outputs=[original_audio_volume]
|
| 1788 |
)
|
| 1789 |
|
| 1790 |
-
|
| 1791 |
merge_videos_btn.click(
|
| 1792 |
merge_videos_with_audio,
|
| 1793 |
inputs=[video_files, audio_file, audio_mode, audio_volume, original_audio_volume, output_fps],
|
| 1794 |
outputs=[merged_video, merge_status]
|
| 1795 |
-
)
|
|
|
|
| 1796 |
# ์ด๋ฒคํธ ์ฐ๊ฒฐ - ๋ค์ฏ ๋ฒ์งธ ํญ (๋น๋์ค ๋ฐฐ๊ฒฝ์ ๊ฑฐ/ํฉ์ฑ)
|
| 1797 |
def update_bg_visibility(bg_type):
|
| 1798 |
if bg_type == "์์":
|
|
@@ -1817,6 +1695,7 @@ with demo:
|
|
| 1817 |
outputs=[stream_image, output_bg_video, time_textbox]
|
| 1818 |
)
|
| 1819 |
|
|
|
|
| 1820 |
test_connection_btn.click(
|
| 1821 |
test_anim_api_connection,
|
| 1822 |
outputs=[anim_status, anim_status]
|
|
@@ -1827,7 +1706,6 @@ with demo:
|
|
| 1827 |
inputs=[avatar_image, avatar_audio, guidance_scale, inference_steps],
|
| 1828 |
outputs=[avatar_result, avatar_comparison, avatar_logs]
|
| 1829 |
)
|
| 1830 |
-
|
| 1831 |
|
| 1832 |
# ๋ฐ๋ชจ ๋ก๋ ์ ์คํ
|
| 1833 |
demo.load(on_demo_load, outputs=model_status)
|
|
@@ -1840,4 +1718,4 @@ if __name__ == "__main__":
|
|
| 1840 |
except:
|
| 1841 |
pass
|
| 1842 |
|
| 1843 |
-
demo.launch()
|
|
|
|
| 31 |
from scipy.io import wavfile
|
| 32 |
from transformers import pipeline
|
| 33 |
|
|
|
|
| 34 |
# ๋น๋์ค ๋ฐฐ๊ฒฝ์ ๊ฑฐ ๊ด๋ จ import
|
| 35 |
from transformers import AutoModelForImageSegmentation
|
| 36 |
from torchvision import transforms
|
| 37 |
|
|
|
|
| 38 |
# โโ moviepy import โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 39 |
try:
|
| 40 |
from moviepy.editor import (
|
|
|
|
| 149 |
import httpx
|
| 150 |
from datetime import datetime
|
| 151 |
|
|
|
|
| 152 |
# ํ๊ฒฝ ๋ณ์ ์ค์ ์ผ๋ก torch.load ์ฒดํฌ ์ฐํ (์์ ํด๊ฒฐ์ฑ
)
|
| 153 |
os.environ["TRANSFORMERS_ALLOW_UNSAFE_DESERIALIZATION"] = "1"
|
| 154 |
|
|
|
|
| 204 |
# API URLs
|
| 205 |
TEXT2IMG_API_URL = "http://211.233.58.201:7896"
|
| 206 |
VIDEO_API_URL = "http://211.233.58.201:7875"
|
|
|
|
| 207 |
ANIM_API_URL = os.getenv("ANIM_API_URL", "http://211.233.58.201:7862/")
|
| 208 |
|
| 209 |
+
# HTTP ํ์์์ ์ค์ - ๊ดํธ ์์
|
| 210 |
+
ANIM_TIMEOUT = httpx.Timeout(connect=30.0, read=120.0, write=120.0, pool=30.0)
|
| 211 |
|
| 212 |
# Image size presets
|
| 213 |
IMAGE_PRESETS = {
|
|
|
|
| 989 |
traceback.print_exc()
|
| 990 |
return None, f"โ ์ค๋ฅ ๋ฐ์: {str(e)}"
|
| 991 |
|
|
|
|
| 992 |
def test_anim_api_connection():
|
| 993 |
"""์ ๋๋ฉ์ด์
์๋ฒ ์ฐ๊ฒฐ ํ
์คํธ"""
|
| 994 |
now = datetime.now().strftime("%H:%M:%S")
|
|
|
|
| 1291 |
interactive=False
|
| 1292 |
)
|
| 1293 |
|
| 1294 |
+
# ๋ค ๋ฒ์งธ ํญ: ๋น๋์ค ํธ์ง
|
|
|
|
| 1295 |
with gr.Tab("๋น๋์ค ํธ์ง", elem_classes="tabitem"):
|
| 1296 |
with gr.Row(equal_height=True):
|
| 1297 |
# ์
๋ ฅ ์ปฌ๋ผ
|
|
|
|
| 1325 |
- ์ต์์ ๊ฒฐ๊ณผ๋ฅผ ์ํด ๊ฐ์ ํฌ๊ธฐ์ ๋น๋์ค๋ฅผ ์ฌ์ฉํ์ธ์
|
| 1326 |
""")
|
| 1327 |
|
|
|
|
| 1328 |
with gr.Group(elem_classes="panel-box"):
|
| 1329 |
gr.Markdown("### ๐ต ์ค๋์ค ์ค์ (์ ํ)")
|
| 1330 |
|
|
|
|
| 1498 |
๊ธด ๋น๋์ค๋ ์์ ์กฐ๊ฐ์ผ๋ก ๋๋์ด ์ฒ๋ฆฌํ์ธ์.
|
| 1499 |
""")
|
| 1500 |
|
| 1501 |
+
# ์ฌ์ฏ ๋ฒ์งธ ํญ: ์ด๋ฏธ์งto์๋ฐํ (์ค๋ณต ์ ๊ฑฐํ๊ณ ํ๋๋ง ์ ์ง)
|
|
|
|
|
|
|
| 1502 |
with gr.Tab("์ด๋ฏธ์งto์๋ฐํ", elem_classes="tabitem"):
|
| 1503 |
with gr.Row(equal_height=True):
|
| 1504 |
# ์
๋ ฅ ์ปฌ๋ผ
|
|
|
|
| 1606 |
- ๋ฐฐ๊ฒฝ์ด ๋จ์ํ ์ด๋ฏธ์ง๊ฐ ๋ ์ข์ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํฉ๋๋ค
|
| 1607 |
- ์ค๋์ค์ ์์ฑ์ด ๋ช
ํํ ์๋ก ๋ฆฝ์ฑํฌ๊ฐ ์ ํํฉ๋๋ค
|
| 1608 |
""")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1609 |
|
| 1610 |
# ๋ชจ๋ธ ๋ก๋ ํจ์ ์คํ
|
| 1611 |
def on_demo_load():
|
|
|
|
| 1656 |
)
|
| 1657 |
|
| 1658 |
# ์ด๋ฒคํธ ์ฐ๊ฒฐ - ๋ค ๋ฒ์งธ ํญ (๋น๋์ค ํธ์ง)
|
|
|
|
| 1659 |
def toggle_original_volume(mode):
|
| 1660 |
return gr.update(visible=(mode == "๋ฐฑ๊ทธ๋ผ์ด๋ ๋ฎค์ง"))
|
| 1661 |
|
|
|
|
| 1665 |
outputs=[original_audio_volume]
|
| 1666 |
)
|
| 1667 |
|
|
|
|
| 1668 |
merge_videos_btn.click(
|
| 1669 |
merge_videos_with_audio,
|
| 1670 |
inputs=[video_files, audio_file, audio_mode, audio_volume, original_audio_volume, output_fps],
|
| 1671 |
outputs=[merged_video, merge_status]
|
| 1672 |
+
)
|
| 1673 |
+
|
| 1674 |
# ์ด๋ฒคํธ ์ฐ๊ฒฐ - ๋ค์ฏ ๋ฒ์งธ ํญ (๋น๋์ค ๋ฐฐ๊ฒฝ์ ๊ฑฐ/ํฉ์ฑ)
|
| 1675 |
def update_bg_visibility(bg_type):
|
| 1676 |
if bg_type == "์์":
|
|
|
|
| 1695 |
outputs=[stream_image, output_bg_video, time_textbox]
|
| 1696 |
)
|
| 1697 |
|
| 1698 |
+
# ์ด๋ฒคํธ ์ฐ๊ฒฐ - ์ฌ์ฏ ๋ฒ์งธ ํญ (์ด๋ฏธ์งto์๋ฐํ)
|
| 1699 |
test_connection_btn.click(
|
| 1700 |
test_anim_api_connection,
|
| 1701 |
outputs=[anim_status, anim_status]
|
|
|
|
| 1706 |
inputs=[avatar_image, avatar_audio, guidance_scale, inference_steps],
|
| 1707 |
outputs=[avatar_result, avatar_comparison, avatar_logs]
|
| 1708 |
)
|
|
|
|
| 1709 |
|
| 1710 |
# ๋ฐ๋ชจ ๋ก๋ ์ ์คํ
|
| 1711 |
demo.load(on_demo_load, outputs=model_status)
|
|
|
|
| 1718 |
except:
|
| 1719 |
pass
|
| 1720 |
|
| 1721 |
+
demo.launch()
|