voicemenu143 / app.py
lokesh341's picture
Update app.py
13b2891 verified
raw
history blame
7.23 kB
from flask import Flask, render_template, request, jsonify, session
from simple_salesforce import Salesforce
import json
import os
import time
from transformers import pipeline
import torch
from gtts import gTTS
from pydub import AudioSegment
from pydub.silence import detect_nonsilent
from transformers import AutoConfig # Import AutoConfig for the config object
from waitress import serve
app = Flask(__name__)
app.secret_key = 'your_secret_key_here' # Secret key for session management
# Sample menu data
menu_data = {
"Main Course": [
{"name": "Chicken Biryani", "price": 250},
{"name": "Veg Biryani", "price": 200},
{"name": "Mutton Biryani", "price": 300},
],
"Appetizers": [
{"name": "Paneer Tikka", "price": 180},
{"name": "Chicken Wings", "price": 220},
]
}
# Salesforce credentials (Replace with actual values)
try:
print("Attempting to connect to Salesforce...")
sf = Salesforce(username='[email protected]', password='Sati@1020', security_token='sSSjyhInIsUohKpG8sHzty2q')
print("Connected to Salesforce successfully!")
print("User Info:", sf.UserInfo) # Log the user info to verify the connection
except Exception as e:
print(f"Failed to connect to Salesforce: {str(e)}")
# Setup Whisper ASR model and Salesforce credentials
device = "cuda" if torch.cuda.is_available() else "cpu"
config = AutoConfig.from_pretrained("openai/whisper-small")
config.update({"timeout": 60})
# Route for the Welcome Page (Page 1)
@app.route("/")
def index():
return render_template("index.html")
# Route for the Menu Pages (Page 2)
@app.route("/menu", methods=["GET"])
def menu_page():
category = request.args.get('category', 'Main Course')
if category not in menu_data:
return jsonify({"error": "Category not found"}), 404
return render_template("menu_page.html", menu_items=menu_data[category])
# Route to add items to the cart
@app.route("/add-to-cart", methods=["POST"])
def add_to_cart():
item_data = request.get_json()
item_name = item_data.get('name')
item_price = item_data.get('price')
# If cart is not in session, initialize it
if 'cart' not in session:
session['cart'] = []
# Add item to the cart
session['cart'].append({"name": item_name, "price": item_price})
return jsonify({"message": f"{item_name} added to cart!"}), 200
# Route for Cart Page (Page 3)
@app.route("/cart", methods=["GET"])
def cart_page():
if 'cart' not in session or len(session['cart']) == 0:
return jsonify({"message": "Your cart is empty"}), 200
return render_template("cart_page.html", cart_items=session['cart'])
# Route to place an order (API integration for placing order)
@app.route("/order", methods=["POST"])
def place_order():
if 'cart' not in session or len(session['cart']) == 0:
return jsonify({"message": "Cart is empty, cannot place order."}), 400
order_data = session['cart']
# Here you can integrate with your API or Salesforce
# Example: Call Salesforce API to store the order
salesforce_response = send_to_salesforce(order_data)
# Simulate order processing with a success message
session['cart'] = [] # Clear the cart after order
return jsonify({"message": "Order placed successfully!", "order_data": order_data, "salesforce_response": salesforce_response}), 200
# Salesforce integration function
def send_to_salesforce(order_data):
try:
# Salesforce authentication
sf = Salesforce(username='[email protected]', password='Sati@1020', security_token='sSSjyhInIsUohKpG8sHzty2q')
# Example: Create an Order record in Salesforce
order = sf.Order__c.create({
'Name': 'New Order',
'Items__c': str(order_data) # Example field for items (this could be a custom Salesforce field)
})
return order
except Exception as e:
print(f"Error: {e}")
return None
# Route to register a new user
@app.route('/register', methods=['POST'])
def register():
try:
data = request.get_json()
name = data.get('name')
email = data.get('email')
phone = data.get('phone')
if not name or not email or not phone:
return jsonify({"success": False, "message": "All fields are required."}), 400
# Create a new record in Salesforce's Customer_Login__c object
customer_login = sf.Customer_Login__c.create({
'Name': name,
'Email__c': email,
'Phone_Number__c': phone
})
return jsonify({"success": True, "message": "Registration successful!", "salesforce_response": customer_login}), 201
except Exception as e:
print(f"Error: {str(e)}")
return jsonify({"success": False, "message": f"Registration failed: {str(e)}"}), 500
# Route to validate login credentials
@app.route('/validate-login', methods=['POST'])
def validate_login():
try:
data = request.get_json()
login_email = data.get("email")
login_mobile = data.get("mobile")
if not login_email or not login_mobile:
return jsonify({"success": False, "message": "Missing email or mobile number"}), 400
# Query Salesforce to check if the record exists
query = f"SELECT Id, Name, Email__c, Phone_Number__c FROM Customer_Login__c WHERE Email__c = '{login_email}' AND Phone_Number__c = '{login_mobile}'"
result = sf.query(query)
if result['records']:
# If a matching record is found, return success and the name
user_name = result['records'][0]['Name']
return jsonify({"success": True, "message": "Login successful", "name": user_name})
else:
return jsonify({"success": False, "message": "Invalid email or mobile number"}), 401
except Exception as e:
print(f"Error validating login: {str(e)}")
return jsonify({"success": False, "message": "Internal server error", "error": str(e)}), 500
# Voice-related functions
def generate_audio_prompt(text, filename):
try:
tts = gTTS(text)
tts.save(os.path.join("static", filename))
except gtts.tts.gTTSError as e:
print(f"Error: {e}")
print("Retrying after 5 seconds...")
time.sleep(5) # Wait for 5 seconds before retrying
generate_audio_prompt(text, filename)
# Utility functions
def convert_to_wav(input_path, output_path):
try:
audio = AudioSegment.from_file(input_path)
audio = audio.set_frame_rate(16000).set_channels(1) # Convert to 16kHz, mono
audio.export(output_path, format="wav")
except Exception as e:
print(f"Error: {str(e)}")
raise Exception(f"Audio conversion failed: {str(e)}")
def is_silent_audio(audio_path):
audio = AudioSegment.from_wav(audio_path)
nonsilent_parts = detect_nonsilent(audio, min_silence_len=500, silence_thresh=audio.dBFS-16) # Reduced silence duration
print(f"Detected nonsilent parts: {nonsilent_parts}")
return len(nonsilent_parts) == 0 # If no speech detected
# Start Production Server
if __name__ == "__main__":
serve(app, host="0.0.0.0", port=7860)