voicebot / app.py
saadawaissheikh's picture
Update app.py
4679a37 verified
raw
history blame
4.16 kB
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)