import gradio as gr from gtts import gTTS import os import tempfile import json # 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 } 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 restaurant_voice_assistant(input_text, state_json): global cart state = json.loads(state_json) if state_json else {} response = "" voice_path = None if not state.get("menu_shown", False): # Show menu dynamically response = "Welcome to our restaurant! Here is our menu:\n" for item, price in menu_items.items(): response += f"{item}: ${price:.2f}\n" response += "\nPlease tell me the item you would like to add to your cart." state["menu_shown"] = True elif "add_to_cart" in input_text.lower(): item = input_text.replace("add to cart", "").strip() if item in menu_items: cart.append(item) response = f"{item} has been added to your cart. Would you like to add anything else?" else: response = f"Sorry, {item} is not on the menu. Please choose an item from the menu." elif "menu" in input_text.lower(): response = "Here is our menu again:\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 "final order" in input_text.lower(): if cart: response = "Your final order includes:\n" for item in cart: response += f"- {item}\n" response += "\nThank you for ordering!" cart = [] # Clear cart after finalizing order else: response = "Your cart is empty. Would you like to order something?" else: response = "I didn’t quite catch that. Please tell me what you’d like to order." voice_path = generate_voice_response(response) return response, voice_path, json.dumps(state) with gr.Blocks() as demo: state = gr.State(value=json.dumps({})) with gr.Row(): user_input = gr.Textbox(label="Your Voice Input", placeholder="Type here or use voice input.") output_text = gr.Textbox(label="Response Text") with gr.Row(): voice_output = gr.Audio(label="Response Audio") submit_btn = gr.Button("Submit") submit_btn.click(restaurant_voice_assistant, inputs=[user_input, state], outputs=[output_text, voice_output, state]) demo.launch()