import gradio as gr from gtts import gTTS import os import tempfile import json import speech_recognition as sr import threading import time from playsound import playsound # Store cart in a temporary storage cart = [] # Define the menu items dynamically menu_items = { "Pizza": 10.99, "Burger": 8.49, "Pasta": 12.99, "Salad": 7.99, "Soda": 2.49 } # To manage playback control playback_control = {"stop": False, "pause": False} def generate_voice_response(text): tts = gTTS(text) temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") temp_file.close() tts.save(temp_file.name) return temp_file.name def calculate_total(cart): return sum(menu_items[item] for item in cart) def play_audio_with_control(audio_path): global playback_control playback_control["stop"] = False playback_control["pause"] = False try: for _ in range(3): # Retry loop in case of interruptions if playback_control["stop"]: break playsound(audio_path) break except Exception as e: print("Error playing audio:", e) def restaurant_voice_assistant(): global cart recognizer = sr.Recognizer() # Continuously listen for user commands while True: with sr.Microphone() as source: print("Listening for input...") try: audio = recognizer.listen(source) input_text = recognizer.recognize_google(audio) print("You said:", input_text) # Process input text if "menu" in input_text.lower(): response = "Here is our menu:\n" for item, price in menu_items.items(): response += f"{item}: ${price:.2f}\n" response += "\nWhat would you like to add to your cart?" elif any(item.lower() in input_text.lower() for item in menu_items): for item in menu_items: if item.lower() in input_text.lower(): cart.append(item) total = calculate_total(cart) response = f"{item} has been added to your cart. Your current cart includes:\n" for cart_item in cart: response += f"- {cart_item}: ${menu_items[cart_item]:.2f}\n" response += f"\nTotal: ${total:.2f}. Would you like to add anything else?" break elif "final order" in input_text.lower() or "submit order" in input_text.lower(): if cart: total = calculate_total(cart) response = "Your final order includes:\n" for item in cart: response += f"- {item}: ${menu_items[item]:.2f}\n" response += f"\nTotal: ${total:.2f}.\nThank you for ordering!" cart = [] # Clear cart after finalizing order else: response = "Your cart is empty. Would you like to order something?" elif "stop" in input_text.lower(): playback_control["stop"] = True response = "Audio playback stopped." elif "pause" in input_text.lower(): playback_control["pause"] = True response = "Audio playback paused." elif "resume" in input_text.lower(): playback_control["pause"] = False response = "Resuming audio playback." else: response = "I didn’t quite catch that. Please tell me what you’d like to order." # Generate and play audio response audio_path = generate_voice_response(response) threading.Thread(target=play_audio_with_control, args=(audio_path,)).start() except sr.UnknownValueError: print("Sorry, I didn’t catch that. Could you please repeat?") except Exception as e: print("Error occurred:", e) # Run the assistant threading.Thread(target=restaurant_voice_assistant).start()