Tophness2022 commited on
Commit
072bf6d
·
1 Parent(s): 62b5582

Initial attempt at tabbed UI, still isn't correctly selecting loras from defaults

Browse files
Files changed (1) hide show
  1. gradio_server.py +460 -462
gradio_server.py CHANGED
@@ -256,35 +256,35 @@ else:
256
  text = reader.read()
257
  server_config = json.loads(text)
258
 
259
- ui_defaults_filename = "ui_defaults.json"
260
-
261
- if not Path(ui_defaults_filename).is_file():
262
- default_ui_defaults = {
263
- "prompts": get_default_prompt(use_image2video),
264
- "resolution": "832x480",
265
- "video_length": 81,
266
- "num_inference_steps": 30,
267
- "seed": -1,
268
- "repeat_generation": 1,
269
- "guidance_scale": 5.0,
270
- "flow_shift": get_default_flow(transformer_filename_i2v if use_image2video else transformer_filename_t2v),
271
- "negative_prompt": "",
272
- "activated_loras": [],
273
- "loras_multipliers": "",
274
- "tea_cache": 0.0,
275
- "tea_cache_start_step_perc": 0,
276
- "RIFLEx_setting": 0,
277
- "slg_switch": 0,
278
- "slg_layers": [9],
279
- "slg_start_perc": 10,
280
- "slg_end_perc": 90
281
- }
282
- with open(ui_defaults_filename, "w", encoding="utf-8") as f:
283
- json.dump(default_ui_defaults, f, indent=4)
284
- ui_defaults = default_ui_defaults
285
- else:
286
- with open(ui_defaults_filename, "r", encoding="utf-8") as f:
287
- ui_defaults = json.load(f)
288
 
289
  transformer_filename_t2v = server_config["transformer_filename"]
290
  transformer_filename_i2v = server_config.get("transformer_filename_i2v", transformer_choices_i2v[1]) ########
@@ -324,8 +324,8 @@ if args.t2v_1_3B:
324
  use_image2video = False
325
  lock_ui_transformer = False
326
 
 
327
  only_allow_edit_in_advanced = False
328
-
329
  lora_dir =args.lora_dir
330
  if use_image2video and len(lora_dir)==0:
331
  lora_dir =args.lora_dir_i2v
@@ -585,22 +585,19 @@ def load_i2v_model(model_filename, value):
585
 
586
  return wan_model, pipe
587
 
588
- def load_models(i2v, lora_dir, lora_preselected_preset ):
589
- download_models(transformer_filename_i2v if i2v else transformer_filename_t2v, text_encoder_filename)
590
-
591
  if i2v:
592
- res720P= "720p" in transformer_filename_i2v
593
- wan_model, pipe = load_i2v_model(transformer_filename_i2v,"720P" if res720P else "480P")
594
  else:
595
- wan_model, pipe = load_t2v_model(transformer_filename_t2v,"")
596
-
597
  kwargs = { "extraModelsToQuantize": None}
598
  if profile == 2 or profile == 4:
599
  kwargs["budgets"] = { "transformer" : 100 if preload == 0 else preload, "text_encoder" : 100, "*" : 1000 }
600
  elif profile == 3:
601
  kwargs["budgets"] = { "*" : "70%" }
602
-
603
-
604
  offloadobj = offload.profile(pipe, profile_no= profile, compile = compile, quantizeTransformer = quantizeTransformer, loras = "transformer", **kwargs)
605
  loras, loras_names, default_loras_choices, default_loras_multis_str, default_prompt, default_lora_preset, loras_presets = setup_loras(pipe["transformer"], lora_dir, lora_preselected_preset, None)
606
  if "activated_loras" in ui_defaults:
@@ -613,7 +610,6 @@ def load_models(i2v, lora_dir, lora_preselected_preset ):
613
  except ValueError:
614
  print(f"Warning: Lora file {lora_file} from config not found in loras directory")
615
  ui_defaults["activated_loras"] = activated_indices
616
-
617
  return wan_model, offloadobj, loras, loras_names, default_loras_choices, default_loras_multis_str, default_prompt, default_lora_preset, loras_presets
618
 
619
  wan_model, offloadobj, loras, loras_names, default_loras_choices, default_loras_multis_str, default_prompt, default_lora_preset, loras_presets = load_models(use_image2video, lora_dir, lora_preselected_preset )
@@ -904,15 +900,25 @@ def generate_video(
904
  slg_end,
905
  state,
906
  metadata_choice,
 
907
  progress=gr.Progress() #track_tqdm= True
908
 
909
  ):
910
-
 
 
 
 
 
 
 
 
 
 
911
  from PIL import Image
912
  import numpy as np
913
  import tempfile
914
 
915
-
916
  if wan_model == None:
917
  raise gr.Error("Unable to generate a Video while a new configuration is being applied.")
918
  if attention_mode == "auto":
