File size: 3,792 Bytes
af704d1
63c3e87
2b6046a
716ff70
 
f7d4d31
cf344c7
f7d4d31
 
 
 
cf344c7
31e203c
 
 
 
 
 
af704d1
 
 
a941958
cf344c7
f7d4d31
 
 
 
 
 
cf344c7
716ff70
 
 
 
2b6046a
716ff70
2b6046a
716ff70
 
 
c9de19e
716ff70
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c9de19e
 
 
716ff70
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f7d4d31
 
716ff70
f7d4d31
 
716ff70
 
e0d893e
ff2f5a3
716ff70
da1755e
716ff70
 
e0d893e
f7d4d31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import gradio as gr
from gtts import gTTS
import os
import tempfile
import json
import speech_recognition as sr

# Store cart in a temporary storage
cart = []

# Define the menu items dynamically
menu_items = {
    

![image/png](https://cdn-uploads.huggingface.co/production/uploads/66ffdf43008ef6546472a39a/qswHyHB_wd1LiFnsyPpgw.png)

: 10.99,
    ": 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 calculate_total(cart):
    return sum(menu_items[item] for item in cart)

def restaurant_voice_assistant(audio, state_json):
    global cart
    state = json.loads(state_json) if state_json else {}
    response = ""
    voice_path = None

    # Convert audio input to text
    input_text = ""
    if audio:
        recognizer = sr.Recognizer()
        with sr.AudioFile(audio) as source:
            try:
                input_text = recognizer.recognize_google(recognizer.record(source))
            except sr.UnknownValueError:
                input_text = ""

    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 not input_text.strip():
        # Wait for valid input without responding if no input is provided
        return "", None, json.dumps(state)
    elif any(item.lower() in input_text.lower() for item in menu_items):
        # Check if input matches a menu item
        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 "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() 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?"
    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_audio = gr.Audio(type="filepath", label="Your Voice Input")
        output_text = gr.Textbox(label="Response Text")

    with gr.Row():
        voice_output = gr.Audio(label="Response Audio", autoplay=True)

    # Automatically process audio when recording stops
    user_audio.change(restaurant_voice_assistant, inputs=[user_audio, state], outputs=[output_text, voice_output, state])

demo.launch()