File size: 6,192 Bytes
2fab7d3
22bea9a
 
 
 
 
 
 
 
 
2fab7d3
 
 
 
 
 
 
22bea9a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2fab7d3
22bea9a
 
2fab7d3
22bea9a
 
 
 
 
 
 
 
 
2fab7d3
 
 
 
 
 
 
 
22bea9a
2fab7d3
 
 
 
 
 
 
 
 
22bea9a
2fab7d3
 
 
 
 
 
 
22bea9a
 
2fab7d3
22bea9a
 
 
4a27f85
22bea9a
4a27f85
 
22bea9a
 
 
4a27f85
22bea9a
 
4a27f85
2fab7d3
22bea9a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2fab7d3
22bea9a
 
1a545f7
22bea9a
 
 
4a27f85
 
22bea9a
 
2fab7d3
4a27f85
 
2fab7d3
4a27f85
22bea9a
 
 
 
 
 
4a27f85
 
 
 
 
 
 
22bea9a
4a27f85
 
1a545f7
4a27f85
 
1a545f7
22bea9a
4a27f85
 
 
 
2fab7d3
4a27f85
 
 
 
1a545f7
4a27f85
 
2fab7d3
4a27f85
 
22bea9a
 
 
 
 
1a545f7
4a27f85
 
2fab7d3
 
 
4a27f85
1970c3b
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
import os
import time
import logging
import json
import requests
import torch
from flask import Flask, render_template, request, jsonify, session
from flask_session import Session
from simple_salesforce import Salesforce
from transformers import pipeline, AutoConfig
from gtts import gTTS
from pydub import AudioSegment
from pydub.silence import detect_nonsilent
from waitress import serve

app = Flask(__name__)

# Configure Flask session
app.secret_key = os.getenv("SECRET_KEY", "sSSjyhInIsUohKpG8sHzty2q")
app.config["SESSION_TYPE"] = "filesystem"
app.config["SESSION_COOKIE_NAME"] = "my_session"
app.config["SESSION_COOKIE_SECURE"] = True
app.config["SESSION_COOKIE_SAMESITE"] = "None"
Session(app)

# Set up logging
logging.basicConfig(level=logging.INFO)

# Connect to Salesforce
try:
    print("Attempting to connect to Salesforce...")
    sf = Salesforce(username='[email protected]', password='Sati@1020', security_token='sSSjyhInIsUohKpG8sHzty2q')
    print("Connected to Salesforce successfully!")
except Exception as e:
    print(f"Failed to connect to Salesforce: {str(e)}")

# Whisper ASR Configuration
device = "cuda" if torch.cuda.is_available() else "cpu"
config = AutoConfig.from_pretrained("openai/whisper-small")
config.update({"timeout": 60})

# Voice prompts for registration
prompts = {
    "welcome": "Welcome to Biryani Hub.",
    "ask_name": "Tell me your name.",
    "ask_email": "Please provide your email address.",
    "thank_you": "Thank you for registration."
}

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)
        generate_audio_prompt(text, filename)

for key, text in prompts.items():
    generate_audio_prompt(text, f"{key}.mp3")

# Function to convert audio to WAV format
def convert_to_wav(input_path, output_path):
    try:
        audio = AudioSegment.from_file(input_path)
        audio = audio.set_frame_rate(16000).set_channels(1)
        audio.export(output_path, format="wav")
    except Exception as e:
        raise Exception(f"Audio conversion failed: {str(e)}")

# Function to check if audio contains actual speech
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)
    return len(nonsilent_parts) == 0

@app.route("/")
def index():
    return render_template("index.html")

# βœ… LOGIN ENDPOINT (Validates Existing Users)
@app.route('/login', methods=['POST'])
def login():
    data = request.json
    email = data.get('email').strip().lower()
    phone_number = data.get('phone_number').strip()

    if not email or not phone_number:
        return jsonify({'error': 'Missing email or phone number'}), 400

    try:
        print(f"πŸ” Checking login for Email: {email}, Phone: {phone_number}")

        query = f"SELECT Id, Name FROM Customer_Login__c WHERE LOWER(Email__c) = '{email}' AND Phone_Number__c = '{phone_number}' LIMIT 1"
        result = sf.query(query)

        if result['totalSize'] == 0:
            print("❌ No matching records found!")
            return jsonify({'error': 'Invalid email or phone number. User not found'}), 401

        user_data = result['records'][0]
        session['user_id'] = user_data['Id']
        session['name'] = user_data['Name']
        print("βœ… User found:", user_data)

        return jsonify({'success': True, 'message': 'Login successful', 'user_id': user_data['Id'], 'name': user_data['Name']}), 200

    except requests.exceptions.RequestException as req_error:
        print("πŸ”΄ Salesforce Connection Error:", req_error)
        return jsonify({'error': f'Salesforce connection error: {str(req_error)}'}), 500
    except Exception as e:
        print("🚨 Unexpected Error:", e)
        return jsonify({'error': f'Unexpected error: {str(e)}'}), 500

# βœ… REGISTRATION ENDPOINT (Creates New User)
@app.route("/register", methods=["POST"])
def register():
    data = request.json
    name = data.get('name')
    email = data.get('email').strip().lower()
    phone = data.get('phone').strip()

    if not name or not email or not phone:
        return jsonify({'error': 'Missing data'}), 400

    try:
        query = f"SELECT Id FROM Customer_Login__c WHERE LOWER(Email__c) = '{email}' AND Phone_Number__c = '{phone}' LIMIT 1"
        existing_user = sf.query(query)

        if existing_user['totalSize'] > 0:
            return jsonify({'error': 'User already exists'}), 409

        customer_login = sf.Customer_Login__c.create({
            'Name': name,
            'Email__c': email,
            'Phone_Number__c': phone
        })

        if customer_login.get('id'):
            return jsonify({'success': True, 'user_id': customer_login['id']}), 200
        else:
            return jsonify({'error': 'Failed to create record'}), 500

    except Exception as e:
        return jsonify({'error': str(e)}), 500

# βœ… TRANSCRIPTION ENDPOINT (Converts Speech to Text)
@app.route("/transcribe", methods=["POST"])
def transcribe():
    if "audio" not in request.files:
        return jsonify({"error": "No audio file provided"}), 400

    audio_file = request.files["audio"]
    input_audio_path = os.path.join("static", "temp_input.wav")
    output_audio_path = os.path.join("static", "temp.wav")
    audio_file.save(input_audio_path)

    try:
        convert_to_wav(input_audio_path, output_audio_path)

        if is_silent_audio(output_audio_path):
            return jsonify({"error": "No speech detected. Please try again."}), 400

        result = pipeline("automatic-speech-recognition", model="openai/whisper-small", device=0 if torch.cuda.is_available() else -1, config=config)
        transcribed_text = result(output_audio_path)["text"].strip().capitalize()

        return jsonify({"text": transcribed_text})

    except Exception as e:
        return jsonify({"error": f"Speech recognition error: {str(e)}"}), 500

# Start Production Server
if __name__ == "__main__":
    serve(app, host="0.0.0.0", port=7860)