@@ -930,7 +936,7 @@ def generate_video(
930
 
931
  if slg_switch == 0:
932
  slg_layers = None
933
- if use_image2video:
934
  if "480p" in transformer_filename_i2v and width * height > 848*480:
935
  gr.Info("You must use the 720P image to video model to generate videos with a resolution equivalent to 720P")
936
  return
@@ -980,7 +986,7 @@ def generate_video(
980
  prompts = [prompt.strip() for prompt in prompts if len(prompt.strip())>0 and not prompt.startswith("#")]
981
  if len(prompts) ==0:
982
  return
983
- if use_image2video:
984
  if image_to_continue is not None:
985
  if isinstance(image_to_continue, list):
986
  image_to_continue = [ tup[0] for tup in image_to_continue ]
@@ -1081,7 +1087,7 @@ def generate_video(
1081
  trans.rel_l1_thresh = 0
1082
  trans.teacache_start_step = int(tea_cache_start_step_perc*num_inference_steps/100)
1083
 
1084
- if use_image2video:
1085
  if '480p' in transformer_filename_i2v:
1086
  # teacache_thresholds = [0.13, .19, 0.26]
1087
  trans.coefficients = [-3.02331670e+02, 2.23948934e+02, -5.25463970e+01, 5.87348440e+00, -2.01973289e-01]
@@ -1152,7 +1158,7 @@ def generate_video(
1152
  torch.cuda.empty_cache()
1153
  wan_model._interrupt = False
1154
  try:
1155
- if use_image2video:
1156
  samples = wan_model.generate(
1157
  prompt,
1158
  image_to_continue[no].convert('RGB'),
@@ -1373,7 +1379,7 @@ def delete_lset(lset_name):
1373
  return gr.Dropdown(choices=lset_choices, value= lset_choices[pos][1]), gr.Button(visible= True), gr.Button(visible= True), gr.Button(visible= True), gr.Button(visible= True), gr.Button(visible= False), gr.Checkbox(visible= False)
1374
 
1375
  def refresh_lora_list(lset_name, loras_choices):
1376
- global loras,loras_names, loras_presets
1377
  prev_lora_names_selected = [ loras_names[int(i)] for i in loras_choices]
1378
 
1379
  loras, loras_names, _, _, _, _, loras_presets = setup_loras(wan_model.model, lora_dir, lora_preselected_preset, None)
@@ -1553,7 +1559,6 @@ def switch_prompt_type(state, prompt, wizard_prompt, *prompt_vars):
1553
  state["apply_success"] = 1
1554
  return fill_wizard_prompt(state, prompt, wizard_prompt)
1555
 
1556
-
1557
  visible= False
1558
  def switch_advanced(new_advanced, lset_name):
1559
  global advanced
@@ -1570,15 +1575,12 @@ def switch_advanced(new_advanced, lset_name):
1570
 
1571
  def download_loras():
1572
  from huggingface_hub import snapshot_download
1573
-
1574
-
1575
  yield "<B><FONT SIZE=3>Please wait while the Loras are being downloaded</B></FONT>", *[gr.Column(visible=False)] * 2
1576
  log_path = os.path.join(lora_dir, "log.txt")
1577
  if not os.path.isfile(log_path) or True:
1578
  import shutil
1579
  tmp_path = os.path.join(lora_dir, "tmp_lora_dowload")
1580
-
1581
- import shutil, glob
1582
  snapshot_download(repo_id="DeepBeepMeep/Wan2.1", allow_patterns="loras_i2v/*", local_dir= tmp_path)
1583
  for f in glob.glob(os.path.join(tmp_path, "loras_i2v", "*.*")):
1584
  target_file = os.path.join(lora_dir, Path(f).parts[-1] )
@@ -1586,435 +1588,248 @@ def download_loras():
1586
  os.remove(f)
1587
  else:
1588
  shutil.move(f, lora_dir)
1589
-
1590
  try:
1591
  os.remove(tmp_path)
1592
  except:
1593
  pass
1594
-
1595
  yield "<B><FONT SIZE=3>Loras have been completely downloaded</B></FONT>", *[gr.Column(visible=True)] * 2
1596
 
1597
  from datetime import datetime
1598
  dt = datetime.today().strftime('%Y-%m-%d')
1599
  with open( log_path, "w", encoding="utf-8") as writer:
1600
  writer.write(f"Loras downloaded on the {dt} at {time.time()} on the {time.time()}")
1601
-
1602
  return
1603
- def create_demo():
1604
- css= """
1605
- .title-with-lines {
1606
- display: flex;
1607
- align-items: center;
1608
- margin: 30px 0;
1609
- }
1610
- .line {
1611
- flex-grow: 1;
1612
- height: 1px;
1613
- background-color: #333;
1614
- }
1615
- h2 {
1616
- margin: 0 20px;
1617
- white-space: nowrap;
1618
- }
1619
- """
1620
- with gr.Blocks(css=css, theme=gr.themes.Soft(primary_hue="sky", neutral_hue="slate", text_size= "md")) as demo:
1621
- state_dict = {}
1622
-
1623
- if use_image2video:
1624
- gr.Markdown("<div align=center><H1>Wan 2.1<SUP>GP</SUP> v2.1 - Image To Video <FONT SIZE=4>by <I>DeepBeepMeep</I></FONT> <FONT SIZE=3> (<A HREF='https://github.com/deepbeepmeep/Wan2GP'>Updates</A> / <A HREF='https://github.com/Wan-Video/Wan2.1'>Original by Alibaba</A>)</FONT SIZE=3></H1></div>")
1625
- else:
1626
- gr.Markdown("<div align=center><H1>Wan 2.1<SUP>GP</SUP> v2.1 - Text To Video <FONT SIZE=4>by <I>DeepBeepMeep</I></FONT> <FONT SIZE=3> (<A HREF='https://github.com/deepbeepmeep/Wan2GP'>Updates</A> / <A HREF='https://github.com/Wan-Video/Wan2.1'>Original by Alibaba</A>)</FONT SIZE=3></H1></div>")
1627
 
1628
- gr.Markdown("<FONT SIZE=3>Welcome to Wan 2.1GP a super fast and low VRAM AI Video Generator !</FONT>")
1629
-
1630
- with gr.Accordion("Click here for some Info on how to use Wan2GP", open = False): # and to download 20+ Loras
1631
- if use_image2video and False:
1632
- pass
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1633
  else:
1634
- gr.Markdown("The VRAM requirements will depend greatly of the resolution and the duration of the video, for instance :")
1635
- gr.Markdown("- 848 x 480 with a 14B model: 80 frames (5s) : 8 GB of VRAM")
1636
- gr.Markdown("- 848 x 480 with the 1.3B model: 80 frames (5s) : 5 GB of VRAM")
1637
- gr.Markdown("- 1280 x 720 with a 14B model: 80 frames (5s): 11 GB of VRAM")
1638
- gr.Markdown("It is not recommmended to generate a video longer than 8s (128 frames) even if there is still some VRAM left as some artifacts may appear")
1639
- gr.Markdown("Please note that if your turn on compilation, the first denoising step of the first video generation will be slow due to the compilation. Therefore all your tests should be done with compilation turned off.")
1640
-
1641
- with gr.Row(visible= use_image2video):
1642
- with gr.Row(scale =3):
1643
- gr.Markdown("<I>Wan2GP's Lora Festival ! Press the following button to download i2v <B>Remade</B> Loras collection (and bonuses Loras). Dont't forget first to make a backup of your Loras just in case.")
1644
- with gr.Row(scale =1):
1645
- download_loras_btn = gr.Button("---> Let the Lora's Festival Start !", scale =1)
1646
- with gr.Row(visible= use_image2video):
1647
- download_status = gr.Markdown()
1648
-
1649
- # css = """<STYLE>
1650
- # h2 { width: 100%; text-align: center; border-bottom: 1px solid #000; line-height: 0.1em; margin: 10px 0 20px; }
1651
- # h2 span {background:#fff; padding:0 10px; }</STYLE>"""
1652
- # gr.HTML(css)
1653
-
1654
- header = gr.Markdown(generate_header(transformer_filename_i2v if use_image2video else transformer_filename_t2v, compile, attention_mode) )
1655
-
1656
- with gr.Accordion("Video Engine Configuration - click here to change it", open = False, visible= not args.lock_config):
1657
- gr.Markdown("For the changes to be effective you will need to restart the gradio_server. Some choices below may be locked if the app has been launched by specifying a config preset.")
1658
-
1659
- with gr.Column():
1660
- index = transformer_choices_t2v.index(transformer_filename_t2v)
1661
- index = 0 if index ==0 else index
1662
- transformer_t2v_choice = gr.Dropdown(
1663
- choices=[
1664
- ("WAN 2.1 1.3B Text to Video 16 bits (recommended)- the small model for fast generations with low VRAM requirements", 0),
1665
- ("WAN 2.1 14B Text to Video 16 bits - the default engine in its original glory, offers a slightly better image quality but slower and requires more RAM", 1),
1666
- ("WAN 2.1 14B Text to Video quantized to 8 bits (recommended) - the default engine but quantized", 2),
1667
- ],
1668
- value= index,
1669
- label="Transformer model for Text to Video",
1670
- interactive= not lock_ui_transformer,
1671
- visible=not use_image2video
1672
- )
1673
-
1674
- index = transformer_choices_i2v.index(transformer_filename_i2v)
1675
- index = 0 if index ==0 else index
1676
- transformer_i2v_choice = gr.Dropdown(
1677
- choices=[
1678
- ("WAN 2.1 - 480p 14B Image to Video 16 bits - the default engine in its original glory, offers a slightly better image quality but slower and requires more RAM", 0),
1679
- ("WAN 2.1 - 480p 14B Image to Video quantized to 8 bits (recommended) - the default engine but quantized", 1),
1680
- ("WAN 2.1 - 720p 14B Image to Video 16 bits - the default engine in its original glory, offers a slightly better image quality but slower and requires more RAM", 2),
1681
- ("WAN 2.1 - 720p 14B Image to Video quantized to 8 bits (recommended) - the default engine but quantized", 3),
1682
- ],
1683
- value= index,
1684
- label="Transformer model for Image to Video",
1685
- interactive= not lock_ui_transformer,
1686
- visible = use_image2video, ###############
1687
- )
1688
-
1689
- index = text_encoder_choices.index(text_encoder_filename)
1690
- index = 0 if index ==0 else index
1691
-
1692
- text_encoder_choice = gr.Dropdown(
1693
- choices=[
1694
- ("UMT5 XXL 16 bits - unquantized text encoder, better quality uses more RAM", 0),
1695
- ("UMT5 XXL quantized to 8 bits - quantized text encoder, slightly worse quality but uses less RAM", 1),
1696
- ],
1697
- value= index,
1698
- label="Text Encoder model"
1699
- )
1700
- save_path_choice = gr.Textbox(
1701
- label="Output Folder for Generated Videos",
1702
- value=server_config.get("save_path", save_path)
1703
- )
1704
- def check(mode):
1705
- if not mode in attention_modes_supported:
1706
- return " (NOT INSTALLED)"
1707
- else:
1708
- return ""
1709
- attention_choice = gr.Dropdown(
1710
- choices=[
1711
- ("Auto : pick sage2 > sage > sdpa depending on what is installed", "auto"),
1712
- ("Scale Dot Product Attention: default, always available", "sdpa"),
1713
- ("Flash" + check("flash")+ ": good quality - requires additional install (usually complex to set up on Windows without WSL)", "flash"),
1714
- # ("Xformers" + check("xformers")+ ": good quality - requires additional install (usually complex, may consume less VRAM to set up on Windows without WSL)", "xformers"),
1715
- ("Sage" + check("sage")+ ": 30% faster but slightly worse quality - requires additional install (usually complex to set up on Windows without WSL)", "sage"),
1716
- ("Sage2" + check("sage2")+ ": 40% faster but slightly worse quality - requires additional install (usually complex to set up on Windows without WSL)", "sage2"),
1717
- ],
1718
- value= attention_mode,
1719
- label="Attention Type",
1720
- interactive= not lock_ui_attention
1721
- )
1722
- gr.Markdown("Beware: when restarting the server or changing a resolution or video duration, the first step of generation for a duration / resolution may last a few minutes due to recompilation")
1723
- compile_choice = gr.Dropdown(
1724
- choices=[
1725
- ("ON: works only on Linux / WSL", "transformer"),
1726
- ("OFF: no other choice if you have Windows without using WSL", "" ),
1727
- ],
1728
- value= compile,
1729
- label="Compile Transformer (up to 50% faster and 30% more frames but requires Linux / WSL and Flash or Sage attention)",
1730
- interactive= not lock_ui_compile
1731
- )
1732
-
1733
-
1734
- vae_config_choice = gr.Dropdown(
1735
- choices=[
1736
- ("Auto", 0),
1737
- ("Disabled (faster but may require up to 22 GB of VRAM)", 1),
1738
- ("256 x 256 : If at least 8 GB of VRAM", 2),
1739
- ("128 x 128 : If at least 6 GB of VRAM", 3),
1740
- ],
1741
- value= vae_config,
1742
- label="VAE Tiling - reduce the high VRAM requirements for VAE decoding and VAE encoding (if enabled it will be slower)"
1743
- )
1744
-
1745
- boost_choice = gr.Dropdown(
1746
- choices=[
1747
- # ("Auto (ON if Video longer than 5s)", 0),
1748
- ("ON", 1),
1749
- ("OFF", 2),
1750
- ],
1751
- value=boost,
1752
- label="Boost: Give a 10% speed speedup without losing quality at the cost of a litle VRAM (up to 1GB for max frames and resolution)"
1753
- )
1754
-
1755
- profile_choice = gr.Dropdown(
1756
- choices=[
1757
- ("HighRAM_HighVRAM, profile 1: at least 48 GB of RAM and 24 GB of VRAM, the fastest for short videos a RTX 3090 / RTX 4090", 1),
1758
- ("HighRAM_LowVRAM, profile 2 (Recommended): at least 48 GB of RAM and 12 GB of VRAM, the most versatile profile with high RAM, better suited for RTX 3070/3080/4070/4080 or for RTX 3090 / RTX 4090 with large pictures batches or long videos", 2),
1759
- ("LowRAM_HighVRAM, profile 3: at least 32 GB of RAM and 24 GB of VRAM, adapted for RTX 3090 / RTX 4090 with limited RAM for good speed short video",3),
1760
- ("LowRAM_LowVRAM, profile 4 (Default): at least 32 GB of RAM and 12 GB of VRAM, if you have little VRAM or want to generate longer videos",4),
1761
- ("VerylowRAM_LowVRAM, profile 5: (Fail safe): at least 16 GB of RAM and 10 GB of VRAM, if you don't have much it won't be fast but maybe it will work",5)
1762
- ],
1763
- value= profile,
1764
- label="Profile (for power users only, not needed to change it)"
1765
- )
1766
-
1767
- default_ui_choice = gr.Dropdown(
1768
- choices=[
1769
- ("Text to Video", "t2v"),
1770
- ("Image to Video", "i2v"),
1771
- ],
1772
- value= default_ui,
1773
- label="Default mode when launching the App if not '--t2v' ot '--i2v' switch is specified when launching the server ",
1774
- # visible= True ############
1775
- )
1776
-
1777
- metadata_choice = gr.Dropdown(
1778
- choices=[
1779
- ("Export JSON files", "json"),
1780
- ("Add metadata to video", "metadata"),
1781
- ("Neither", "none")
1782
- ],
1783
- value=metadata,
1784
- label="Metadata Handling"
1785
- )
1786
-
1787
- msg = gr.Markdown()
1788
- apply_btn = gr.Button("Apply Changes")
1789
-
1790
-
1791
-
1792
- with gr.Row():
1793
- with gr.Column():
1794
- with gr.Row(visible= len(loras)>0) as presets_column:
1795
- lset_choices = [ (preset, preset) for preset in loras_presets ] + [(get_new_preset_msg(advanced), "")]
1796
- with gr.Column(scale=6):
1797
- lset_name = gr.Dropdown(show_label=False, allow_custom_value= True, scale=5, filterable=True, choices= lset_choices, value=default_lora_preset)
1798
- with gr.Column(scale=1):
1799
- # with gr.Column():
1800
- with gr.Row(height=17):
1801
- apply_lset_btn = gr.Button("Apply Lora Preset", size="sm", min_width= 1)
1802
- refresh_lora_btn = gr.Button("Refresh", size="sm", min_width= 1, visible=advanced or not only_allow_edit_in_advanced)
1803
- # save_lset_prompt_cbox = gr.Checkbox(label="Save Prompt Comments in Preset", value=False, visible= False)
1804
- save_lset_prompt_drop= gr.Dropdown(
1805
- choices=[
1806
- ("Save Prompt Comments Only", 0),
1807
- ("Save Full Prompt", 1)
1808
- ], show_label= False, container=False, value =1, visible= False
1809
- )
1810
-
1811
- with gr.Row(height=17, visible=False) as refresh2_row:
1812
- refresh_lora_btn2 = gr.Button("Refresh", size="sm", min_width= 1)
1813
-
1814
- with gr.Row(height=17, visible=advanced or not only_allow_edit_in_advanced) as preset_buttons_rows:
1815
- confirm_save_lset_btn = gr.Button("Go Ahead Save it !", size="sm", min_width= 1, visible=False)
1816
- confirm_delete_lset_btn = gr.Button("Go Ahead Delete it !", size="sm", min_width= 1, visible=False)
1817
- save_lset_btn = gr.Button("Save", size="sm", min_width= 1)
1818
- delete_lset_btn = gr.Button("Delete", size="sm", min_width= 1)
1819
- cancel_lset_btn = gr.Button("Don't do it !", size="sm", min_width= 1 , visible=False)
1820
-
1821
- video_to_continue = gr.Video(label= "Video to continue", visible= use_image2video and False) #######
1822
- if args.multiple_images:
1823
- image_to_continue = gr.Gallery(
1824
- label="Images as a starting point for new videos", type ="pil", #file_types= "image",
1825
- columns=[3], rows=[1], object_fit="contain", height="auto", selected_index=0, interactive= True, visible=use_image2video)
1826
- else:
1827
- image_to_continue = gr.Image(label= "Image as a starting point for a new video", type ="pil", visible=use_image2video)
1828
 
1829
- advanced_prompt = advanced
1830
- prompt_vars=[]
1831
- if advanced_prompt:
1832
- default_wizard_prompt, variables, values= None, None, None
1833
- else:
1834
- default_wizard_prompt, variables, values, errors = extract_wizard_prompt(default_prompt)
1835
- advanced_prompt = len(errors) > 0
1836
-
1837
- with gr.Column(visible= advanced_prompt) as prompt_column_advanced: #visible= False
1838
- prompt = gr.Textbox( visible= advanced_prompt, label="Prompts (each new line of prompt will generate a new video, # lines = comments, ! lines = macros)", value=ui_defaults["prompts"], lines=3)
1839
-
1840
- with gr.Column(visible=not advanced_prompt and len(variables) > 0) as prompt_column_wizard_vars: #visible= False
1841
- gr.Markdown("<B>Please fill the following input fields to adapt automatically the Prompt:</B>")
1842
- with gr.Row(): #visible= not advanced_prompt and len(variables) > 0
1843
- if not advanced_prompt:
1844
- for variable in variables:
1845
- value = values.get(variable, "")
1846
- prompt_vars.append(gr.Textbox( placeholder=variable, min_width=80, show_label= False, info= variable, visible= True, value= "\n".join(value) ))
1847
- state_dict["wizard_prompt"] = 1
1848
- state_dict["variables"] = variables
1849
- for _ in range( PROMPT_VARS_MAX - len(prompt_vars)):
1850
- prompt_vars.append(gr.Textbox(visible= False, min_width=80, show_label= False))
1851
- with gr.Column(not advanced_prompt) as prompt_column_wizard:
1852
- wizard_prompt = gr.Textbox(visible = not advanced_prompt, label="Prompts (each new line of prompt will generate a new video, # lines = comments)", value=default_wizard_prompt, lines=3)
1853
- state = gr.State(state_dict)
1854
-
1855
  with gr.Row():
1856
- if use_image2video:
1857
- resolution = gr.Dropdown(
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1858
  choices=[
1859
- # 720p
1860
- ("720p", "1280x720"),
1861
- ("480p", "832x480"),
 
 
 
 
 
 
 
 
 
 
 
 
1862
  ],
1863
- value=ui_defaults["resolution"],
1864
- label="Resolution (video will have the same height / width ratio than the original image)"
 
1865
  )
1866
-
1867
- else:
1868
- resolution = gr.Dropdown(
 
 
1869
  choices=[
1870
- # 720p
1871
- ("1280x720 (16:9, 720p)", "1280x720"),
1872
- ("720x1280 (9:16, 720p)", "720x1280"),
1873
- ("1024x1024 (4:3, 720p)", "1024x024"),
1874
- # ("832x1104 (3:4, 720p)", "832x1104"),
1875
- # ("960x960 (1:1, 720p)", "960x960"),
1876
- # 480p
1877
- # ("960x544 (16:9, 480p)", "960x544"),
1878
- ("832x480 (16:9, 480p)", "832x480"),
1879
- ("480x832 (9:16, 480p)", "480x832"),
1880
- # ("832x624 (4:3, 540p)", "832x624"),
1881
- # ("624x832 (3:4, 540p)", "624x832"),
1882
- # ("720x720 (1:1, 540p)", "720x720"),
1883
  ],
1884
- value=ui_defaults["resolution"],
1885
- label="Resolution"
 
1886
  )
1887
-
1888
- with gr.Row():
1889
- with gr.Column():
1890
- video_length = gr.Slider(5, 193, value=ui_defaults["video_length"], step=4, label="Number of frames (16 = 1s)")
1891
- with gr.Column():
1892
- num_inference_steps = gr.Slider(1, 100, value=ui_defaults["num_inference_steps"], step=1, label="Number of Inference Steps")
1893
-
1894
- with gr.Row():
1895
- max_frames = gr.Slider(1, 100, value=9, step=1, label="Number of input frames to use for Video2World prediction", visible=use_image2video and False) #########
1896
-
1897
-
1898
-
1899
- show_advanced = gr.Checkbox(label="Advanced Mode", value=advanced)
1900
- with gr.Row(visible=advanced) as advanced_row:
1901
- with gr.Column():
1902
- seed = gr.Slider(-1, 999999999, value=ui_defaults["seed"], step=1, label="Seed (-1 for random)")
1903
- with gr.Row():
1904
- repeat_generation = gr.Slider(1, 25.0, value=ui_defaults["repeat_generation"], step=1, label="Default Number of Generated Videos per Prompt")
1905
- multi_images_gen_type = gr.Dropdown(
1906
- choices=[
1907
- ("Generate every combination of images and texts prompts", 0),
1908
- ("Match images and text prompts", 1),
1909
- ], visible= args.multiple_images, label= "Multiple Images as Prompts"
1910
- )
1911
-
1912
- with gr.Row():
1913
- guidance_scale = gr.Slider(1.0, 20.0, value=ui_defaults["guidance_scale"], step=0.5, label="Guidance Scale", visible=True)
1914
- embedded_guidance_scale = gr.Slider(1.0, 20.0, value=6.0, step=0.5, label="Embedded Guidance Scale", visible=False)
1915
- flow_shift = gr.Slider(0.0, 25.0, value=ui_defaults["flow_shift"], step=0.1, label="Shift Scale")
1916
- with gr.Row():
1917
- negative_prompt = gr.Textbox(label="Negative Prompt", value=ui_defaults["negative_prompt"])
1918
- with gr.Column(visible = len(loras)>0) as loras_column:
1919
- gr.Markdown("<B>Loras can be used to create special effects on the video by mentioning a trigger word in the Prompt. You can save Loras combinations in presets.</B>")
1920
- loras_choices = gr.Dropdown(
1921
- choices=[
1922
- (lora_name, str(i) ) for i, lora_name in enumerate(loras_names)
1923
- ],
1924
- value= ui_defaults["activated_loras"],
1925
- multiselect= True,
1926
- label="Activated Loras"
1927
- )
1928
- loras_mult_choices = gr.Textbox(label="Loras Multipliers (1.0 by default) separated by space characters or carriage returns, line that starts with # are ignored", value=ui_defaults["loras_multipliers"])
1929
-
1930
-
1931
- with gr.Row():
1932
- gr.Markdown("<B>Tea Cache accelerates by skipping intelligently some steps, the more steps are skipped the lower the quality of the video (Tea Cache consumes also VRAM)</B>")
1933
- with gr.Row():
1934
- tea_cache_setting = gr.Dropdown(
1935
- choices=[
1936
- ("Tea Cache Disabled", 0),
1937
- ("around x1.5 speed up", 1.5),
1938
- ("around x1.75 speed up", 1.75),
1939
- ("around x2 speed up", 2.0),
1940
- ("around x2.25 speed up", 2.25),
1941
- ("around x2.5 speed up", 2.5),
1942
- ],
1943
- value=float(ui_defaults["tea_cache"]),
1944
- visible=True,
1945
- label="Tea Cache Global Acceleration"
1946
- )
1947
- tea_cache_start_step_perc = gr.Slider(0, 100, value=ui_defaults["tea_cache_start_step_perc"], step=1, label="Tea Cache starting moment in % of generation")
1948
-
1949
- gr.Markdown("<B>With Riflex you can generate videos longer than 5s which is the default duration of videos used to train the model</B>")
1950
- RIFLEx_setting = gr.Dropdown(
1951
  choices=[
1952
- ("Auto (ON if Video longer than 5s)", 0),
1953
- ("Always ON", 1),
1954
- ("Always OFF", 2),
1955
  ],
1956
- value=ui_defaults["RIFLEx_setting"],
1957
- label="RIFLEx positional embedding to generate long video"
 
 
1958
  )
1959
-
1960
-
1961
- with gr.Row():
1962
- gr.Markdown("<B>Experimental: Skip Layer guidance,should improve video quality</B>")
1963
- with gr.Row():
1964
- slg_switch = gr.Dropdown(
1965
- choices=[
1966
- ("OFF", 0),
1967
- ("ON", 1),
1968
- ],
1969
- value=ui_defaults["slg_switch"],
1970
- visible=True,
1971
- scale = 1,
1972
- label="Skip Layer guidance"
1973
- )
1974
- slg_layers = gr.Dropdown(
1975
- choices=[
1976
- (str(i), i ) for i in range(40)
1977
- ],
1978
- value=ui_defaults["slg_layers"],
1979
- multiselect= True,
1980
- label="Skip Layers",
1981
- scale= 3
1982
- )
1983
- with gr.Row():
1984
- slg_start_perc = gr.Slider(0, 100, value=ui_defaults["slg_start_perc"], step=1, label="Denoising Steps % start")
1985
- slg_end_perc = gr.Slider(0, 100, value=ui_defaults["slg_end_perc"], step=1, label="Denoising Steps % end")
1986
-
1987
-
1988
- show_advanced.change(fn=switch_advanced, inputs=[show_advanced, lset_name], outputs=[advanced_row, preset_buttons_rows, refresh_lora_btn, refresh2_row ,lset_name ]).then(
1989
- fn=switch_prompt_type, inputs = [state, prompt, wizard_prompt, *prompt_vars], outputs = [prompt, wizard_prompt, prompt_column_advanced, prompt_column_wizard, prompt_column_wizard_vars, *prompt_vars])
1990
-
1991
- with gr.Column():
1992
- gen_status = gr.Text(label="Status", interactive= False)
1993
- output = gr.Gallery(
1994
- label="Generated videos", show_label=False, elem_id="gallery"
1995
- , columns=[3], rows=[1], object_fit="contain", height=450, selected_index=0, interactive= False)
1996
- generate_btn = gr.Button("Generate")
1997
- onemore_btn = gr.Button("One More Please !", visible= False)
1998
- abort_btn = gr.Button("Abort")
1999
- gen_info = gr.Text(label="Current prompt", visible= False , interactive= False) #gr.Markdown("Current prompt") #, ,
2000
-
2001
  save_lset_btn.click(validate_save_lset, inputs=[lset_name], outputs=[apply_lset_btn, refresh_lora_btn, delete_lset_btn, save_lset_btn,confirm_save_lset_btn, cancel_lset_btn, save_lset_prompt_drop])
2002
  confirm_save_lset_btn.click(fn=validate_wizard_prompt, inputs =[state, prompt, wizard_prompt, *prompt_vars] , outputs= [prompt]).then(
2003
  save_lset, inputs=[state, lset_name, loras_choices, loras_mult_choices, prompt, save_lset_prompt_drop], outputs=[lset_name, apply_lset_btn,refresh_lora_btn, delete_lset_btn, save_lset_btn, confirm_save_lset_btn, cancel_lset_btn, save_lset_prompt_drop])
2004
  delete_lset_btn.click(validate_delete_lset, inputs=[lset_name], outputs=[apply_lset_btn, refresh_lora_btn, delete_lset_btn, save_lset_btn,confirm_delete_lset_btn, cancel_lset_btn ])
2005
  confirm_delete_lset_btn.click(delete_lset, inputs=[lset_name], outputs=[lset_name, apply_lset_btn, refresh_lora_btn, delete_lset_btn, save_lset_btn,confirm_delete_lset_btn, cancel_lset_btn ])
2006
  cancel_lset_btn.click(cancel_lset, inputs=[], outputs=[apply_lset_btn, refresh_lora_btn, delete_lset_btn, save_lset_btn, confirm_delete_lset_btn,confirm_save_lset_btn, cancel_lset_btn,save_lset_prompt_drop ])
2007
-
2008
  apply_lset_btn.click(apply_lset, inputs=[state, lset_name,loras_choices, loras_mult_choices, prompt], outputs=[loras_choices, loras_mult_choices, prompt]).then(
2009
  fn = fill_wizard_prompt, inputs = [state, prompt, wizard_prompt], outputs = [ prompt, wizard_prompt, prompt_column_advanced, prompt_column_wizard, prompt_column_wizard_vars, *prompt_vars]
2010
  )
2011
-
2012
  refresh_lora_btn.click(refresh_lora_list, inputs=[lset_name,loras_choices], outputs=[lset_name, loras_choices])
2013
  refresh_lora_btn2.click(refresh_lora_list, inputs=[lset_name,loras_choices], outputs=[lset_name, loras_choices])
2014
  download_loras_btn.click(fn=download_loras, inputs=[], outputs=[download_status, presets_column, loras_column]).then(fn=refresh_lora_list, inputs=[lset_name,loras_choices], outputs=[lset_name, loras_choices])
2015
-
2016
  gen_status.change(refresh_gallery, inputs = [state, gen_info], outputs = [output, gen_info] )
2017
-
2018
  abort_btn.click(abort_generation,state,abort_btn )
2019
  output.select(select_video, state, None )
2020
  onemore_btn.click(fn=one_more_video,inputs=[state], outputs= [state])
@@ -2049,15 +1864,139 @@ def create_demo():
2049
  slg_end_perc,
2050
  state,
2051
  metadata_choice,
 
2052
  ],
2053
- outputs= [gen_status] #,state
2054
-
2055
  ).then(
2056
  finalize_gallery,
2057
  [state],
2058
  [output , abort_btn, generate_btn, onemore_btn, gen_info]
2059
  )
2060
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2061
  apply_btn.click(
2062
  fn=apply_changes,
2063
  inputs=[
@@ -2075,28 +2014,90 @@ def create_demo():
2075
  boost_choice,
2076
  ],
2077
  outputs= msg
2078
- ).then(
2079
- update_defaults,
2080
- [state, num_inference_steps, flow_shift,lset_name , loras_choices],
2081
- [num_inference_steps, flow_shift, header, lset_name , loras_choices ]
2082
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2083
 
2084
- return demo
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2085
 
2086
  if __name__ == "__main__":
2087
  os.environ["GRADIO_ANALYTICS_ENABLED"] = "False"
2088
  server_port = int(args.server_port)
2089
-
2090
  if os.name == "nt":
2091
  asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
2092
  if server_port == 0:
2093
  server_port = int(os.getenv("SERVER_PORT", "7860"))
2094
-
2095
  server_name = args.server_name
2096
  if len(server_name) == 0:
2097
- server_name = os.getenv("SERVER_NAME", "localhost")
2098
-
2099
-
2100
  demo = create_demo()
2101
  if args.open_browser:
2102
  import webbrowser
@@ -2105,7 +2106,4 @@ if __name__ == "__main__":
2105
  else:
2106
  url = "http://" + server_name
2107
  webbrowser.open(url + ":" + str(server_port), new = 0, autoraise = True)
2108
-
2109
- demo.launch(server_name=server_name, server_port=server_port, share=args.share, allowed_paths=[save_path])
2110
-
2111
-
 
256
  text = reader.read()
257
  server_config = json.loads(text)
258
 
259
+ def get_defaults():
260
+ global use_image2video, ui_defaults
261
+ defaults_filename = "i2v_defaults.json" if use_image2video else "t2v_defaults.json"
262
+ if not Path(defaults_filename).is_file():
263
+ ui_defaults = {
264
+ "prompts": "",
265
+ "resolution": "832x480",
266
+ "video_length": 81,
267
+ "num_inference_steps": 30,
268
+ "seed": -1,
269
+ "repeat_generation": 1,
270
+ "guidance_scale": 5.0,
271
+ "flow_shift": 5.0,
272
+ "negative_prompt": "",
273
+ "activated_loras": [],
274
+ "loras_multipliers": "",
275
+ "tea_cache": 0.0,
276
+ "tea_cache_start_step_perc": 0,
277
+ "RIFLEx_setting": 0,
278
+ "slg_switch": 0,
279
+ "slg_layers": [9],
280
+ "slg_start_perc": 10,
281
+ "slg_end_perc": 90
282
+ }
283
+ with open(defaults_filename, "w", encoding="utf-8") as f:
284
+ json.dump(ui_defaults, f, indent=4)
285
+ else:
286
+ with open(defaults_filename, "r", encoding="utf-8") as f:
287
+ ui_defaults = json.load(f)
288
 
289
  transformer_filename_t2v = server_config["transformer_filename"]
290
  transformer_filename_i2v = server_config.get("transformer_filename_i2v", transformer_choices_i2v[1]) ########
 
324
  use_image2video = False
325
  lock_ui_transformer = False
326
 
327
+ get_defaults()
328
  only_allow_edit_in_advanced = False
 
329
  lora_dir =args.lora_dir
330
  if use_image2video and len(lora_dir)==0:
331
  lora_dir =args.lora_dir_i2v
 
585
 
586
  return wan_model, pipe
587
 
588
+ def load_models(i2v, lora_dir, lora_preselected_preset):
589
+ model_filename = transformer_filename_i2v if i2v else transformer_filename_t2v
590
+ download_models(model_filename, text_encoder_filename)
591
  if i2v:
592
+ res720P = "720p" in model_filename
593
+ wan_model, pipe = load_i2v_model(model_filename, "720P" if res720P else "480P")
594
  else:
595
+ wan_model, pipe = load_t2v_model(model_filename, "")
 
596
  kwargs = { "extraModelsToQuantize": None}
597
  if profile == 2 or profile == 4:
598
  kwargs["budgets"] = { "transformer" : 100 if preload == 0 else preload, "text_encoder" : 100, "*" : 1000 }
599
  elif profile == 3:
600
  kwargs["budgets"] = { "*" : "70%" }
 
 
601
  offloadobj = offload.profile(pipe, profile_no= profile, compile = compile, quantizeTransformer = quantizeTransformer, loras = "transformer", **kwargs)
602
  loras, loras_names, default_loras_choices, default_loras_multis_str, default_prompt, default_lora_preset, loras_presets = setup_loras(pipe["transformer"], lora_dir, lora_preselected_preset, None)
603
  if "activated_loras" in ui_defaults:
 
610
  except ValueError:
611
  print(f"Warning: Lora file {lora_file} from config not found in loras directory")
612
  ui_defaults["activated_loras"] = activated_indices
 
613
  return wan_model, offloadobj, loras, loras_names, default_loras_choices, default_loras_multis_str, default_prompt, default_lora_preset, loras_presets
614
 
615
  wan_model, offloadobj, loras, loras_names, default_loras_choices, default_loras_multis_str, default_prompt, default_lora_preset, loras_presets = load_models(use_image2video, lora_dir, lora_preselected_preset )
 
900
  slg_end,
901
  state,
902
  metadata_choice,
903
+ image2video,
904
  progress=gr.Progress() #track_tqdm= True
905
 
906
  ):
907
+
908
+ global use_image2video, wan_model, offloadobj, loras, loras_names, default_loras_choices, default_loras_multis_str, default_prompt, default_lora_preset, loras_presets
909
+ if use_image2video != image2video:
910
+ if offloadobj is not None:
911
+ offloadobj.release()
912
+ offloadobj = None
913
+ wan_model = None
914
+ lora_dir = get_lora_dir(root_lora_dir)
915
+ wan_model, offloadobj, loras, loras_names, default_loras_choices, default_loras_multis_str, default_prompt, default_lora_preset, loras_presets = load_models(image2video, lora_dir, lora_preselected_preset)
916
+ use_image2video = image2video
917
+
918
  from PIL import Image
919
  import numpy as np
920
  import tempfile
921
 
 
922
  if wan_model == None:
923
  raise gr.Error("Unable to generate a Video while a new configuration is being applied.")
924
  if attention_mode == "auto":
 
936
 
937
  if slg_switch == 0:
938
  slg_layers = None
939
+ if image2video:
940
  if "480p" in transformer_filename_i2v and width * height > 848*480:
941
  gr.Info("You must use the 720P image to video model to generate videos with a resolution equivalent to 720P")
942
  return
 
986
  prompts = [prompt.strip() for prompt in prompts if len(prompt.strip())>0 and not prompt.startswith("#")]
987
  if len(prompts) ==0:
988
  return
989
+ if image2video:
990
  if image_to_continue is not None:
991
  if isinstance(image_to_continue, list):
992
  image_to_continue = [ tup[0] for tup in image_to_continue ]
 
1087
  trans.rel_l1_thresh = 0
1088
  trans.teacache_start_step = int(tea_cache_start_step_perc*num_inference_steps/100)
1089
 
1090
+ if image2video:
1091
  if '480p' in transformer_filename_i2v:
1092
  # teacache_thresholds = [0.13, .19, 0.26]
1093
  trans.coefficients = [-3.02331670e+02, 2.23948934e+02, -5.25463970e+01, 5.87348440e+00, -2.01973289e-01]
 
1158
  torch.cuda.empty_cache()
1159
  wan_model._interrupt = False
1160
  try:
1161
+ if image2video:
1162
  samples = wan_model.generate(
1163
  prompt,
1164
  image_to_continue[no].convert('RGB'),
 
1379
  return gr.Dropdown(choices=lset_choices, value= lset_choices[pos][1]), gr.Button(visible= True), gr.Button(visible= True), gr.Button(visible= True), gr.Button(visible= True), gr.Button(visible= False), gr.Checkbox(visible= False)
1380
 
1381
  def refresh_lora_list(lset_name, loras_choices):
1382
+ global loras,loras_names, loras_presets, wan_model
1383
  prev_lora_names_selected = [ loras_names[int(i)] for i in loras_choices]
1384
 
1385
  loras, loras_names, _, _, _, _, loras_presets = setup_loras(wan_model.model, lora_dir, lora_preselected_preset, None)
 
1559
  state["apply_success"] = 1
1560
  return fill_wizard_prompt(state, prompt, wizard_prompt)
1561
 
 
1562
  visible= False
1563
  def switch_advanced(new_advanced, lset_name):
1564
  global advanced
 
1575
 
1576
  def download_loras():
1577
  from huggingface_hub import snapshot_download
 
 
1578
  yield "<B><FONT SIZE=3>Please wait while the Loras are being downloaded</B></FONT>", *[gr.Column(visible=False)] * 2
1579
  log_path = os.path.join(lora_dir, "log.txt")
1580
  if not os.path.isfile(log_path) or True:
1581
  import shutil
1582
  tmp_path = os.path.join(lora_dir, "tmp_lora_dowload")
1583
+ import glob
 
1584
  snapshot_download(repo_id="DeepBeepMeep/Wan2.1", allow_patterns="loras_i2v/*", local_dir= tmp_path)
1585
  for f in glob.glob(os.path.join(tmp_path, "loras_i2v", "*.*")):
1586
  target_file = os.path.join(lora_dir, Path(f).parts[-1] )
 
1588
  os.remove(f)
1589
  else:
1590
  shutil.move(f, lora_dir)
 
1591
  try:
1592
  os.remove(tmp_path)
1593
  except:
1594
  pass
 
1595
  yield "<B><FONT SIZE=3>Loras have been completely downloaded</B></FONT>", *[gr.Column(visible=True)] * 2
1596
 
1597
  from datetime import datetime
1598
  dt = datetime.today().strftime('%Y-%m-%d')
1599
  with open( log_path, "w", encoding="utf-8") as writer:
1600
  writer.write(f"Loras downloaded on the {dt} at {time.time()} on the {time.time()}")
 
1601
  return
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1602
 
1603
+ def generate_video_tab(image2video=False):
1604
+ state_dict = {}
1605
+ gr.Markdown("<div align=center><H1>Wan 2.1<SUP>GP</SUP> v2.1 <FONT SIZE=4>by <I>DeepBeepMeep</I></FONT> <FONT SIZE=3> (<A HREF='https://github.com/deepbeepmeep/Wan2GP'>Updates</A> / <A HREF='https://github.com/Wan-Video/Wan2.1'>Original by Alibaba</A>)</FONT SIZE=3></H1></div>")
1606
+ gr.Markdown("<FONT SIZE=3>Welcome to Wan 2.1GP a super fast and low VRAM AI Video Generator !</FONT>")
1607
+
1608
+ with gr.Accordion("Click here for some Info on how to use Wan2GP", open = False):
1609
+ gr.Markdown("The VRAM requirements will depend greatly of the resolution and the duration of the video, for instance :")
1610
+ gr.Markdown("- 848 x 480 with a 14B model: 80 frames (5s) : 8 GB of VRAM")
1611
+ gr.Markdown("- 848 x 480 with the 1.3B model: 80 frames (5s) : 5 GB of VRAM")
1612
+ gr.Markdown("- 1280 x 720 with a 14B model: 80 frames (5s): 11 GB of VRAM")
1613
+ gr.Markdown("It is not recommmended to generate a video longer than 8s (128 frames) even if there is still some VRAM left as some artifacts may appear")
1614
+ gr.Markdown("Please note that if your turn on compilation, the first denoising step of the first video generation will be slow due to the compilation. Therefore all your tests should be done with compilation turned off.")
1615
+ with gr.Row(visible= image2video):
1616
+ with gr.Row(scale =3):
1617
+ gr.Markdown("<I>Wan2GP's Lora Festival ! Press the following button to download i2v <B>Remade</B> Loras collection (and bonuses Loras). Dont't forget first to make a backup of your Loras just in case.")
1618
+ with gr.Row(scale =1):
1619
+ download_loras_btn = gr.Button("---> Let the Lora's Festival Start !", scale =1)
1620
+ with gr.Row(visible= image2video):
1621
+ download_status = gr.Markdown()
1622
+ model_filename = transformer_filename_i2v if image2video else transformer_filename_t2v
1623
+ header = gr.Markdown(generate_header(model_filename, compile, attention_mode))
1624
+ with gr.Row():
1625
+ with gr.Column():
1626
+ with gr.Row(visible= len(loras)>0) as presets_column:
1627
+ lset_choices = [ (preset, preset) for preset in loras_presets ] + [(get_new_preset_msg(advanced), "")]
1628
+ with gr.Column(scale=6):
1629
+ lset_name = gr.Dropdown(show_label=False, allow_custom_value= True, scale=5, filterable=True, choices= lset_choices, value=default_lora_preset)
1630
+ with gr.Column(scale=1):
1631
+ with gr.Row(height=17):
1632
+ apply_lset_btn = gr.Button("Apply Lora Preset", size="sm", min_width= 1)
1633
+ refresh_lora_btn = gr.Button("Refresh", size="sm", min_width= 1, visible=advanced or not only_allow_edit_in_advanced)
1634
+ save_lset_prompt_drop= gr.Dropdown(
1635
+ choices=[
1636
+ ("Save Prompt Comments Only", 0),
1637
+ ("Save Full Prompt", 1)
1638
+ ], show_label= False, container=False, value =1, visible= False
1639
+ )
1640
+ with gr.Row(height=17, visible=False) as refresh2_row:
1641
+ refresh_lora_btn2 = gr.Button("Refresh", size="sm", min_width= 1)
1642
+
1643
+ with gr.Row(height=17, visible=advanced or not only_allow_edit_in_advanced) as preset_buttons_rows:
1644
+ confirm_save_lset_btn = gr.Button("Go Ahead Save it !", size="sm", min_width= 1, visible=False)
1645
+ confirm_delete_lset_btn = gr.Button("Go Ahead Delete it !", size="sm", min_width= 1, visible=False)
1646
+ save_lset_btn = gr.Button("Save", size="sm", min_width= 1)
1647
+ delete_lset_btn = gr.Button("Delete", size="sm", min_width= 1)
1648
+ cancel_lset_btn = gr.Button("Don't do it !", size="sm", min_width= 1 , visible=False)
1649
+ video_to_continue = gr.Video(label= "Video to continue", visible= image2video and False) #######
1650
+ if args.multiple_images:
1651
+ image_to_continue = gr.Gallery(
1652
+ label="Images as a starting point for new videos", type ="pil", #file_types= "image",
1653
+ columns=[3], rows=[1], object_fit="contain", height="auto", selected_index=0, interactive= True, visible=image2video)
1654
  else:
1655
+ image_to_continue = gr.Image(label= "Image as a starting point for a new video", type ="pil", visible=image2video)
1656
+ advanced_prompt = advanced
1657
+ prompt_vars=[]
1658
+ if advanced_prompt:
1659
+ default_wizard_prompt, variables, values= None, None, None
1660
+ else:
1661
+ default_wizard_prompt, variables, values, errors = extract_wizard_prompt(default_prompt)
1662
+ advanced_prompt = len(errors) > 0
1663
+ with gr.Column(visible= advanced_prompt) as prompt_column_advanced:
1664
+ prompt = gr.Textbox( visible= advanced_prompt, label="Prompts (each new line of prompt will generate a new video, # lines = comments, ! lines = macros)", value=ui_defaults["prompts"], lines=3)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1665
 
1666
+ with gr.Column(visible=not advanced_prompt and len(variables) > 0) as prompt_column_wizard_vars:
1667
+ gr.Markdown("<B>Please fill the following input fields to adapt automatically the Prompt:</B>")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1668
  with gr.Row():
1669
+ if not advanced_prompt:
1670
+ for variable in variables:
1671
+ value = values.get(variable, "")
1672
+ prompt_vars.append(gr.Textbox( placeholder=variable, min_width=80, show_label= False, info= variable, visible= True, value= "\n".join(value) ))
1673
+ state_dict["wizard_prompt"] = 1
1674
+ state_dict["variables"] = variables
1675
+ for _ in range( PROMPT_VARS_MAX - len(prompt_vars)):
1676
+ prompt_vars.append(gr.Textbox(visible= False, min_width=80, show_label= False))
1677
+ with gr.Column(not advanced_prompt) as prompt_column_wizard:
1678
+ wizard_prompt = gr.Textbox(visible = not advanced_prompt, label="Prompts (each new line of prompt will generate a new video, # lines = comments)", value=default_wizard_prompt, lines=3)
1679
+ state = gr.State(state_dict)
1680
+ with gr.Row():
1681
+ if image2video:
1682
+ resolution = gr.Dropdown(
1683
+ choices=[
1684
+ # 720p
1685
+ ("720p", "1280x720"),
1686
+ ("480p", "832x480"),
1687
+ ],
1688
+ value=ui_defaults["resolution"],
1689
+ label="Resolution (video will have the same height / width ratio than the original image)"
1690
+ )
1691
+ else:
1692
+ resolution = gr.Dropdown(
1693
+ choices=[
1694
+ # 720p
1695
+ ("1280x720 (16:9, 720p)", "1280x720"),
1696
+ ("720x1280 (9:16, 720p)", "720x1280"),
1697
+ ("1024x1024 (4:3, 720p)", "1024x024"),
1698
+ # ("832x1104 (3:4, 720p)", "832x1104"),
1699
+ # ("960x960 (1:1, 720p)", "960x960"),
1700
+ # 480p
1701
+ # ("960x544 (16:9, 480p)", "960x544"),
1702
+ ("832x480 (16:9, 480p)", "832x480"),
1703
+ ("480x832 (9:16, 480p)", "480x832"),
1704
+ # ("832x624 (4:3, 540p)", "832x624"),
1705
+ # ("624x832 (3:4, 540p)", "624x832"),
1706
+ # ("720x720 (1:1, 540p)", "720x720"),
1707
+ ],
1708
+ value=ui_defaults["resolution"],
1709
+ label="Resolution"
1710
+ )
1711
+ with gr.Row():
1712
+ with gr.Column():
1713
+ video_length = gr.Slider(5, 193, value=ui_defaults["video_length"], step=4, label="Number of frames (16 = 1s)")
1714
+ with gr.Column():
1715
+ num_inference_steps = gr.Slider(1, 100, value=ui_defaults["num_inference_steps"], step=1, label="Number of Inference Steps")
1716
+ with gr.Row():
1717
+ max_frames = gr.Slider(1, 100, value=9, step=1, label="Number of input frames to use for Video2World prediction", visible=image2video and False) #########
1718
+ show_advanced = gr.Checkbox(label="Advanced Mode", value=advanced)
1719
+ with gr.Row(visible=advanced) as advanced_row:
1720
+ with gr.Column():
1721
+ seed = gr.Slider(-1, 999999999, value=ui_defaults["seed"], step=1, label="Seed (-1 for random)")
1722
+ with gr.Row():
1723
+ repeat_generation = gr.Slider(1, 25.0, value=ui_defaults["repeat_generation"], step=1, label="Default Number of Generated Videos per Prompt")
1724
+ multi_images_gen_type = gr.Dropdown(
1725
  choices=[
1726
+ ("Generate every combination of images and texts prompts", 0),
1727
+ ("Match images and text prompts", 1),
1728
+ ], visible= args.multiple_images, label= "Multiple Images as Prompts"
1729
+ )
1730
+ with gr.Row():
1731
+ guidance_scale = gr.Slider(1.0, 20.0, value=ui_defaults["guidance_scale"], step=0.5, label="Guidance Scale", visible=True)
1732
+ embedded_guidance_scale = gr.Slider(1.0, 20.0, value=6.0, step=0.5, label="Embedded Guidance Scale", visible=False)
1733
+ flow_shift = gr.Slider(0.0, 25.0, value=ui_defaults["flow_shift"], step=0.1, label="Shift Scale")
1734
+ with gr.Row():
1735
+ negative_prompt = gr.Textbox(label="Negative Prompt", value=ui_defaults["negative_prompt"])
1736
+ with gr.Column(visible = len(loras)>0) as loras_column:
1737
+ gr.Markdown("<B>Loras can be used to create special effects on the video by mentioning a trigger word in the Prompt. You can save Loras combinations in presets.</B>")
1738
+ loras_choices = gr.Dropdown(
1739
+ choices=[
1740
+ (lora_name, str(i) ) for i, lora_name in enumerate(loras_names)
1741
  ],
1742
+ value= ui_defaults["activated_loras"],
1743
+ multiselect= True,
1744
+ label="Activated Loras"
1745
  )
1746
+ loras_mult_choices = gr.Textbox(label="Loras Multipliers (1.0 by default) separated by space characters or carriage returns, line that starts with # are ignored", value=ui_defaults["loras_multipliers"])
1747
+ with gr.Row():
1748
+ gr.Markdown("<B>Tea Cache accelerates by skipping intelligently some steps, the more steps are skipped the lower the quality of the video (Tea Cache consumes also VRAM)</B>")
1749
+ with gr.Row():
1750
+ tea_cache_setting = gr.Dropdown(
1751
  choices=[
1752
+ ("Tea Cache Disabled", 0),
1753
+ ("around x1.5 speed up", 1.5),
1754
+ ("around x1.75 speed up", 1.75),
1755
+ ("around x2 speed up", 2.0),
1756
+ ("around x2.25 speed up", 2.25),
1757
+ ("around x2.5 speed up", 2.5),
 
 
 
 
 
 
 
1758
  ],
1759
+ value=float(ui_defaults["tea_cache"]),
1760
+ visible=True,
1761
+ label="Tea Cache Global Acceleration"
1762
  )
1763
+ tea_cache_start_step_perc = gr.Slider(0, 100, value=ui_defaults["tea_cache_start_step_perc"], step=1, label="Tea Cache starting moment in % of generation")
1764
+
1765
+ gr.Markdown("<B>With Riflex you can generate videos longer than 5s which is the default duration of videos used to train the model</B>")
1766
+ RIFLEx_setting = gr.Dropdown(
1767
+ choices=[
1768
+ ("Auto (ON if Video longer than 5s)", 0),
1769
+ ("Always ON", 1),
1770
+ ("Always OFF", 2),
1771
+ ],
1772
+ value=ui_defaults["RIFLEx_setting"],
1773
+ label="RIFLEx positional embedding to generate long video"
1774
+ )
1775
+ with gr.Row():
1776
+ gr.Markdown("<B>Experimental: Skip Layer guidance,should improve video quality</B>")
1777
+ with gr.Row():
1778
+ slg_switch = gr.Dropdown(
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1779
  choices=[
1780
+ ("OFF", 0),
1781
+ ("ON", 1),
 
1782
  ],
1783
+ value=ui_defaults["slg_switch"],
1784
+ visible=True,
1785
+ scale = 1,
1786
+ label="Skip Layer guidance"
1787
  )
1788
+ slg_layers = gr.Dropdown(
1789
+ choices=[
1790
+ (str(i), i ) for i in range(40)
1791
+ ],
1792
+ value=ui_defaults["slg_layers"],
1793
+ multiselect= True,
1794
+ label="Skip Layers",
1795
+ scale= 3
1796
+ )
1797
+ with gr.Row():
1798
+ slg_start_perc = gr.Slider(0, 100, value=ui_defaults["slg_start_perc"], step=1, label="Denoising Steps % start")
1799
+ slg_end_perc = gr.Slider(0, 100, value=ui_defaults["slg_end_perc"], step=1, label="Denoising Steps % end")
1800
+ metadata_choice = gr.Dropdown(
1801
+ choices=[
1802
+ ("Export JSON files", "json"),
1803
+ ("Add metadata to video", "metadata"),
1804
+ ("Neither", "none")
1805
+ ],
1806
+ value=metadata,
1807
+ label="Metadata Handling"
1808
+ )
1809
+ show_advanced.change(fn=switch_advanced, inputs=[show_advanced, lset_name], outputs=[advanced_row, preset_buttons_rows, refresh_lora_btn, refresh2_row ,lset_name ]).then(
1810
+ fn=switch_prompt_type, inputs = [state, prompt, wizard_prompt, *prompt_vars], outputs = [prompt, wizard_prompt, prompt_column_advanced, prompt_column_wizard, prompt_column_wizard_vars, *prompt_vars])
1811
+ with gr.Column():
1812
+ gen_status = gr.Text(label="Status", interactive= False)
1813
+ output = gr.Gallery(
1814
+ label="Generated videos", show_label=False, elem_id="gallery"
1815
+ , columns=[3], rows=[1], object_fit="contain", height=450, selected_index=0, interactive= False)
1816
+ generate_btn = gr.Button("Generate")
1817
+ onemore_btn = gr.Button("One More Please !", visible= False)
1818
+ abort_btn = gr.Button("Abort")
1819
+ gen_info = gr.Text(label="Current prompt", visible= False , interactive= False)
 
 
 
 
 
 
 
 
 
 
1820
  save_lset_btn.click(validate_save_lset, inputs=[lset_name], outputs=[apply_lset_btn, refresh_lora_btn, delete_lset_btn, save_lset_btn,confirm_save_lset_btn, cancel_lset_btn, save_lset_prompt_drop])
1821
  confirm_save_lset_btn.click(fn=validate_wizard_prompt, inputs =[state, prompt, wizard_prompt, *prompt_vars] , outputs= [prompt]).then(
1822
  save_lset, inputs=[state, lset_name, loras_choices, loras_mult_choices, prompt, save_lset_prompt_drop], outputs=[lset_name, apply_lset_btn,refresh_lora_btn, delete_lset_btn, save_lset_btn, confirm_save_lset_btn, cancel_lset_btn, save_lset_prompt_drop])
1823
  delete_lset_btn.click(validate_delete_lset, inputs=[lset_name], outputs=[apply_lset_btn, refresh_lora_btn, delete_lset_btn, save_lset_btn,confirm_delete_lset_btn, cancel_lset_btn ])
1824
  confirm_delete_lset_btn.click(delete_lset, inputs=[lset_name], outputs=[lset_name, apply_lset_btn, refresh_lora_btn, delete_lset_btn, save_lset_btn,confirm_delete_lset_btn, cancel_lset_btn ])
1825
  cancel_lset_btn.click(cancel_lset, inputs=[], outputs=[apply_lset_btn, refresh_lora_btn, delete_lset_btn, save_lset_btn, confirm_delete_lset_btn,confirm_save_lset_btn, cancel_lset_btn,save_lset_prompt_drop ])
 
1826
  apply_lset_btn.click(apply_lset, inputs=[state, lset_name,loras_choices, loras_mult_choices, prompt], outputs=[loras_choices, loras_mult_choices, prompt]).then(
1827
  fn = fill_wizard_prompt, inputs = [state, prompt, wizard_prompt], outputs = [ prompt, wizard_prompt, prompt_column_advanced, prompt_column_wizard, prompt_column_wizard_vars, *prompt_vars]
1828
  )
 
1829
  refresh_lora_btn.click(refresh_lora_list, inputs=[lset_name,loras_choices], outputs=[lset_name, loras_choices])
1830
  refresh_lora_btn2.click(refresh_lora_list, inputs=[lset_name,loras_choices], outputs=[lset_name, loras_choices])
1831
  download_loras_btn.click(fn=download_loras, inputs=[], outputs=[download_status, presets_column, loras_column]).then(fn=refresh_lora_list, inputs=[lset_name,loras_choices], outputs=[lset_name, loras_choices])
 
1832
  gen_status.change(refresh_gallery, inputs = [state, gen_info], outputs = [output, gen_info] )
 
1833
  abort_btn.click(abort_generation,state,abort_btn )
1834
  output.select(select_video, state, None )
1835
  onemore_btn.click(fn=one_more_video,inputs=[state], outputs= [state])
 
1864
  slg_end_perc,
1865
  state,
1866
  metadata_choice,
1867
+ gr.State(image2video)
1868
  ],
1869
+ outputs= [gen_status]
 
1870
  ).then(
1871
  finalize_gallery,
1872
  [state],
1873
  [output , abort_btn, generate_btn, onemore_btn, gen_info]
1874
  )
1875
+ return loras_choices, lset_name
1876
+
1877
+ def generate_settings_tab():
1878
+ state_dict = {}
1879
+ state = gr.State(state_dict)
1880
+ gr.Markdown("For the changes to be effective you will need to restart the gradio_server. Some choices below may be locked if the app has been launched by specifying a config preset.")
1881
+ with gr.Column():
1882
+ index = transformer_choices_t2v.index(transformer_filename_t2v)
1883
+ index = 0 if index ==0 else index
1884
+ transformer_t2v_choice = gr.Dropdown(
1885
+ choices=[
1886
+ ("WAN 2.1 1.3B Text to Video 16 bits (recommended)- the small model for fast generations with low VRAM requirements", 0),
1887
+ ("WAN 2.1 14B Text to Video 16 bits - the default engine in its original glory, offers a slightly better image quality but slower and requires more RAM", 1),
1888
+ ("WAN 2.1 14B Text to Video quantized to 8 bits (recommended) - the default engine but quantized", 2),
1889
+ ],
1890
+ value= index,
1891
+ label="Transformer model for Text to Video",
1892
+ interactive= not lock_ui_transformer,
1893
+ visible=not use_image2video
1894
+ )
1895
+ index = transformer_choices_i2v.index(transformer_filename_i2v)
1896
+ index = 0 if index ==0 else index
1897
+ transformer_i2v_choice = gr.Dropdown(
1898
+ choices=[
1899
+ ("WAN 2.1 - 480p 14B Image to Video 16 bits - the default engine in its original glory, offers a slightly better image quality but slower and requires more RAM", 0),
1900
+ ("WAN 2.1 - 480p 14B Image to Video quantized to 8 bits (recommended) - the default engine but quantized", 1),
1901
+ ("WAN 2.1 - 720p 14B Image to Video 16 bits - the default engine in its original glory, offers a slightly better image quality but slower and requires more RAM", 2),
1902
+ ("WAN 2.1 - 720p 14B Image to Video quantized to 8 bits (recommended) - the default engine but quantized", 3),
1903
+ ],
1904
+ value= index,
1905
+ label="Transformer model for Image to Video",
1906
+ interactive= not lock_ui_transformer,
1907
+ visible = use_image2video,
1908
+ )
1909
+ index = text_encoder_choices.index(text_encoder_filename)
1910
+ index = 0 if index ==0 else index
1911
+ text_encoder_choice = gr.Dropdown(
1912
+ choices=[
1913
+ ("UMT5 XXL 16 bits - unquantized text encoder, better quality uses more RAM", 0),
1914
+ ("UMT5 XXL quantized to 8 bits - quantized text encoder, slightly worse quality but uses less RAM", 1),
1915
+ ],
1916
+ value= index,
1917
+ label="Text Encoder model"
1918
+ )
1919
+ save_path_choice = gr.Textbox(
1920
+ label="Output Folder for Generated Videos",
1921
+ value=server_config.get("save_path", save_path)
1922
+ )
1923
+ def check(mode):
1924
+ if not mode in attention_modes_supported:
1925
+ return " (NOT INSTALLED)"
1926
+ else:
1927
+ return ""
1928
+ attention_choice = gr.Dropdown(
1929
+ choices=[
1930
+ ("Auto : pick sage2 > sage > sdpa depending on what is installed", "auto"),
1931
+ ("Scale Dot Product Attention: default, always available", "sdpa"),
1932
+ ("Flash" + check("flash")+ ": good quality - requires additional install (usually complex to set up on Windows without WSL)", "flash"),
1933
+ # ("Xformers" + check("xformers")+ ": good quality - requires additional install (usually complex, may consume less VRAM to set up on Windows without WSL)", "xformers"),
1934
+ ("Sage" + check("sage")+ ": 30% faster but slightly worse quality - requires additional install (usually complex to set up on Windows without WSL)", "sage"),
1935
+ ("Sage2" + check("sage2")+ ": 40% faster but slightly worse quality - requires additional install (usually complex to set up on Windows without WSL)", "sage2"),
1936
+ ],
1937
+ value= attention_mode,
1938
+ label="Attention Type",
1939
+ interactive= not lock_ui_attention
1940
+ )
1941
+ gr.Markdown("Beware: when restarting the server or changing a resolution or video duration, the first step of generation for a duration / resolution may last a few minutes due to recompilation")
1942
+ compile_choice = gr.Dropdown(
1943
+ choices=[
1944
+ ("ON: works only on Linux / WSL", "transformer"),
1945
+ ("OFF: no other choice if you have Windows without using WSL", "" ),
1946
+ ],
1947
+ value= compile,
1948
+ label="Compile Transformer (up to 50% faster and 30% more frames but requires Linux / WSL and Flash or Sage attention)",
1949
+ interactive= not lock_ui_compile
1950
+ )
1951
+ vae_config_choice = gr.Dropdown(
1952
+ choices=[
1953
+ ("Auto", 0),
1954
+ ("Disabled (faster but may require up to 22 GB of VRAM)", 1),
1955
+ ("256 x 256 : If at least 8 GB of VRAM", 2),
1956
+ ("128 x 128 : If at least 6 GB of VRAM", 3),
1957
+ ],
1958
+ value= vae_config,
1959
+ label="VAE Tiling - reduce the high VRAM requirements for VAE decoding and VAE encoding (if enabled it will be slower)"
1960
+ )
1961
+ boost_choice = gr.Dropdown(
1962
+ choices=[
1963
+ # ("Auto (ON if Video longer than 5s)", 0),
1964
+ ("ON", 1),
1965
+ ("OFF", 2),
1966
+ ],
1967
+ value=boost,
1968
+ label="Boost: Give a 10% speed speedup without losing quality at the cost of a litle VRAM (up to 1GB for max frames and resolution)"
1969
+ )
1970
+ profile_choice = gr.Dropdown(
1971
+ choices=[
1972
+ ("HighRAM_HighVRAM, profile 1: at least 48 GB of RAM and 24 GB of VRAM, the fastest for short videos a RTX 3090 / RTX 4090", 1),
1973
+ ("HighRAM_LowVRAM, profile 2 (Recommended): at least 48 GB of RAM and 12 GB of VRAM, the most versatile profile with high RAM, better suited for RTX 3070/3080/4070/4080 or for RTX 3090 / RTX 4090 with large pictures batches or long videos", 2),
1974
+ ("LowRAM_HighVRAM, profile 3: at least 32 GB of RAM and 24 GB of VRAM, adapted for RTX 3090 / RTX 4090 with limited RAM for good speed short video",3),
1975
+ ("LowRAM_LowVRAM, profile 4 (Default): at least 32 GB of RAM and 12 GB of VRAM, if you have little VRAM or want to generate longer videos",4),
1976
+ ("VerylowRAM_LowVRAM, profile 5: (Fail safe): at least 16 GB of RAM and 10 GB of VRAM, if you don't have much it won't be fast but maybe it will work",5)
1977
+ ],
1978
+ value= profile,
1979
+ label="Profile (for power users only, not needed to change it)"
1980
+ )
1981
+ default_ui_choice = gr.Dropdown(
1982
+ choices=[
1983
+ ("Text to Video", "t2v"),
1984
+ ("Image to Video", "i2v"),
1985
+ ],
1986
+ value= default_ui,
1987
+ label="Default mode when launching the App if not '--t2v' ot '--i2v' switch is specified when launching the server ",
1988
+ )
1989
+ metadata_choice = gr.Dropdown(
1990
+ choices=[
1991
+ ("Export JSON files", "json"),
1992
+ ("Add metadata to video", "metadata"),
1993
+ ("Neither", "none")
1994
+ ],
1995
+ value=metadata,
1996
+ label="Metadata Handling"
1997
+ )
1998
+ msg = gr.Markdown()
1999
+ apply_btn = gr.Button("Apply Changes")
2000
  apply_btn.click(
2001
  fn=apply_changes,
2002
  inputs=[
 
2014
  boost_choice,
2015
  ],
2016
  outputs= msg
2017
+ )
2018
+ def on_tab_select(evt: gr.SelectData):
2019
+ global use_image2video, wan_model, offloadobj, loras, loras_names, loras_presets, root_lora_dir, lora_dir
2020
+ new_i2v = evt.index == 1
2021
+ if new_i2v == use_image2video:
2022
+ return [gr.Dropdown(visible=not new_i2v), gr.Dropdown(visible=not new_i2v),
2023
+ gr.Dropdown(visible=new_i2v), gr.Dropdown(visible=new_i2v), gr.Markdown()]
2024
+ if wan_model is not None:
2025
+ if offloadobj is not None:
2026
+ offloadobj.release()
2027
+ offloadobj = None
2028
+ wan_model = None
2029
+ gc.collect()
2030
+ torch.cuda.empty_cache()
2031
+ use_image2video = new_i2v
2032
+ get_defaults()
2033
+ lora_dir = args.lora_dir_i2v if new_i2v and args.lora_dir_i2v else args.lora_dir if not new_i2v and args.lora_dir else "loras_i2v" if new_i2v else "loras"
2034
+ root_lora_dir = lora_dir
2035
+ lora_dir = get_lora_dir(root_lora_dir)
2036
+ wan_model, offloadobj, loras, loras_names, default_loras_choices, default_loras_multis_str, default_prompt, default_lora_preset, loras_presets = load_models(use_image2video, lora_dir, lora_preselected_preset)
2037
+ new_loras_choices = [(name, str(i)) for i, name in enumerate(loras_names)]
2038
+ lset_choices = [(preset, preset) for preset in loras_presets] + [(get_new_preset_msg(advanced), "")]
2039
+ model_filename = transformer_filename_i2v if use_image2video else transformer_filename_t2v
2040
+
2041
+ if new_i2v:
2042
+ return [
2043
+ gr.Dropdown(visible=False),
2044
+ gr.Dropdown(visible=False),
2045
+ gr.Dropdown(choices=new_loras_choices, visible=True),
2046
+ gr.Dropdown(choices=lset_choices, value=default_lora_preset, visible=True)
2047
+ ]
2048
+ else:
2049
+ return [
2050
+ gr.Dropdown(choices=new_loras_choices, visible=True),
2051
+ gr.Dropdown(choices=lset_choices, value=default_lora_preset, visible=True),
2052
+ gr.Dropdown(visible=False),
2053
+ gr.Dropdown(visible=False)
2054
+ ]
2055
 
2056
+ def create_demo():
2057
+ css = """
2058
+ .title-with-lines {
2059
+ display: flex;
2060
+ align-items: center;
2061
+ margin: 30px 0;
2062
+ }
2063
+ .line {
2064
+ flex-grow: 1;
2065
+ height: 1px;
2066
+ background-color: #333;
2067
+ }
2068
+ h2 {
2069
+ margin: 0 20px;
2070
+ white-space: nowrap;
2071
+ }
2072
+ """
2073
+ with gr.Blocks(css=css, theme=gr.themes.Soft(primary_hue="sky", neutral_hue="slate", text_size="md")) as demo:
2074
+ with gr.Tabs(selected=default_ui) as main_tabs:
2075
+ with gr.Tab("Text To Video", id="t2v") as t2v_tab:
2076
+ t2v_loras_choices, t2v_lset_name = generate_video_tab()
2077
+ with gr.Tab("Image To Video", id="i2v") as i2v_tab:
2078
+ i2v_loras_choices, i2v_lset_name = generate_video_tab(True)
2079
+ with gr.Tab("Settings"):
2080
+ generate_settings_tab()
2081
+ main_tabs.select(
2082
+ fn=on_tab_select,
2083
+ inputs=[],
2084
+ outputs=[
2085
+ t2v_loras_choices, t2v_lset_name,
2086
+ i2v_loras_choices, i2v_lset_name
2087
+ ]
2088
+ )
2089
+ return demo
2090
 
2091
  if __name__ == "__main__":
2092
  os.environ["GRADIO_ANALYTICS_ENABLED"] = "False"
2093
  server_port = int(args.server_port)
 
2094
  if os.name == "nt":
2095
  asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
2096
  if server_port == 0:
2097
  server_port = int(os.getenv("SERVER_PORT", "7860"))
 
2098
  server_name = args.server_name
2099
  if len(server_name) == 0:
2100
+ server_name = os.getenv("SERVER_NAME", "localhost")
 
 
2101
  demo = create_demo()
2102
  if args.open_browser:
2103
  import webbrowser
 
2106
  else:
2107
  url = "http://" + server_name
2108
  webbrowser.open(url + ":" + str(server_port), new = 0, autoraise = True)
2109
+ demo.launch(server_name=server_name, server_port=server_port, share=args.share, allowed_paths=[save_path])