Spaces:
Sleeping
Sleeping
| import os | |
| from random import choice | |
| from moviepy.editor import VideoFileClip, AudioFileClip | |
| import tempfile | |
| import gradio as gr | |
| # Updated music directory path (relative to the Hugging Face repo) | |
| MUSIC_DIR = "chunks" # Path to the folder where your music files are stored on Hugging Face | |
| DEFAULT_MUSIC = "default_music.mp3" # Optional: path to default music if you want a fallback | |
| def load_music_files(): | |
| """ | |
| Load all music files from the directory. Use default if no files found. | |
| """ | |
| try: | |
| # Ensure directory exists and is readable | |
| if not os.path.exists(MUSIC_DIR): | |
| raise FileNotFoundError(f"Music directory not found: {MUSIC_DIR}") | |
| music_files = [os.path.join(MUSIC_DIR, f) for f in os.listdir(MUSIC_DIR) if f.endswith(".mp3")] | |
| if not music_files: | |
| print("No music files found! Using default music.") | |
| if not os.path.exists(DEFAULT_MUSIC): | |
| raise FileNotFoundError("Default music file is missing!") | |
| music_files.append(DEFAULT_MUSIC) | |
| print(f"Loaded {len(music_files)} music files.") | |
| return music_files | |
| except Exception as e: | |
| raise FileNotFoundError(f"Error loading music files: {e}") | |
| def generate_music(scene_analysis): | |
| """ | |
| Select a random music file from the available files. | |
| """ | |
| music_files = load_music_files() | |
| selected_music = choice(music_files) # Pick a random music file | |
| print(f"Selected music: {selected_music}") | |
| return selected_music | |
| def analyze_video(video_path): | |
| """ | |
| Dummy scene analysis function. Replace with an actual analysis implementation. | |
| """ | |
| print(f"Analyzing video: {video_path}") | |
| return {"scene_type": "Generic", "detected_objects": []} | |
| def process_video(video_path, music_path): | |
| """ | |
| Combines the video with background music. | |
| """ | |
| try: | |
| print(f"Processing video: {video_path} with music: {music_path}") | |
| video_clip = VideoFileClip(video_path) | |
| music_clip = AudioFileClip(music_path) | |
| # Trim music to match video duration | |
| music_clip = music_clip.subclip(0, min(video_clip.duration, music_clip.duration)) | |
| # Add music to video | |
| final_video = video_clip.set_audio(music_clip) | |
| # Save the processed video | |
| output_path = tempfile.mktemp(suffix=".mp4") | |
| final_video.write_videofile(output_path, codec="libx264", audio_codec="aac") | |
| return output_path | |
| except Exception as e: | |
| print(f"Error in process_video: {e}") | |
| raise e | |
| def main(video_path): | |
| try: | |
| analysis = analyze_video(video_path) | |
| music_path = generate_music(analysis) # Get a fresh music track every time | |
| output_path = process_video(video_path, music_path) | |
| return output_path, f"Music file used: {os.path.basename(music_path)}" | |
| except Exception as e: | |
| print(f"Error in main: {e}") | |
| return None, f"Error: {e}" | |
| # Gradio Interface | |
| def gradio_interface(video_file): | |
| output_path, message = main(video_file) | |
| if output_path: | |
| return output_path, message | |
| else: | |
| return None, message | |
| iface = gr.Interface( | |
| fn=gradio_interface, | |
| inputs=gr.Video(label="Upload Video"), | |
| outputs=[ | |
| gr.Video(label="Processed Video"), | |
| gr.Textbox(label="Result Info"), | |
| ], | |
| title="Music Video Processor", | |
| description="Upload a video, and it will randomly select one of the uploaded or default music files to combine with the video." | |
| ) | |
| # Optional: Download default music if it's not included in your Hugging Face repo | |
| if not os.path.exists(DEFAULT_MUSIC): | |
| print("Downloading default music...") | |
| os.system('wget -O default_music.mp3 "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3"') | |
| iface.launch(debug=True) | |