File size: 3,470 Bytes
d67403c
b0c4baa
d67403c
397d198
 
 
d67403c
397d198
b0c4baa
d67403c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
397d198
d67403c
 
 
 
397d198
 
d67403c
 
 
 
397d198
d67403c
 
 
 
397d198
d67403c
 
 
 
 
 
 
 
 
 
 
397d198
a6ae8fd
 
 
 
 
 
 
82555d7
d67403c
 
 
82555d7
d67403c
 
 
397d198
d67403c
 
 
82555d7
d67403c
 
 
 
 
 
 
 
 
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
import base64
import random
import numpy as np
import speech_recognition as sr
import edge_tts
import tempfile
import json

# Load the food menu from menu.json
def load_food_menu():
    with open("menu.json") as f:
        return json.load(f)

food_menu = load_food_menu()

class AudioProcessor:
    @staticmethod
    def encode_audio(data, sample_rate):
        encoded = base64.b64encode(data.tobytes()).decode("UTF-8")
        return {
            "realtimeInput": {
                "mediaChunks": [
                    {
                        "mimeType": f"audio/pcm;rate={sample_rate}",
                        "data": encoded,
                    }
                ],
            },
        }

    @staticmethod
    def process_audio_response(data):
        audio_data = base64.b64decode(data)
        return np.frombuffer(audio_data, dtype=np.int16)


class OrderAssistant:
    def __init__(self, food_menu):
        self.food_menu = food_menu
        self.audio_processor = AudioProcessor()

    def get_food_suggestion(self, food_type, dietary_preference):
        if food_type in self.food_menu:
            return random.choice(self.food_menu[food_type].get(dietary_preference, []))
        return "Sorry, we don't have that option."

    def recognize_speech_from_mic(self):
        recognizer = sr.Recognizer()
        with sr.Microphone() as source:
            print("Say something!")
            audio = recognizer.listen(source)
            try:
                return recognizer.recognize_google(audio)  # Google Speech Recognition
            except sr.UnknownValueError:
                return "Sorry I didn't catch that"
            except sr.RequestError:
                return "Sorry, I'm having trouble reaching the service"

    async def text_to_speech(self, text):
        # Ensure consistent indentation for the body of the function
        communicate = edge_tts.Communicate(text, "en-US-AriaNeural", rate="+0%", pitch="+0Hz")  # Fixed indentation
        with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as tmp_file:
            tmp_path = tmp_file.name
            await communicate.save(tmp_path)
        return tmp_path

    async def food_order_assistant(self, audio_input, food_type):
        greeting_text = "Welcome to the restaurant! What would you like to order today? Are you looking for Vegan, Halal, or Guilt-Free options?"
        audio_path = await self.text_to_speech(greeting_text)

        dietary_preference = self.recognize_speech_from_mic().lower()
        if dietary_preference not in ["vegan", "halal", "guilt-free"]:
            dietary_preference = "vegan"  # Default to Vegan if unrecognized

        suggestion = self.get_food_suggestion(food_type, dietary_preference)
        suggestion_text = f"I suggest you try {suggestion}. Does that sound good?"
        suggestion_audio = await self.text_to_speech(suggestion_text)

        confirmation = self.recognize_speech_from_mic().lower()
        if "yes" in confirmation:
            confirmation_text = f"Your order for {suggestion} has been confirmed. Sending the order to the kitchen."
            confirmation_audio = await self.text_to_speech(confirmation_text)
            return confirmation_audio, f"Confirmed order: {suggestion}"
        else:
            cancellation_text = "Okay, let's try again."
            cancellation_audio = await self.text_to_speech(cancellation_text)
            return cancellation_audio, "Order not confirmed"