MultispeciesAI / app.py
motherearthly's picture
Update app.py
f00dfca verified
import gradio as gr
import json
from transformers import pipeline
from gtts import gTTS
import os
import re
# Load personas
def load_personas():
personas = []
for i in range(1, 7):
with open(f'personas/persona_{i}.json', 'r') as f:
personas.append(json.load(f))
return personas
personas = load_personas()
# Use distilgpt2 for speed
bot = pipeline("text-generation", model="distilgpt2")
# Swear filter list
BAD_WORDS = ["fuck", "shit", "bitch", "asshole"]
def clean_response(text):
pattern = re.compile(r"|".join(BAD_WORDS), re.IGNORECASE)
return pattern.sub("[censored]", text)
# Global state
history = ""
round_number = 0
# Debate function
def next_round(topic, consensus_level):
global round_number, history
if round_number >= 6:
return "Debate complete.", None, gr.Button(visible=False)
persona = personas[round_number]
# Adjust prompt based on consensus slider
if consensus_level > 50:
style = "Aim to find agreement and common ground."
else:
style = "Challenge previous points and offer a critical view."
prompt = f"{persona['prompt_style']} {style}\n{history}\n{persona['name']}:"
response = bot(prompt, max_length=50, do_sample=True)[0]['generated_text']
response_text = response[len(prompt):].strip().split("\n")[0]
# Filter bad words
response_text = clean_response(response_text)
history += f"{persona['name']}: {response_text}\n"
# Generate TTS
tts = gTTS(response_text, lang='en')
audio_file = f"temp_{round_number}.mp3"
tts.save(audio_file)
round_number += 1
if round_number >= 6:
button_visibility = gr.Button(visible=False)
else:
button_visibility = gr.Button(visible=True)
return f"Round {round_number}: {persona['name']} says:\n" + response_text, audio_file, button_visibility
with gr.Blocks() as iface:
gr.Markdown("# AI Persona Debate")
topic = gr.Textbox(label="Enter Debate Question")
consensus = gr.Slider(0, 100, value=50, label="Disagreement <-> Consensus")
start_btn = gr.Button("Start Debate")
output_text = gr.Textbox(label="Debate Response")
output_audio = gr.Audio(label="Voice", autoplay=True)
next_btn = gr.Button("Trigger Next Round", visible=False)
def start_debate(user_topic, consensus_level):
global history, round_number
history = f"Debate Topic: {user_topic}\n"
round_number = 0
return next_round(user_topic, consensus_level)
start_btn.click(start_debate, inputs=[topic, consensus], outputs=[output_text, output_audio, next_btn])
next_btn.click(next_round, inputs=[topic, consensus], outputs=[output_text, output_audio, next_btn])
iface.launch()