Spaces:
Running
Running
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) | |