voicebot / app.py
saadawaissheikh's picture
Update app.py
4679a37 verified
import os
import re
import gradio as gr
from gtts import gTTS
from datetime import datetime
from openpyxl import Workbook, load_workbook
from langchain.memory import ConversationBufferMemory
# --- Gemini setup ---
import google.generativeai as genai
genai.configure(api_key="AIzaSyBJFmohAmhmqXQlM3fVxj8MLegVb26kyJk")
model = genai.GenerativeModel("models/gemini-1.5-flash-latest")
# --- Restaurant menu ---
MENU = {
"Cheeseburger": 5.99,
"Fries": 2.99,
"Coke": 1.99,
"Pizza": 12.99,
"Chicken Wings": 7.99,
"Salad": 6.99
}
# --- Memory with LangChain ---
memory = ConversationBufferMemory(return_messages=True)
chat_history = []
order = []
customer_name = ""
# --- Excel Setup ---
EXCEL_FILE = "orders.xlsx"
def setup_excel():
if not os.path.exists(EXCEL_FILE):
wb = Workbook()
ws = wb.active
ws.title = "Orders"
ws.append(["Order ID", "Date", "Customer", "Items", "Total", "Time"])
wb.save(EXCEL_FILE)
setup_excel()
def save_to_excel(name, items):
wb = load_workbook(EXCEL_FILE)
ws = wb.active
order_id = f"ORD{ws.max_row:04d}"
now = datetime.now()
total = sum(qty * MENU[item] for item, qty in items)
items_str = ", ".join(f"{qty} x {item}" for item, qty in items)
ws.append([order_id, now.strftime("%Y-%m-%d"), name, items_str, f"${total:.2f}", now.strftime("%H:%M:%S")])
wb.save(EXCEL_FILE)
return order_id
# --- TTS ---
def clean_text(text):
text = re.sub(r"\*\*(.*?)\*\*", r"\1", text) # Remove bold
text = re.sub(r"Bot\s*:\s*", "", text, flags=re.IGNORECASE) # Remove "Bot:"
return text.strip()
def speak(text, filename="response.mp3"):
tts = gTTS(text=clean_text(text))
tts.save(filename)
return filename
# --- Generate Gemini response ---
def generate_response(user_input):
global order, customer_name
menu_str = "\n".join([f"{item}: ${price}" for item, price in MENU.items()])
order_summary = ", ".join([f"{qty} x {item}" for item, qty in order]) if order else "No items yet"
prompt = f"""
You are a friendly, intelligent restaurant assistant at 'Systaurant'.
Menu:
{menu_str}
Customer Name: {customer_name}
Current Order: {order_summary}
Instructions:
- Ask for name if not known
- Show menu if asked
- Extract food items and quantity
- Say "Order summary" and ask "Confirm?" when user is done
- Respond naturally, no "Bot:" prefix
Conversation so far:
"""
for m in memory.chat_memory.messages:
role = "Customer" if m.type == "human" else "Bot"
prompt += f"{role}: {m.content}\n"
prompt += f"Customer: {user_input}\nBot:"
try:
response = model.generate_content(prompt)
return response.text
except Exception as e:
return f"❌ Gemini Error: {e}"
# --- Chat handler ---
def handle_chat(user_input):
global customer_name, order
memory.chat_memory.add_user_message(user_input)
bot_reply = generate_response(user_input)
memory.chat_memory.add_ai_message(bot_reply)
if "my name is" in user_input.lower():
customer_name = user_input.split("my name is")[-1].strip().split()[0].title()
for item in MENU:
if item.lower() in user_input.lower():
qty = 1
for word in user_input.lower().split():
if word.isdigit():
qty = int(word)
break
order.append((item, qty))
if "confirm" in user_input.lower() or "yes" in user_input.lower():
if customer_name and order:
order_id = save_to_excel(customer_name, order)
bot_reply += f"\nβœ… Your order ID is {order_id}. Thank you for ordering from Systaurant!"
audio_file = speak(bot_reply)
return bot_reply, audio_file
# --- Gradio UI ---
gr.Interface(
fn=handle_chat,
inputs=gr.Textbox(label="πŸ‘€ You", placeholder="Type your order here..."),
outputs=[
gr.Textbox(label="πŸ€– Bot Response"),
gr.Audio(label="πŸ”Š Speaking", autoplay=True)
],
title="πŸ” Systaurant Voice Bot",
description="A smart voice-enabled assistant to take food orders.",
theme="soft"
).launch(share=True)