Spaces:
Build error
Build error
Update app.py
Browse files
app.py
CHANGED
|
@@ -48,6 +48,21 @@ OPENROUTER_MODEL = "mistralai/mistral-small-3.1-24b-instruct:free"
|
|
| 48 |
OUTPUT_VIDEO_FILENAME = "final_video.mp4"
|
| 49 |
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
|
| 50 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 51 |
# ---------------- Helper Functions ---------------- #
|
| 52 |
# (Your existing helper functions remain unchanged: generate_script, parse_script,
|
| 53 |
# search_pexels_videos, search_pexels_images, search_google_images, download_image,
|
|
@@ -434,7 +449,7 @@ def generate_media(prompt, user_image=None, current_index=0, total_segments=1):
|
|
| 434 |
else:
|
| 435 |
print(f"Google Images search failed for prompt: {prompt}")
|
| 436 |
|
| 437 |
-
if random.random() <
|
| 438 |
video_file = os.path.join(TEMP_FOLDER, f"{safe_prompt}_video.mp4")
|
| 439 |
video_url = search_pexels_videos(prompt, PEXELS_API_KEY)
|
| 440 |
if video_url:
|
|
@@ -758,12 +773,37 @@ def fix_imagemagick_policy():
|
|
| 758 |
print(f"Error fixing policies: {e}")
|
| 759 |
return False
|
| 760 |
|
| 761 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 762 |
def generate_video(user_input, resolution, caption_option):
|
| 763 |
"""Generate a video based on user input via Gradio."""
|
| 764 |
global TARGET_RESOLUTION, CAPTION_COLOR, TEMP_FOLDER
|
| 765 |
-
|
| 766 |
-
|
| 767 |
# Set resolution
|
| 768 |
if resolution == "Full":
|
| 769 |
TARGET_RESOLUTION = (1920, 1080)
|
|
@@ -852,21 +892,7 @@ def generate_video(user_input, resolution, caption_option):
|
|
| 852 |
|
| 853 |
return OUTPUT_VIDEO_FILENAME
|
| 854 |
|
| 855 |
-
|
| 856 |
-
|
| 857 |
-
|
| 858 |
-
|
| 859 |
-
|
| 860 |
-
|
| 861 |
-
|
| 862 |
-
|
| 863 |
-
|
| 864 |
-
|
| 865 |
-
|
| 866 |
-
import gradio as gr
|
| 867 |
-
import shutil
|
| 868 |
-
import os
|
| 869 |
-
|
| 870 |
VOICE_CHOICES = {
|
| 871 |
'Emma (Female)': 'af_heart',
|
| 872 |
'Bella (Female)': 'af_bella',
|
|
@@ -898,28 +924,28 @@ VOICE_CHOICES = {
|
|
| 898 |
'Daniel 🇬🇧 (Male)': 'bm_daniel'
|
| 899 |
}
|
| 900 |
|
| 901 |
-
|
| 902 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 903 |
if music_file is not None:
|
| 904 |
target_path = "music.mp3"
|
| 905 |
-
shutil.copy(music_file, target_path)
|
| 906 |
print(f"Uploaded music saved as: {target_path}")
|
| 907 |
-
|
| 908 |
-
|
| 909 |
-
handle_music_upload(music_file)
|
| 910 |
-
|
| 911 |
-
selected_voice = VOICE_CHOICES[voice]
|
| 912 |
-
print(f"Selected Voice: {selected_voice}")
|
| 913 |
-
print(f"Video Clip Probability: {video_clip_probability}%")
|
| 914 |
-
print(f"Music Volume: {bg_music_volume}")
|
| 915 |
-
print(f"FPS: {fps}")
|
| 916 |
-
print(f"Preset: {preset}")
|
| 917 |
-
print(f"Voice Speed: {voice_speed}")
|
| 918 |
-
print(f"Caption Font Size: {font_size}")
|
| 919 |
-
|
| 920 |
-
# Pass these to your video generator as needed
|
| 921 |
return generate_video(user_input, resolution, caption_option)
|
| 922 |
|
|
|
|
| 923 |
iface = gr.Interface(
|
| 924 |
fn=generate_video_with_options,
|
| 925 |
inputs=[
|
|
@@ -931,14 +957,16 @@ iface = gr.Interface(
|
|
| 931 |
gr.Slider(0, 100, value=25, step=1, label="Video Clip Usage Probability (%)"),
|
| 932 |
gr.Slider(0.0, 1.0, value=0.08, step=0.01, label="Background Music Volume"),
|
| 933 |
gr.Slider(10, 60, value=30, step=1, label="Video FPS"),
|
| 934 |
-
gr.Dropdown(choices=["ultrafast", "superfast", "veryfast", "faster", "fast", "medium", "slow"],
|
|
|
|
| 935 |
gr.Slider(0.5, 1.5, value=0.9, step=0.05, label="Voice Speed"),
|
| 936 |
gr.Slider(20, 100, value=45, step=1, label="Caption Font Size")
|
| 937 |
],
|
| 938 |
outputs=gr.Video(label="Generated Video"),
|
| 939 |
title="AI Documentary Video Generator",
|
| 940 |
-
description="Upload music, choose voice,
|
| 941 |
)
|
| 942 |
|
| 943 |
-
|
| 944 |
-
|
|
|
|
|
|
| 48 |
OUTPUT_VIDEO_FILENAME = "final_video.mp4"
|
| 49 |
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
|
| 50 |
|
| 51 |
+
|
| 52 |
+
|
| 53 |
+
# Additional global variables needed for the Gradio interface
|
| 54 |
+
selected_voice = 'af_heart' # Default voice
|
| 55 |
+
voice_speed = 0.9 # Default voice speed
|
| 56 |
+
font_size = 45 # Default font size
|
| 57 |
+
video_clip_probability = 0.25 # Default probability for video clips
|
| 58 |
+
bg_music_volume = 0.08 # Default background music volume
|
| 59 |
+
fps = 30 # Default FPS
|
| 60 |
+
preset = "veryfast" # Default preset
|
| 61 |
+
TARGET_RESOLUTION = None
|
| 62 |
+
CAPTION_COLOR = None
|
| 63 |
+
TEMP_FOLDER = None
|
| 64 |
+
|
| 65 |
+
|
| 66 |
# ---------------- Helper Functions ---------------- #
|
| 67 |
# (Your existing helper functions remain unchanged: generate_script, parse_script,
|
| 68 |
# search_pexels_videos, search_pexels_images, search_google_images, download_image,
|
|
|
|
| 449 |
else:
|
| 450 |
print(f"Google Images search failed for prompt: {prompt}")
|
| 451 |
|
| 452 |
+
if random.random() < video_clip_probability:
|
| 453 |
video_file = os.path.join(TEMP_FOLDER, f"{safe_prompt}_video.mp4")
|
| 454 |
video_url = search_pexels_videos(prompt, PEXELS_API_KEY)
|
| 455 |
if video_url:
|
|
|
|
| 773 |
print(f"Error fixing policies: {e}")
|
| 774 |
return False
|
| 775 |
|
| 776 |
+
|
| 777 |
+
|
| 778 |
+
|
| 779 |
+
|
| 780 |
+
|
| 781 |
+
|
| 782 |
+
|
| 783 |
+
|
| 784 |
+
|
| 785 |
+
|
| 786 |
+
|
| 787 |
+
|
| 788 |
+
|
| 789 |
+
|
| 790 |
+
|
| 791 |
+
|
| 792 |
+
|
| 793 |
+
|
| 794 |
+
|
| 795 |
+
|
| 796 |
+
|
| 797 |
+
|
| 798 |
+
|
| 799 |
+
|
| 800 |
+
|
| 801 |
+
|
| 802 |
+
# ---------------- Main Video Generation Function ---------------- #
|
| 803 |
def generate_video(user_input, resolution, caption_option):
|
| 804 |
"""Generate a video based on user input via Gradio."""
|
| 805 |
global TARGET_RESOLUTION, CAPTION_COLOR, TEMP_FOLDER
|
| 806 |
+
|
|
|
|
| 807 |
# Set resolution
|
| 808 |
if resolution == "Full":
|
| 809 |
TARGET_RESOLUTION = (1920, 1080)
|
|
|
|
| 892 |
|
| 893 |
return OUTPUT_VIDEO_FILENAME
|
| 894 |
|
| 895 |
+
# ---------------- Gradio Interface ---------------- #
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 896 |
VOICE_CHOICES = {
|
| 897 |
'Emma (Female)': 'af_heart',
|
| 898 |
'Bella (Female)': 'af_bella',
|
|
|
|
| 924 |
'Daniel 🇬🇧 (Male)': 'bm_daniel'
|
| 925 |
}
|
| 926 |
|
| 927 |
+
def generate_video_with_options(user_input, resolution, caption_option, music_file, voice, vclip_prob, bg_vol, video_fps, video_preset, v_speed, caption_size):
|
| 928 |
+
global selected_voice, voice_speed, font_size, video_clip_probability, bg_music_volume, fps, preset
|
| 929 |
+
|
| 930 |
+
# Update global variables with user selections
|
| 931 |
+
selected_voice = VOICE_CHOICES[voice]
|
| 932 |
+
voice_speed = v_speed
|
| 933 |
+
font_size = caption_size
|
| 934 |
+
video_clip_probability = vclip_prob / 100 # Convert from percentage to decimal
|
| 935 |
+
bg_music_volume = bg_vol
|
| 936 |
+
fps = video_fps
|
| 937 |
+
preset = video_preset
|
| 938 |
+
|
| 939 |
+
# Handle music upload
|
| 940 |
if music_file is not None:
|
| 941 |
target_path = "music.mp3"
|
| 942 |
+
shutil.copy(music_file.name, target_path)
|
| 943 |
print(f"Uploaded music saved as: {target_path}")
|
| 944 |
+
|
| 945 |
+
# Generate the video
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 946 |
return generate_video(user_input, resolution, caption_option)
|
| 947 |
|
| 948 |
+
# Create the Gradio interface
|
| 949 |
iface = gr.Interface(
|
| 950 |
fn=generate_video_with_options,
|
| 951 |
inputs=[
|
|
|
|
| 957 |
gr.Slider(0, 100, value=25, step=1, label="Video Clip Usage Probability (%)"),
|
| 958 |
gr.Slider(0.0, 1.0, value=0.08, step=0.01, label="Background Music Volume"),
|
| 959 |
gr.Slider(10, 60, value=30, step=1, label="Video FPS"),
|
| 960 |
+
gr.Dropdown(choices=["ultrafast", "superfast", "veryfast", "faster", "fast", "medium", "slow"],
|
| 961 |
+
value="veryfast", label="Export Preset"),
|
| 962 |
gr.Slider(0.5, 1.5, value=0.9, step=0.05, label="Voice Speed"),
|
| 963 |
gr.Slider(20, 100, value=45, step=1, label="Caption Font Size")
|
| 964 |
],
|
| 965 |
outputs=gr.Video(label="Generated Video"),
|
| 966 |
title="AI Documentary Video Generator",
|
| 967 |
+
description="Create short documentary videos with AI. Upload music, choose voice, and customize settings."
|
| 968 |
)
|
| 969 |
|
| 970 |
+
# Launch the interface
|
| 971 |
+
if __name__ == "__main__":
|
| 972 |
+
iface.launch(share=True)
|