Spaces:
Sleeping
Sleeping
| import os | |
| os.system("pip install -q gradio torch transformers") | |
| import gradio as gr | |
| import torch | |
| import random | |
| from transformers import GPT2LMHeadModel, GPT2Tokenizer | |
| tokenizer = GPT2Tokenizer.from_pretrained('gpt2-medium') | |
| model = GPT2LMHeadModel.from_pretrained('RandomNameAnd6/DharGPT-Small') | |
| # Read real titles from file | |
| with open('dhar_mann_titles.txt', 'r') as file: | |
| dhar_mann_titles = file.readlines() | |
| def levenshtein_distance(s1, s2): | |
| """ | |
| Compute the Levenshtein distance between two strings. | |
| Parameters: | |
| - s1 (str): The first string. | |
| - s2 (str): The second string. | |
| Returns: | |
| - int: The Levenshtein distance between the two strings. | |
| """ | |
| if len(s1) < len(s2): | |
| return levenshtein_distance(s2, s1) | |
| if len(s2) == 0: | |
| return len(s1) | |
| previous_row = range(len(s2) + 1) | |
| for i, c1 in enumerate(s1): | |
| current_row = [i + 1] | |
| for j, c2 in enumerate(s2): | |
| insertions = previous_row[j + 1] + 1 | |
| deletions = current_row[j] + 1 | |
| substitutions = previous_row[j] + (c1 != c2) | |
| current_row.append(min(insertions, deletions, substitutions)) | |
| previous_row = current_row | |
| return previous_row[-1] | |
| def string_similarity_index(original_text, comparison_text, threshold=0.75): | |
| """ | |
| Calculate the similarity index between two strings based on Levenshtein distance | |
| and compare it to a threshold. | |
| Parameters: | |
| - original_text (str): The original text. | |
| - comparison_text (str): The text to compare for similarity. | |
| - threshold (float): The non-original threshold score (0 to 1). | |
| Returns: | |
| - bool: True if the similarity score is above the threshold, False otherwise. | |
| """ | |
| # Calculate the Levenshtein distance | |
| distance = levenshtein_distance(original_text, comparison_text) | |
| # Calculate the maximum possible distance | |
| max_distance = max(len(original_text), len(comparison_text)) | |
| # Calculate the similarity score | |
| similarity_score = 1 - distance / max_distance | |
| # Compare the similarity score to the threshold | |
| return similarity_score >= threshold | |
| def clean_title(input_string): | |
| if input_string.endswith(" | Dhar Mann"): | |
| input_string = input_string[:-12] | |
| elif input_string.endswith(" | Dhar Mann Studios"): | |
| input_string = input_string[:-20] | |
| # Attempt to remove all text after the first comma | |
| comma_index = input_string.find(',') | |
| if comma_index != -1: | |
| input_string = input_string[:comma_index] | |
| return input_string | |
| # Function to generate an AI title | |
| def generate_ai_title(): | |
| while True: | |
| inputs = tokenizer(["<|startoftext|>"]*1, return_tensors="pt") | |
| outputs = model.generate(**inputs, max_new_tokens=48, use_cache=True, temperature=0.85, do_sample=True) | |
| generated_title = (tokenizer.batch_decode(outputs)[0])[15:-13].strip() | |
| # Check for similarity with existing titles | |
| is_unique = True | |
| for title in dhar_mann_titles: | |
| title = title.strip() # Remove any extra whitespace characters like newlines | |
| if string_similarity_index(clean_title(generated_title), clean_title(title)): | |
| is_unique = False | |
| print(f"Regenerating! Generated title was: \"{generated_title}\", and the real title was \"{title}\"") | |
| break | |
| if is_unique: | |
| return generated_title | |
| # Function to check user's answer and update score | |
| def check_answer(user_choice, real_index, score): | |
| if (user_choice == "Option 1" and real_index == 0) or (user_choice == "Option 2" and real_index == 1): | |
| score += 1 | |
| return f"Correct! Your current score is: {score}", score, gr.update(visible=True), gr.update(visible=False) | |
| else: | |
| score = 0 | |
| return f"Incorrect. Your score has been reset to: {score}", score, gr.update(visible=False), gr.update(visible=True) | |
| # Function to update options | |
| def update_options(): | |
| real_index = random.choice([0, 1]) | |
| real_title = random.choice(dhar_mann_titles).strip() | |
| ai_title = generate_ai_title() | |
| if real_index == 0: | |
| return real_title, ai_title, real_index | |
| else: | |
| return ai_title, real_title, real_index | |
| def create_interface(): | |
| with gr.Blocks() as demo: | |
| score = gr.State(0) | |
| real_index_state = gr.State(0) | |
| score_display = gr.Markdown("## Real or AI - Dhar Mann\n**Current Score: 0**") | |
| with gr.Row(): | |
| with gr.Column(): | |
| gr.Markdown("### Option 1") | |
| option1_box = gr.Markdown("") | |
| with gr.Column(): | |
| gr.Markdown("### Option 2") | |
| option2_box = gr.Markdown("") | |
| with gr.Row(): | |
| choice = gr.Radio(["Option 1", "Option 2"], label="Which one do you think is real?") | |
| submit_button = gr.Button("Submit") | |
| result_text = gr.Markdown("") | |
| continue_button = gr.Button("Continue", visible=False) | |
| restart_button = gr.Button("Restart", visible=False) | |
| def on_submit(user_choice, option1, option2, real_index, score): | |
| result, new_score, continue_visibility, restart_visibility = check_answer(user_choice, real_index, score) | |
| return result, new_score, continue_visibility, restart_visibility | |
| def on_continue(score): | |
| option1, option2, real_index = update_options() | |
| new_score_display = f"## Real or AI - Dhar Mann\n**Current Score: {score}**" | |
| return option1, option2, real_index, new_score_display, gr.update(value=None), "", gr.update(visible=False), gr.update(visible=False) | |
| def on_restart(): | |
| return on_continue(0) | |
| # Initialize options | |
| option1, option2, real_index = update_options() | |
| submit_button.click(on_submit, inputs=[choice, option1_box, option2_box, real_index_state, score], outputs=[result_text, score, continue_button, restart_button]) | |
| continue_button.click(on_continue, inputs=score, outputs=[option1_box, option2_box, real_index_state, score_display, choice, result_text, continue_button, restart_button]) | |
| restart_button.click(on_restart, outputs=[option1_box, option2_box, real_index_state, score_display, choice, result_text, continue_button, restart_button]) | |
| # Set initial content for option boxes | |
| option1_box.value = option1 | |
| option2_box.value = option2 | |
| real_index_state.value = real_index | |
| return demo | |
| demo = create_interface() | |
| demo.launch() |