ADRIANO OLIVETTI CHATBOT
…
import tkinter as tk from tkinter import scrolledtext import random from google import genai from google.genai import types import threading import uuid from playsound import playsound import asyncio import edge_tts import re
# ========================= # API GEMINI # ========================= API_KEY = "XXXX" #inserire la tua api_key client = genai.Client(api_key=API_KEY)
# =========================
# DATABASE CONOSCENZE
# =========================
knowledge =
# =========================
# DOMANDE QUIZ
# =========================
quiz_questions = [
"Quando nacque Adriano Olivetti?",
"Chi era il padre di Adriano Olivetti?",
"Quali servizi offriva agli operai?",
"Che cos'era la Programma 101?",
"Qual era la visione sociale di Olivetti?",
"Cos'era l'Elea 9003?"
]
# =========================
# FUNZIONE GEMINI
# =========================
def chiedi_gemini(domanda):
prompt = f"""
Sei un assistente esperto di Adriano Olivetti.
Rispondi in modo semplice per uno studente.
Domanda:
"""
try:
response = client.models.generate_content(
model="gemini-2.5-flash",
contents=prompt,
config=types.GenerateContentConfig(
thinking_config=types.ThinkingConfig(thinking_budget=0)
),
)
return response.text
except Exception:
return "Errore nel collegamento con Gemini."
# =========================
# TROVA RISPOSTA
# =========================
def trova_risposta(domanda):
domanda_lower = domanda.lower()
for categoria in knowledge.values():
for keyword in categoria["keywords"]:
if keyword in domanda_lower:
return categoria["response"]
return chiedi_gemini(domanda)
def pulisci_testo(text):
# Rimuove gli asterischi
text = text.replace("*", "")
# (opzionale) rimuove altri caratteri strani
text = re.sub(r"[#_~`]", "", text)
return text
# =========================
# FUNZIONE PER PARLARE
# =========================
def speak(text):
# Crea un file mp3 unico
filename = f"output_.mp3″
async def generate():
communicate = edge_tts.Communicate(text, "it-IT-DiegoNeural")
await communicate.save(filename)
# Blocca qui finché l'audio non viene generato
asyncio.run(generate())
# Blocca qui finché l'audio non viene riprodotto tutto
playsound(filename)
# =========================
# INVIA MESSAGGIO
# =========================
def invia():
user_input = entry.get()
if user_input.strip() == "":
return
chat_area.insert(tk.END, "Tu: " + user_input + "\n", "user")
risposta = trova_risposta(user_input) # TESTO ORIGINALE
risposta_voce = pulisci_testo(risposta) # SOLO PER VOCE
chat_area.insert(tk.END, "Bot: " + risposta + "\n\n", "bot")
chat_area.yview(tk.END)
entry.delete(0, tk.END)
window.update()
speak(risposta_voce) #
# =========================
# MODALITÀ INTERROGAZIONE
# =========================
def domanda_casuale():
domanda = random.choice(quiz_questions)
chat_area.insert(tk.END, "Bot (Interrogazione): " + domanda + "\n\n", "quiz")
chat_area.yview(tk.END)
speak(domanda) # legge anche la domanda
# =========================
# INTERFACCIA GRAFICA
# =========================
window = tk.Tk()
window.title("Chatbot Adriano Olivetti")
window.geometry("700×600")
chat_area = scrolledtext.ScrolledText(window, wrap=tk.WORD, font=("Arial", 12))
chat_area.pack(padx=10, pady=10, fill=tk.BOTH, expand=True)
chat_area.tag_config("user", foreground="blue")
chat_area.tag_config("bot", foreground="green")
chat_area.tag_config("quiz", foreground="red")
entry = tk.Entry(window, font=("Arial", 12))
entry.pack(padx=10, pady=5, fill=tk.X)
entry.focus_set()
entry.bind("", lambda event: invia())
send_button = tk.Button(window, text="Invia", command=invia)
send_button.pack(pady=5)
quiz_button = tk.Button(window, text="Fammi una domanda (modalità interrogazione)", command=domanda_casuale)
quiz_button.pack(pady=5)
window.mainloop()
