import gradio as gr import os import subprocess # install moviepy dependency moviepy = subprocess.run(["pip", "install", "moviepy"]) ffmpeg = subprocess.run(["pip", "install", "ffmpeg-python"]) pipUpdate = subprocess.run(["pip", "install", "--upgrade", "pip"]) from azure.storage.blob import BlobServiceClient import AzureBlobStorageVideo import AzureBlobStorageAudio from apiTest import videoAnalysis from Moviepy import extract_audio_from_video from Moviepy import load_json_output from Moviepy import get_explosion_segments from Moviepy import create_final_audio from Moviepy import save_audio from Moviepy import without_audio from Moviepy import combine_video_audio from Moviepy import save_video from moviepy.editor import * import json def predict_video(input_video, input_audio=None, input_choice="Explosions"): global filename, file_size # Use the global keyword to refer to the global variables # Check if the video is available if input_video is None: return [None, "Please upload a video"] filename = input_video.name # Get the uploaded filename file_size = os.path.getsize(input_video.name) # Get the file size in bytes # Loop until a valid video is uploaded if not filename.lower().endswith('.mp4'): return [None, "Error: Please upload an MP4 video file."] if file_size > 20 * 1024 * 1024: return [None, "Error: The upload exceeds file size 16MB. Please upload a smaller file."] #Initialize blob storage credentials storage_account_name = "useruploadhuggingface" storage_account_key = "zhrGpPBX6PVD+krncC4nVF4yoweEku/z2ErVxjLiuu/CjAVKqM5O4xlGWEyuWGxptL3mA1pv/6P4+AStjSjLEQ==" connection_string = f"DefaultEndpointsProtocol=https;AccountName={storage_account_name};AccountKey={storage_account_key};EndpointSuffix=core.windows.net" video_container_name = "useruploadhuggingfacevideo" audio_container_name = "useruploadhuggingfaceaudio" # 1. Upload user video file to azure blob storage videoBlobURL = AzureBlobStorageVideo.uploadUserVideoToBlobStorage(input_video, filename) videoSASToken = AzureBlobStorageVideo.generateSASToken(storage_account_name,video_container_name, filename, storage_account_key) videoSASURL = AzureBlobStorageVideo.generateSASURL(storage_account_name, video_container_name, filename, videoSASToken) # 1.1. Upload user audio if available userAudioInputFlag = False if input_audio is not None: userAudioInputFlag = True else: if (input_choice == "Explosions"): input_audio = os.path.join(os.path.dirname(__file__), "audio/1_seconds_haptic_audio.mp3") print("explosion selected") elif (input_choice == "Lightning and Thunder"): input_audio = os.path.join(os.path.dirname(__file__), "audio/8_seconds_Thunder.mp3") print("lightning and thunder selected") elif (input_choice == "Vehicle Racing"): input_audio = os.path.join(os.path.dirname(__file__), "audio/5_seconds_vehicle_audio.mp3") print("vehicle racing selected") else: input_audio = os.path.join(os.path.dirname(__file__), "audio/5_seconds_haptic_videos.mp3") print("default selected") """ Processes the uploaded video (replace with your video analysis logic). Args: input_video: The uploaded video file object. input_audio (optional): The uploaded audio file object (MP3). Returns: A list containing the processed video and a message string. """ responseQueryText = videoAnalysis(videoSASURL, videoSASToken, input_choice) # IF method returns error: run analysis again if responseQueryText == """{"error":{"code":"InvalidRequest","message":"Value for indexName is invalid."}}""": responseQueryText = videoAnalysis(videoSASURL, videoSASToken, input_choice) AzureBlobStorageVideo.delete_container('useruploadhuggingfacevideo') json_data = load_json_output(responseQueryText) # Extract audio from the video audio_path = extract_audio_from_video(input_video) # Get explosion segments explosion_segments = get_explosion_segments(json_data) print(input_audio) # Create final audio #final_audio = create_final_audio(audio_path, explosion_segments) final_audio = create_final_audio(audio_path, input_audio, explosion_segments) # Save enhanced audio finalAudioPath = "audio/finalAudio.mp3" save_audio(final_audio, finalAudioPath) if (userAudioInputFlag == True): AzureBlobStorageVideo.delete_container('useruploadhuggingfaceaudio') # Extract video without audio current_video = without_audio(VideoFileClip(input_video)) # Combine video with final audio final_video = combine_video_audio(current_video, final_audio) # Save final video save_video(final_video, "video/final_enhanced_video.mp4") finalVideoPath = "video/final_enhanced_video.mp4" return [finalVideoPath, f"Video enhancement successful"] css = """ #col-container { margin: 0 auto; max-width: 800px; } """ video_1 = os.path.join(os.path.dirname(__file__), "video/test_video.mp4") audio_1 = os.path.join(os.path.dirname(__file__), "audio/audioTrack.mp3") search_1 = "Explosions" with gr.Blocks(css=css) as demo: with gr.Column(elem_id="col-container"): gr.HTML("""
Instructions:
Step 1: Upload your MP4 video.
Step 2: (Optional) Upload an MP3 audio track.
Step 3:(Optional) Choose the instance you want haptics to be added to
Step 4: Click on submit, and We'll analyse the video and suggest explosion timeframes using Azure Cognitive Services.
Step 5: The Haptic Audio will be mixed into the video and enhanced through AI mastering.
Step 6: View and download the final video with haptics.
Explosion Audio Track 1
Explosion Audio Track 2
Explosion Audio Track 3
Explosion Audio Track 4
Explosion Audio Track 5
Vehicle Audio Track 1
Vehicle Audio Track 2