Timed prompts
Browse files
app.py
CHANGED
|
@@ -778,12 +778,24 @@ def worker_video(input_video, prompt, n_prompt, seed, batch, resolution, total_s
|
|
| 778 |
|
| 779 |
total_generated_latent_frames += int(generated_latents.shape[2])
|
| 780 |
history_latents = torch.cat([history_latents, generated_latents.to(history_latents)], dim=2)
|
|
|
|
|
|
|
|
|
|
|
|
|
| 781 |
|
| 782 |
if not high_vram:
|
| 783 |
offload_model_from_device_for_memory_preservation(transformer, target_device=gpu, preserved_memory_gb=8)
|
| 784 |
load_model_as_complete(vae, target_device=gpu)
|
|
|
|
|
|
|
|
|
|
|
|
|
| 785 |
|
| 786 |
real_history_latents = history_latents[:, :, -total_generated_latent_frames:, :, :]
|
|
|
|
|
|
|
|
|
|
|
|
|
| 787 |
|
| 788 |
if history_pixels is None:
|
| 789 |
history_pixels = vae_decode(real_history_latents, vae).cpu()
|
|
@@ -798,9 +810,17 @@ def worker_video(input_video, prompt, n_prompt, seed, batch, resolution, total_s
|
|
| 798 |
|
| 799 |
current_pixels = vae_decode(real_history_latents[:, :, -section_latent_frames:], vae).cpu()
|
| 800 |
history_pixels = soft_append_bcthw(history_pixels, current_pixels, overlapped_frames)
|
|
|
|
|
|
|
|
|
|
|
|
|
| 801 |
|
| 802 |
if not high_vram:
|
| 803 |
unload_complete_models()
|
|
|
|
|
|
|
|
|
|
|
|
|
| 804 |
|
| 805 |
output_filename = os.path.join(outputs_folder, f'{job_id}_{total_generated_latent_frames}.mp4')
|
| 806 |
|
|
@@ -810,6 +830,10 @@ def worker_video(input_video, prompt, n_prompt, seed, batch, resolution, total_s
|
|
| 810 |
# 20250508 pftq: Save prompt to mp4 metadata comments
|
| 811 |
set_mp4_comments_imageio_ffmpeg(output_filename, f"Prompt: {prompt} | Negative Prompt: {n_prompt}");
|
| 812 |
print(f"Prompt saved to mp4 metadata comments: {output_filename}")
|
|
|
|
|
|
|
|
|
|
|
|
|
| 813 |
|
| 814 |
# 20250506 pftq: Clean up previous partial files
|
| 815 |
if previous_video is not None and os.path.exists(previous_video):
|
|
@@ -819,13 +843,17 @@ def worker_video(input_video, prompt, n_prompt, seed, batch, resolution, total_s
|
|
| 819 |
except Exception as e:
|
| 820 |
print(f"Error deleting previous partial video {previous_video}: {e}")
|
| 821 |
previous_video = output_filename
|
|
|
|
|
|
|
|
|
|
|
|
|
| 822 |
|
| 823 |
print(f'Decoded. Current latent shape {real_history_latents.shape}; pixel shape {history_pixels.shape}')
|
| 824 |
|
| 825 |
stream.output_queue.push(('file', output_filename))
|
| 826 |
end = time.time()
|
| 827 |
secondes = int(end - start)
|
| 828 |
-
print("££££££££££££££££££££££££££££££££££££££££ " + str(secondes))
|
| 829 |
|
| 830 |
seed = (seed + 1) % np.iinfo(np.int32).max
|
| 831 |
|
|
@@ -908,6 +936,15 @@ def process_video(input_video, prompt, n_prompt, randomize_seed, seed, batch, re
|
|
| 908 |
def end_process():
|
| 909 |
stream.input_queue.push('end')
|
| 910 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 911 |
|
| 912 |
css = make_progress_bar_css()
|
| 913 |
block = gr.Blocks(css=css).queue()
|
|
@@ -933,7 +970,19 @@ adapted from the official code repo [FramePack](https://github.com/lllyasviel/Fr
|
|
| 933 |
text_to_video_hint = gr.HTML("I discourage to use the Text-to-Video feature. You should rather generate an image with Flux and use Image-to-Video. You will save time.", visible=False)
|
| 934 |
input_image = gr.Image(sources='upload', type="numpy", label="Image", height=320)
|
| 935 |
input_video = gr.Video(sources='upload', label="Input Video", height=320, visible=False)
|
| 936 |
-
prompt = gr.Textbox(label="Prompt", value='')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 937 |
total_second_length = gr.Slider(label="Video Length to Generate (seconds)", minimum=1, maximum=120, value=2, step=0.1)
|
| 938 |
|
| 939 |
with gr.Row():
|
|
|
|
| 778 |
|
| 779 |
total_generated_latent_frames += int(generated_latents.shape[2])
|
| 780 |
history_latents = torch.cat([history_latents, generated_latents.to(history_latents)], dim=2)
|
| 781 |
+
end = time.time()
|
| 782 |
+
secondes = int(end - start)
|
| 783 |
+
print("1 ££££££££££££££££££££££££££££££££££££££££ " + str(secondes))
|
| 784 |
+
start = time.time()
|
| 785 |
|
| 786 |
if not high_vram:
|
| 787 |
offload_model_from_device_for_memory_preservation(transformer, target_device=gpu, preserved_memory_gb=8)
|
| 788 |
load_model_as_complete(vae, target_device=gpu)
|
| 789 |
+
end = time.time()
|
| 790 |
+
secondes = int(end - start)
|
| 791 |
+
print("2 ££££££££££££££££££££££££££££££££££££££££ " + str(secondes))
|
| 792 |
+
start = time.time()
|
| 793 |
|
| 794 |
real_history_latents = history_latents[:, :, -total_generated_latent_frames:, :, :]
|
| 795 |
+
end = time.time()
|
| 796 |
+
secondes = int(end - start)
|
| 797 |
+
print("3 ££££££££££££££££££££££££££££££££££££££££ " + str(secondes))
|
| 798 |
+
start = time.time()
|
| 799 |
|
| 800 |
if history_pixels is None:
|
| 801 |
history_pixels = vae_decode(real_history_latents, vae).cpu()
|
|
|
|
| 810 |
|
| 811 |
current_pixels = vae_decode(real_history_latents[:, :, -section_latent_frames:], vae).cpu()
|
| 812 |
history_pixels = soft_append_bcthw(history_pixels, current_pixels, overlapped_frames)
|
| 813 |
+
end = time.time()
|
| 814 |
+
secondes = int(end - start)
|
| 815 |
+
print("4 ££££££££££££££££££££££££££££££££££££££££ " + str(secondes))
|
| 816 |
+
start = time.time()
|
| 817 |
|
| 818 |
if not high_vram:
|
| 819 |
unload_complete_models()
|
| 820 |
+
end = time.time()
|
| 821 |
+
secondes = int(end - start)
|
| 822 |
+
print("5 ££££££££££££££££££££££££££££££££££££££££ " + str(secondes))
|
| 823 |
+
start = time.time()
|
| 824 |
|
| 825 |
output_filename = os.path.join(outputs_folder, f'{job_id}_{total_generated_latent_frames}.mp4')
|
| 826 |
|
|
|
|
| 830 |
# 20250508 pftq: Save prompt to mp4 metadata comments
|
| 831 |
set_mp4_comments_imageio_ffmpeg(output_filename, f"Prompt: {prompt} | Negative Prompt: {n_prompt}");
|
| 832 |
print(f"Prompt saved to mp4 metadata comments: {output_filename}")
|
| 833 |
+
end = time.time()
|
| 834 |
+
secondes = int(end - start)
|
| 835 |
+
print("6 ££££££££££££££££££££££££££££££££££££££££ " + str(secondes))
|
| 836 |
+
start = time.time()
|
| 837 |
|
| 838 |
# 20250506 pftq: Clean up previous partial files
|
| 839 |
if previous_video is not None and os.path.exists(previous_video):
|
|
|
|
| 843 |
except Exception as e:
|
| 844 |
print(f"Error deleting previous partial video {previous_video}: {e}")
|
| 845 |
previous_video = output_filename
|
| 846 |
+
end = time.time()
|
| 847 |
+
secondes = int(end - start)
|
| 848 |
+
print("7 ££££££££££££££££££££££££££££££££££££££££ " + str(secondes))
|
| 849 |
+
start = time.time()
|
| 850 |
|
| 851 |
print(f'Decoded. Current latent shape {real_history_latents.shape}; pixel shape {history_pixels.shape}')
|
| 852 |
|
| 853 |
stream.output_queue.push(('file', output_filename))
|
| 854 |
end = time.time()
|
| 855 |
secondes = int(end - start)
|
| 856 |
+
print("8 ££££££££££££££££££££££££££££££££££££££££ " + str(secondes))
|
| 857 |
|
| 858 |
seed = (seed + 1) % np.iinfo(np.int32).max
|
| 859 |
|
|
|
|
| 936 |
def end_process():
|
| 937 |
stream.input_queue.push('end')
|
| 938 |
|
| 939 |
+
timed_prompts = {}
|
| 940 |
+
|
| 941 |
+
def handle_prompt_number_change():
|
| 942 |
+
timed_prompts = {}
|
| 943 |
+
return []
|
| 944 |
+
|
| 945 |
+
def handle_generation_mode_change(timed_prompt_id, timed_prompt):
|
| 946 |
+
timed_prompts[timed_prompt_id] = timed_prompt
|
| 947 |
+
return ";".join(list(timed_prompts.values()))
|
| 948 |
|
| 949 |
css = make_progress_bar_css()
|
| 950 |
block = gr.Blocks(css=css).queue()
|
|
|
|
| 970 |
text_to_video_hint = gr.HTML("I discourage to use the Text-to-Video feature. You should rather generate an image with Flux and use Image-to-Video. You will save time.", visible=False)
|
| 971 |
input_image = gr.Image(sources='upload', type="numpy", label="Image", height=320)
|
| 972 |
input_video = gr.Video(sources='upload', label="Input Video", height=320, visible=False)
|
| 973 |
+
prompt = gr.Textbox(label="Prompt", value='', info='Use ; to separate in time', placeholder="The creature starts to move, fast motion, fixed camera")
|
| 974 |
+
prompt_number = gr.Slider(label="Timed prompt number", minimum=0, maximum=1000, value=0, step=1, info='Not for video extension')
|
| 975 |
+
prompt_number.change(fn=handle_prompt_number_change, inputs=[], outputs=[])
|
| 976 |
+
|
| 977 |
+
@gr.render(inputs=prompt_number)
|
| 978 |
+
def show_split(prompt_number):
|
| 979 |
+
timed_prompts = {}
|
| 980 |
+
|
| 981 |
+
for digit in range(prompt_number):
|
| 982 |
+
timed_prompt_id = gr.Textbox(value="timed_prompt_" + str(digit), visible=False)
|
| 983 |
+
timed_prompt = gr.Textbox(label="Timed prompt #" + str(digit + 1), elem_id="timed_prompt_" + str(digit), value="")
|
| 984 |
+
timed_prompt.change(fn=handle_generation_mode_change, inputs=[timed_prompt_id, timed_prompt], outputs=[prompt])
|
| 985 |
+
|
| 986 |
total_second_length = gr.Slider(label="Video Length to Generate (seconds)", minimum=1, maximum=120, value=2, step=0.1)
|
| 987 |
|
| 988 |
with gr.Row():
|