import gradio as gr from gtts import gTTS import os import speech_recognition as sr import time # Menu for the restaurant menu = { "Starters": ["Soup", "Spring Rolls"], "Main Course": ["Paneer Butter Masala", "Chicken Curry", "Veg Biryani"], "Breads": ["Roti", "Naan", "Paratha"], "Desserts": ["Gulab Jamun", "Ice Cream"], "Drinks": ["Mango Lassi", "Soda", "Water"] } conversation_history = [] context = {"last_action": None, "order": {}} # Text-to-Speech Function def speak_and_save(text): tts = gTTS(text=text, lang='en') audio_path = "response.mp3" tts.save(audio_path) return audio_path # Speech Recognition Function def recognize_speech(audio_file_path): if not audio_file_path or not os.path.exists(audio_file_path): return "No valid audio input provided. Please try again." recognizer = sr.Recognizer() try: with sr.AudioFile(audio_file_path) as source: audio_data = recognizer.record(source) text = recognizer.recognize_google(audio_data) return text except sr.UnknownValueError: return "I didn't catch that. Could you repeat?" except sr.RequestError: return "There was an issue processing your speech. Try again later." # Voice Assistant Logic def process_order(audio_file_path): if not audio_file_path or not os.path.exists(audio_file_path): response = "No audio input detected. Please record or upload your voice." return response, speak_and_save(response) user_input = recognize_speech(audio_file_path) conversation_history.append(f"Customer: {user_input}") if user_input.startswith("No audio input detected") or user_input.startswith("I didn't"): response = user_input conversation_history.append(f"AI: {response}") return response, speak_and_save(response) global context response = "" # Greet the customer if context["last_action"] is None: response = "Welcome to our restaurant. How can I assist you today?" context["last_action"] = "greet" elif "menu" in user_input.lower(): response = "Here is our menu:\n" for category, items in menu.items(): response += f"{category}: {', '.join(items)}\n" response += "What would you like to order?" context["last_action"] = "show_menu" elif "order" in user_input.lower() or any(item.lower() in user_input.lower() for item in sum(menu.values(), [])): words = user_input.split() quantity = 1 # Default quantity item_name = None for word in words: if word.isdigit(): quantity = int(word) for category, items in menu.items(): if word in items: item_name = word break if item_name: context["order"][item_name] = context["order"].get(item_name, 0) + quantity response = f"I've added {quantity} {item_name}(s) to your order. Would you like anything else?" else: response = "I couldn't identify the item. Could you please repeat your order?" context["last_action"] = "place_order" elif "no" in user_input.lower() or "that's it" in user_input.lower(): order_summary = ", ".join([f"{item} (x{qty})" for item, qty in context["order"].items()]) response = f"Your final order is: {order_summary}. Thank you for your order. Your food will arrive shortly. Enjoy your meal!" conversation_history.append(f"Order Summary: {context['order']}") context["last_action"] = "final_order" context["order"] = {} elif "everything alright" in user_input.lower() or "anything else" in user_input.lower(): response = "I hope you're enjoying your meal. Can I bring you anything else?" context["last_action"] = "check_meal" else: response = "I'm not sure what you meant. Could you clarify?" context["last_action"] = "clarify" conversation_history.append(f"AI: {response}") audio_response_path = speak_and_save(response) return response, audio_response_path # Gradio Interface with Auto-Play After 3 Seconds def create_interface(): with gr.Blocks() as app: gr.Markdown("## Restaurant Voice Assistant") gr.Markdown("Talk to our voice assistant to place your order or ask about the menu!") audio_input = gr.Audio(type="filepath", label="Your Voice Input") text_response = gr.Textbox(label="Text Response") audio_response = gr.Audio(label="Audio Response", interactive=False) # Add JavaScript for auto-playing audio 3 seconds after response gr.HTML(""" """) def interact(audio_file_path): return process_order(audio_file_path) audio_input.change(interact, inputs=audio_input, outputs=[text_response, audio_response]) return app if __name__ == "__main__": app = create_interface() app.launch()