File size: 4,785 Bytes
af704d1
63c3e87
af704d1
 
 
c480fa5
 
3ac7c45
c480fa5
 
c2f90f0
cf344c7
af704d1
 
cf344c7
af704d1
cf344c7
af704d1
 
 
 
 
a941958
cf344c7
3ac7c45
 
 
af704d1
 
 
 
 
 
cf344c7
c480fa5
3ac7c45
c2f90f0
3ac7c45
 
af704d1
c2f90f0
 
 
c480fa5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3ac7c45
 
 
a941958
3ac7c45
 
c480fa5
 
 
 
 
 
 
 
3ac7c45
 
0b9fd9a
3ac7c45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0b9fd9a
3ac7c45
 
c480fa5
a941958
c480fa5
 
 
 
a941958
3ac7c45
 
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import gradio as gr
from gtts import gTTS
import os
import tempfile
import json
import sounddevice as sd
import queue
import threading
from scipy.io.wavfile import write
import speech_recognition as sr
import subprocess

# 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 play_audio(audio_path):
    try:
        subprocess.run(["ffplay", "-nodisp", "-autoexit", audio_path], check=True)
    except Exception as e:
        print("Error playing audio:", e)

def calculate_total(cart):
    return sum(menu_items[item] for item in cart)

# Audio recording setup
q = queue.Queue()
def audio_callback(indata, frames, time, status):
    if status:
        print(status)
    q.put(indata.copy())

def record_audio():
    fs = 16000  # Sample rate
    seconds = 5  # Duration
    print("Recording...")
    audio_data = []
    with sd.InputStream(callback=audio_callback, samplerate=fs, channels=1):
        for _ in range(int(fs * seconds / 1024)):
            audio_data.append(q.get())
    print("Recording finished.")
    return b"".join(audio_data)

def restaurant_voice_assistant():
    global cart
    recognizer = sr.Recognizer()

    # Continuously listen for user commands
    while True:
        try:
            audio_data = record_audio()
            with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as temp_audio:
                temp_audio.write(audio_data)
                temp_audio_path = temp_audio.name

            with sr.AudioFile(temp_audio_path) as source:
                audio = recognizer.record(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)
                play_audio(audio_path)

        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()