| 
							 | 
						from flask import Flask, render_template_string, request, jsonify | 
					
					
						
						| 
							 | 
						from datetime import datetime | 
					
					
						
						| 
							 | 
						import speech_recognition as sr   | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						app = Flask(__name__) | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						orders = [] | 
					
					
						
						| 
							 | 
						user_preferences = {"diet": "all"}   | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						html_code = """ | 
					
					
						
						| 
							 | 
						<!DOCTYPE html> | 
					
					
						
						| 
							 | 
						<html lang="en"> | 
					
					
						
						| 
							 | 
						<head> | 
					
					
						
						| 
							 | 
						    <meta charset="UTF-8"> | 
					
					
						
						| 
							 | 
						    <meta name="viewport" content="width=device-width, initial-scale=1.0"> | 
					
					
						
						| 
							 | 
						    <title>AI Dining Assistant</title> | 
					
					
						
						| 
							 | 
						    <style> | 
					
					
						
						| 
							 | 
						        body { | 
					
					
						
						| 
							 | 
						            font-family: Arial, sans-serif; | 
					
					
						
						| 
							 | 
						            background-color: #f4f4f9; | 
					
					
						
						| 
							 | 
						            display: flex; | 
					
					
						
						| 
							 | 
						            flex-direction: column; | 
					
					
						
						| 
							 | 
						            align-items: center; | 
					
					
						
						| 
							 | 
						            justify-content: center; | 
					
					
						
						| 
							 | 
						            height: 100vh; | 
					
					
						
						| 
							 | 
						            margin: 0; | 
					
					
						
						| 
							 | 
						        } | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						        h1 { | 
					
					
						
						| 
							 | 
						            color: #333; | 
					
					
						
						| 
							 | 
						        } | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						        .mic-button { | 
					
					
						
						| 
							 | 
						            width: 80px; | 
					
					
						
						| 
							 | 
						            height: 80px; | 
					
					
						
						| 
							 | 
						            border-radius: 50%; | 
					
					
						
						| 
							 | 
						            background-color: #007bff; | 
					
					
						
						| 
							 | 
						            color: white; | 
					
					
						
						| 
							 | 
						            font-size: 24px; | 
					
					
						
						| 
							 | 
						            border: none; | 
					
					
						
						| 
							 | 
						            display: flex; | 
					
					
						
						| 
							 | 
						            align-items: center; | 
					
					
						
						| 
							 | 
						            justify-content: center; | 
					
					
						
						| 
							 | 
						            cursor: pointer; | 
					
					
						
						| 
							 | 
						            box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1); | 
					
					
						
						| 
							 | 
						            transition: background-color 0.3s; | 
					
					
						
						| 
							 | 
						        } | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						        .mic-button:hover { | 
					
					
						
						| 
							 | 
						            background-color: #0056b3; | 
					
					
						
						| 
							 | 
						        } | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						        .status { | 
					
					
						
						| 
							 | 
						            margin-top: 20px; | 
					
					
						
						| 
							 | 
						            font-size: 18px; | 
					
					
						
						| 
							 | 
						            color: #666; | 
					
					
						
						| 
							 | 
						        } | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						        .listening { | 
					
					
						
						| 
							 | 
						            color: green; | 
					
					
						
						| 
							 | 
						            font-weight: bold; | 
					
					
						
						| 
							 | 
						        } | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						        .response { | 
					
					
						
						| 
							 | 
						            margin-top: 20px; | 
					
					
						
						| 
							 | 
						            padding: 10px; | 
					
					
						
						| 
							 | 
						            background-color: #fff; | 
					
					
						
						| 
							 | 
						            border: 1px solid #ddd; | 
					
					
						
						| 
							 | 
						            border-radius: 5px; | 
					
					
						
						| 
							 | 
						            box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1); | 
					
					
						
						| 
							 | 
						            width: 300px; | 
					
					
						
						| 
							 | 
						            text-align: center; | 
					
					
						
						| 
							 | 
						        } | 
					
					
						
						| 
							 | 
						    </style> | 
					
					
						
						| 
							 | 
						</head> | 
					
					
						
						| 
							 | 
						<body> | 
					
					
						
						| 
							 | 
						    <h1>AI Dining Assistant</h1> | 
					
					
						
						| 
							 | 
						    <button class="mic-button" id="mic-button">π€</button> | 
					
					
						
						| 
							 | 
						    <div class="status" id="status">Press the mic button to start listening...</div> | 
					
					
						
						| 
							 | 
						    <div class="response" id="response" style="display: none;">Response will appear here...</div> | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						    <script> | 
					
					
						
						| 
							 | 
						        const micButton = document.getElementById('mic-button'); | 
					
					
						
						| 
							 | 
						        const status = document.getElementById('status'); | 
					
					
						
						| 
							 | 
						        const response = document.getElementById('response'); | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						        if (!window.MediaRecorder) { | 
					
					
						
						| 
							 | 
						            alert("Your browser does not support audio recording."); | 
					
					
						
						| 
							 | 
						        } | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						        let mediaRecorder; | 
					
					
						
						| 
							 | 
						        let audioChunks = []; | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						        micButton.addEventListener('click', async () => { | 
					
					
						
						| 
							 | 
						            navigator.mediaDevices.getUserMedia({ audio: true }) | 
					
					
						
						| 
							 | 
						                .then(stream => { | 
					
					
						
						| 
							 | 
						                    mediaRecorder = new MediaRecorder(stream); | 
					
					
						
						| 
							 | 
						                    mediaRecorder.start(); | 
					
					
						
						| 
							 | 
						                    status.textContent = 'Listening...'; | 
					
					
						
						| 
							 | 
						                    status.classList.add('listening'); | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						                    mediaRecorder.ondataavailable = event => { | 
					
					
						
						| 
							 | 
						                        audioChunks.push(event.data); | 
					
					
						
						| 
							 | 
						                    }; | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						                    mediaRecorder.onstop = async () => { | 
					
					
						
						| 
							 | 
						                        const audioBlob = new Blob(audioChunks, { type: 'audio/wav' }); | 
					
					
						
						| 
							 | 
						                        const formData = new FormData(); | 
					
					
						
						| 
							 | 
						                        formData.append('audio', audioBlob); | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						                        status.textContent = 'Processing...'; | 
					
					
						
						| 
							 | 
						                        status.classList.remove('listening'); | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						                        try { | 
					
					
						
						| 
							 | 
						                            const result = await fetch('/process-audio', { | 
					
					
						
						| 
							 | 
						                                method: 'POST', | 
					
					
						
						| 
							 | 
						                                body: formData, | 
					
					
						
						| 
							 | 
						                            }); | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						                            const data = await result.json(); | 
					
					
						
						| 
							 | 
						                            response.textContent = data.response; | 
					
					
						
						| 
							 | 
						                            response.style.display = 'block'; | 
					
					
						
						| 
							 | 
						                            status.textContent = 'Press the mic button to start listening...'; | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						                            // Use browser text-to-speech | 
					
					
						
						| 
							 | 
						                            const utterance = new SpeechSynthesisUtterance(data.response); | 
					
					
						
						| 
							 | 
						                            speechSynthesis.speak(utterance); | 
					
					
						
						| 
							 | 
						                        } catch (error) { | 
					
					
						
						| 
							 | 
						                            response.textContent = 'Error occurred. Please try again.'; | 
					
					
						
						| 
							 | 
						                            response.style.display = 'block'; | 
					
					
						
						| 
							 | 
						                            status.textContent = 'Press the mic button to start listening...'; | 
					
					
						
						| 
							 | 
						                        } | 
					
					
						
						| 
							 | 
						                    }; | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						                    setTimeout(() => { | 
					
					
						
						| 
							 | 
						                        mediaRecorder.stop(); | 
					
					
						
						| 
							 | 
						                    }, 5000); // Stop recording after 5 seconds | 
					
					
						
						| 
							 | 
						                }) | 
					
					
						
						| 
							 | 
						                .catch(err => { | 
					
					
						
						| 
							 | 
						                    status.textContent = 'Microphone access denied.'; | 
					
					
						
						| 
							 | 
						                }); | 
					
					
						
						| 
							 | 
						        }); | 
					
					
						
						| 
							 | 
						    </script> | 
					
					
						
						| 
							 | 
						</body> | 
					
					
						
						| 
							 | 
						</html> | 
					
					
						
						| 
							 | 
						""" | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						@app.route('/') | 
					
					
						
						| 
							 | 
						def index(): | 
					
					
						
						| 
							 | 
						    return render_template_string(html_code) | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						@app.route('/process-audio', methods=['POST']) | 
					
					
						
						| 
							 | 
						def process_audio(): | 
					
					
						
						| 
							 | 
						    try: | 
					
					
						
						| 
							 | 
						        audio_file = request.files['audio'] | 
					
					
						
						| 
							 | 
						        recognizer = sr.Recognizer() | 
					
					
						
						| 
							 | 
						        with sr.AudioFile(audio_file) as source: | 
					
					
						
						| 
							 | 
						            audio_data = recognizer.record(source) | 
					
					
						
						| 
							 | 
						            command = recognizer.recognize_google(audio_data) | 
					
					
						
						| 
							 | 
						            response = process_command(command) | 
					
					
						
						| 
							 | 
						            return jsonify({"response": response}) | 
					
					
						
						| 
							 | 
						    except Exception as e: | 
					
					
						
						| 
							 | 
						        return jsonify({"response": f"An error occurred: {str(e)}"}) | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						def process_command(command): | 
					
					
						
						| 
							 | 
						    """Process the user's voice command and return a response.""" | 
					
					
						
						| 
							 | 
						    global orders | 
					
					
						
						| 
							 | 
						    command = command.lower() | 
					
					
						
						| 
							 | 
						    if "menu" in command: | 
					
					
						
						| 
							 | 
						        return "Our menu includes paneer butter masala, fried rice, and cold coffee." | 
					
					
						
						| 
							 | 
						    elif "order" in command: | 
					
					
						
						| 
							 | 
						        return "Your order has been placed." | 
					
					
						
						| 
							 | 
						    return "Sorry, I didn't understand your request." | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						if __name__ == "__main__": | 
					
					
						
						| 
							 | 
						    app.run(host="0.0.0.0", port=7860) | 
					
					
						
						| 
							 | 
						
 |