File size: 4,150 Bytes
3a3c2be
2dc47c6
 
cb82c24
2dc47c6
589bf82
0ef1091
589bf82
9b30919
 
5e8743b
 
dae402a
 
 
 
 
 
589bf82
 
 
 
 
 
3a3c2be
2dc47c6
9b30919
2dc47c6
3a3c2be
2dc47c6
 
 
 
cb82c24
2dc47c6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1534cde
2dc47c6
 
 
 
8cb4ac6
2dc47c6
 
 
 
 
 
 
 
1534cde
2dc47c6
8cb4ac6
514b638
1ae13cc
8cb4ac6
9b30919
 
 
 
7b57752
 
 
564bb7d
1534cde
f755699
 
 
 
 
 
8cb4ac6
1ae13cc
b2619fa
8cb4ac6
1ae13cc
 
7b57752
 
 
1ae13cc
b2619fa
564bb7d
8cb4ac6
 
9b30919
8cb4ac6
 
 
 
cb82c24
 
1534cde
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import os
import subprocess
import importlib.util
import gradio as gr
import logging
from moviepy.editor import VideoFileClip
import torch

ACCESS_KEY = os.getenv("ACCESS_KEY")

torch.set_num_threads(1)
torch.set_num_interop_threads(1)
torch.use_deterministic_algorithms(True)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
torch.backends.cuda.matmul.allow_tf32 = False
torch.backends.cudnn.allow_tf32 = False

def truncate_video(video_file):
    clip = VideoFileClip(video_file)
    truncated_clip = clip.subclip(0, min(15, clip.duration))
    truncated_video_file = "temp_truncated_video.mp4"
    truncated_clip.write_videofile(truncated_video_file, codec="libx264", audio_codec="aac")
    return truncated_video_file

def clone_repo():
    repo_url = "https://github.com/NeeravSood/AllMark-MVP.git"
    repo_path = "./repository"

    github_pat = os.getenv("GITHUB_PAT")
    if not github_pat:
        raise RuntimeError("GitHub Personal Access Token (GITHUB_PAT) not found in environment variables.")
    authenticated_repo_url = f"https://{github_pat}@github.com/NeeravSood/AllMark-MVP.git"

    if os.path.exists(repo_path):
        print("Repository already cloned.")
    else:
        try:
            subprocess.run(
                ["git", "clone", authenticated_repo_url, repo_path],
                check=True,
                text=True,
                capture_output=True
            )
            print("Repository cloned successfully.")
        except subprocess.CalledProcessError as e:
            print("Output:", e.stdout)
            print("Error:", e.stderr)
            raise RuntimeError(f"Failed to clone repository: {e.stderr}")

def import_backend_script(script_name):
    """Dynamically import the backend script."""
    try:
        script_path = os.path.join("./repository", script_name)
        if not os.path.exists(script_path):
            raise FileNotFoundError(f"Script {script_name} not found in the repository.")
        
        spec = importlib.util.spec_from_file_location("backend_module", script_path)
        backend_module = importlib.util.module_from_spec(spec)
        spec.loader.exec_module(backend_module)
        return backend_module
    except Exception as e:
        logging.error(f"Error importing backend script: {str(e)}")
        raise RuntimeError(f"Failed to import backend script: {str(e)}")

# Run repository setup and model import
clone_repo()
backend = import_backend_script("app.py") 
analyzer = backend.DeepfakeAnalyzer()

def analyze_video(video_file):
    if ACCESS_KEY is None:
        logging.error("Access key not set in environment variables.")
        return {"error": "Server misconfiguration. Access key not set."}

    try:
        truncated_video = truncate_video(video_file)
        results = analyzer.analyze_media(truncated_video)

        
        combined_assessment = results.get('combined_assessment', 0)
        if isinstance(combined_assessment, str) and combined_assessment.lower() == "deepfake":
            analysis_result = "a deepfake"
        else:
            combined_assessment = int(combined_assessment) if str(combined_assessment).isdigit() else 0
            analysis_result = "genuine/original" if combined_assessment < 50 else "a deepfake"
            
        output = {
            "message": f"According to our analysis, the video you uploaded appears to be {analysis_result}. "
                       f"{len(results['video_analysis']['frame_results'])} frames were analyzed in total."
        }
        return output

    except Exception as e:
        logging.error(f"Error during analysis: {e}")
        return {"error": "An error occurred during video analysis. Please check your input and try again."}


interface = gr.Interface(
    fn=analyze_video,
    inputs=gr.Video(label="Upload Video"),
    outputs="json",
    title="AllMark - Deepfake Analyzer",
    description="Upload a video to analyze. N.B. - Only mp4 files. Processing time 1-10 minutes. For any false negatives, please contact the publisher for verification. Incognito Mode Recommended"
)

if __name__ == "__main__":
    interface.launch()