Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import requests | |
| from PIL import Image | |
| from src.application.content_detection import NewsVerification | |
| from src.application.content_generation import ( | |
| generate_fake_image, | |
| generate_fake_text, | |
| replace_text, | |
| ) | |
| from src.application.url_reader import URLReader | |
| AZURE_TEXT_MODEL = ["gpt-4o-mini", "gpt-4o"] | |
| AZURE_IMAGE_MODEL = ["dall-e-3", "Stable Diffusion (not supported)"] | |
| def load_url(url): | |
| """ | |
| Load content from the given URL. | |
| """ | |
| content = URLReader(url) | |
| image = None | |
| header = { | |
| "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36", # noqa: E501 | |
| } | |
| try: | |
| response = requests.get( | |
| url, | |
| headers=header, | |
| stream=True, | |
| ) | |
| response.raise_for_status() # Raise an exception for bad status codes | |
| image_response = requests.get(content.top_image, stream=True) | |
| try: | |
| image = Image.open(image_response.raw) | |
| except OSError as e: | |
| print(f"Error loading image from {content.top_image}: {e}") | |
| except (requests.exceptions.RequestException, FileNotFoundError) as e: | |
| print(f"Error fetching image: {e}") | |
| return content.title, content.text, image | |
| def generate_analysis_report( | |
| news_title: str, | |
| news_content: str, | |
| news_image: Image, | |
| ): | |
| news_analysis = NewsVerification() | |
| news_analysis.load_news(news_title, news_content, news_image) | |
| news_analysis.generate_analysis_report() | |
| return news_analysis.analyze_details() | |
| # Define the GUI | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# NEWS VERIFICATION") | |
| with gr.Row(): | |
| # SETTINGS | |
| with gr.Column(scale=1): | |
| with gr.Accordion("1. Enter a URL"): | |
| url_input = gr.Textbox( | |
| label="", | |
| show_label=False, | |
| value="", | |
| ) | |
| load_button = gr.Button("Load URL") | |
| with gr.Accordion( | |
| "2. Select content-generation models", | |
| open=True, | |
| visible=False, | |
| ): | |
| with gr.Row(): | |
| text_generation_model = gr.Dropdown( | |
| choices=AZURE_TEXT_MODEL, | |
| label="Text-generation model", | |
| ) | |
| image_generation_model = gr.Dropdown( | |
| choices=AZURE_IMAGE_MODEL, | |
| label="Image-generation model", | |
| ) | |
| generate_text_button = gr.Button("Generate text") | |
| generate_image_button = gr.Button("Generate image") | |
| with gr.Accordion( | |
| "3. Replace any terms", | |
| open=True, | |
| visible=False, | |
| ): | |
| replace_df = gr.Dataframe( | |
| headers=["Find what:", "Replace with:"], | |
| datatype=["str", "str"], | |
| row_count=(1, "dynamic"), | |
| col_count=(2, "fixed"), | |
| interactive=True, | |
| ) | |
| replace_button = gr.Button("Replace all") | |
| # GENERATED CONTENT | |
| with gr.Accordion("Input News"): | |
| news_title = gr.Textbox(label="Title", value="") | |
| news_image = gr.Image(label="Image", type="filepath") | |
| news_content = gr.Textbox(label="Content", value="", lines=13) | |
| # NEWS ANALYSIS REPORT | |
| ordinary_user_explanation = """ | |
| FOR ORDINARY USER<br> | |
| - Green texts are the matched words in the input and source news.<br> | |
| - Each highlighted pair (marked with a number) shows the key differences | |
| between the input text and the source. | |
| """ | |
| fact_checker_explanation = """ | |
| FOR FACT CHECKER<br> | |
| - Green texts are the matched words in the input and source news.<br> | |
| - Each highlighted pair (marked with a number) shows the key differences | |
| between the input text and the source. | |
| """ | |
| governor_explanation = """ | |
| FOR GOVERNOR<br> | |
| - Green texts are the matched words in the input and source news.<br> | |
| - Each highlighted pair (marked with a number) shows the key differences | |
| between the input text and the source. | |
| """ | |
| table = """ | |
| <h5>Comparison between input news and source news:</h5> | |
| <table border="1" style="width:100%; text-align:left;"> | |
| <col style="width: 170px;"> | |
| <col style="width: 170px;"> | |
| <col style="width: 30px;"> | |
| <col style="width: 75px;"> | |
| <thead> | |
| <tr> | |
| <th>Input news</th> | |
| <th>Source (corresponding URL provided in Originality)</th> | |
| <th>Forensic</th> | |
| <th>Originality</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr> | |
| <th>TBD</th> | |
| <th>TBD</th> | |
| <th>TBD</th> | |
| <th>TBD</th> | |
| </tr> | |
| </tbody> | |
| </table> | |
| <style>""" | |
| with gr.Column(scale=2): | |
| with gr.Accordion("NEWS ANALYSIS"): | |
| verification_button = gr.Button("Verify news") | |
| with gr.Tab("Orinary User"): | |
| gr.HTML(ordinary_user_explanation) | |
| ordinary_user_result = gr.HTML(table) | |
| with gr.Tab("Fact Checker"): | |
| gr.HTML(fact_checker_explanation) | |
| fact_checker_result = gr.HTML(table) | |
| with gr.Tab("Governor"): | |
| gr.HTML(governor_explanation) | |
| governor_result = gr.HTML(table) | |
| # Connect events | |
| load_button.click( | |
| load_url, | |
| inputs=url_input, | |
| outputs=[news_title, news_content, news_image], | |
| ) | |
| replace_button.click( | |
| replace_text, | |
| inputs=[news_title, news_content, replace_df], | |
| outputs=[news_title, news_content], | |
| ) | |
| generate_text_button.click( | |
| generate_fake_text, | |
| inputs=[text_generation_model, news_title, news_content], | |
| outputs=[news_title, news_content], | |
| ) | |
| generate_image_button.click( | |
| generate_fake_image, | |
| inputs=[image_generation_model, news_title], | |
| outputs=[news_image], | |
| ) | |
| verification_button.click( | |
| generate_analysis_report, | |
| inputs=[news_title, news_content, news_image], | |
| outputs=[ordinary_user_result, fact_checker_result, governor_result], | |
| ) | |
| # change Image | |
| # url_input.change(load_image, inputs=url_input, outputs=image_view) | |
| try: | |
| with open( | |
| "examples/example_text_real.txt", | |
| encoding="utf-8", | |
| ) as file: | |
| text_real_1 = file.read() | |
| with open( | |
| "examples/example_text_real_2.txt", | |
| encoding="utf-8", | |
| ) as file: | |
| text_real_2 = file.read() | |
| with open( | |
| "examples/example_text_LLM_topic.txt", | |
| encoding="utf-8", | |
| ) as file: | |
| text_llm_topic = file.read() | |
| with open( | |
| "examples/example_text_LLM_modification.txt", | |
| encoding="utf-8", | |
| ) as file: | |
| text_llm_modification = file.read() | |
| with open( | |
| "examples/example_text_LLM_entities.txt", | |
| encoding="utf-8", | |
| ) as file: | |
| text_llm_entities = file.read() | |
| except FileNotFoundError: | |
| print("File not found.") | |
| except Exception as e: | |
| print(f"An error occurred: {e}") | |
| title_1 = "Southampton news: Leeds target striker Cameron Archer." | |
| title_2 = "Southampton news: Leeds target striker Cameron Archer." | |
| title_4 = "Japan pledges support for Ukraine with 100-year pact." | |
| image_1 = "examples/example_image_real_1.jpg.webp" | |
| image_2 = "examples/example_image_real_2.jpg.webp" | |
| image_3 = "examples/example_image_real_3.jpg" | |
| image_4 = "examples/example_image_real_4.jpg.webp" | |
| gr.Examples( | |
| examples=[ | |
| [title_1, image_1, text_real_1 + "\n\n" + text_real_2], | |
| [title_1, image_2, text_real_1 + "\n\n" + text_llm_modification], | |
| [title_1, image_3, text_real_1 + "\n\n" + text_llm_topic], | |
| [title_4, image_4, text_llm_entities], | |
| ], | |
| inputs=[news_title, news_image, news_content], | |
| label="Examples", | |
| example_labels=[ | |
| "2 real news", | |
| "1 real news + 1 LLM modification-based news", | |
| "1 real news + 1 LLM topic-based news", | |
| "1 LLM changed-entities news", | |
| ], | |
| ) | |
| demo.launch(share=True) | |