import gradio as gr import asyncio from dotenv import load_dotenv from img.resources import resources from img.file_utils import handle_image_list_change from img.core import analyze_saved_images from text_module.pipeline import verify_text_logic from text_module.TextAnalysisResult import TextAnalysisResult from merge_img_text import verify_multimodal_logic # --- INITIALIZATION --- load_dotenv() print("⏳ Loading Image Models...") resources.load_all() print("✅ Ready.") def text_tab_wrapper(text_input): if not text_input: return "Waiting...", "⚠️ Please enter text.", "" res_obj = TextAnalysisResult() verify_text_logic(text_input, res_obj) auth = res_obj.get_authenticity_assessment() report = f""" ### 📄 Text Analysis Report **Assessment:** {auth} **Tools:** {res_obj.get_verification_tools_methods()} **Type:** {res_obj.get_synthetic_type()} #### Details: {res_obj.get_other_artifacts()} """ log = "Analysis Finished." return log, auth, report custom_css = """ #progress_img, #progress_txt, #final_report { opacity: 1 !important; filter: none !important; transition: none !important; } .generating { border: none !important; } """ # --- GRADIO INTERFACE --- with gr.Blocks(theme=gr.themes.Soft(), title="Multi-Modal Forensic Tool", css=custom_css) as iface: gr.Markdown("# 🕵️ AI Forensic & Fact-Checking Tool") with gr.Tabs(): with gr.TabItem("🖼️ Image Forensics"): saved_state_img = gr.State([]) hidden_status = gr.Textbox(visible=False) with gr.Row(): with gr.Column(scale=1): img_input = gr.File(file_count="multiple", label="Upload Images", file_types=["image"]) analyze_btn = gr.Button("🔍 Analyze Image", variant="primary") with gr.Column(scale=2): output_json = gr.JSON(label="Analysis Results (JSON)") output_md = gr.Markdown(label="Formatted Report") # Events Tab 1 img_input.change( fn=handle_image_list_change, inputs=[img_input, saved_state_img], outputs=[saved_state_img, hidden_status], queue=False ) analyze_btn.click( fn=analyze_saved_images, inputs=[saved_state_img], outputs=[output_json, output_md] ) with gr.TabItem("📄 Text Verification"): with gr.Row(): with gr.Column(scale=1): txt_input = gr.Textbox(lines=6, label="Input Text", placeholder="Enter text to verify...") txt_btn = gr.Button("🕵️ Verify Text", variant="primary") with gr.Column(scale=2): txt_log = gr.Textbox(label="Logs", lines=2, interactive=False) txt_status = gr.Label(label="Status") txt_report = gr.Markdown(label="Detailed Report") # Events Tab 2 txt_btn.click( fn=text_tab_wrapper, inputs=[txt_input], outputs=[txt_log, txt_status, txt_report] ) with gr.TabItem("⚖️ Multi-modal Verification"): gr.Markdown("### Cross-verify Image & Text Context") saved_state_multi = gr.State([]) hidden_status_multi = gr.Textbox(visible=False) with gr.Row(): with gr.Column(scale=1): mm_img_input = gr.File(label="Upload Related Images", file_count="multiple", file_types=["image"]) mm_txt_input = gr.Textbox(label="Context Text", lines=5, placeholder="Paste text here...") mm_btn = gr.Button("🚀 Start Verification", variant="primary") with gr.Column(scale=2): gr.Markdown("#### Analysis Progress") mm_prog_img = gr.HTML(elem_id="progress_img", label="Image Status", value='
💤 Waiting...
') mm_prog_txt = gr.HTML(elem_id="progress_txt", label="Text Status", value='
💤 Waiting...
') gr.Markdown("---") mm_report = gr.Markdown(elem_id="final_report", label="Final Report") mm_img_input.change( fn=handle_image_list_change, inputs=[mm_img_input, saved_state_multi], outputs=[saved_state_multi, hidden_status_multi], queue=False ) mm_btn.click( fn=verify_multimodal_logic, inputs=[saved_state_multi, mm_txt_input], outputs=[mm_prog_img, mm_prog_txt, mm_report], show_progress="hidden" ) if __name__ == "__main__": iface.queue().launch(share=True)