File size: 5,117 Bytes
2fab7d3
22bea9a
 
 
 
 
 
 
2fab7d3
 
 
 
 
 
 
22bea9a
 
 
 
 
 
 
 
 
 
 
c7510fe
22bea9a
c7510fe
2fab7d3
c7510fe
22bea9a
 
 
 
 
 
2fab7d3
c7510fe
2fab7d3
 
 
 
 
22bea9a
2fab7d3
 
 
 
 
 
 
c7510fe
 
 
2fab7d3
 
 
 
22bea9a
 
2fab7d3
22bea9a
 
 
4a27f85
c7510fe
4a27f85
 
22bea9a
c7510fe
 
4a27f85
22bea9a
 
4a27f85
2fab7d3
22bea9a
 
 
 
 
 
 
 
 
 
 
 
2fab7d3
22bea9a
1a545f7
c7510fe
22bea9a
 
4a27f85
c7510fe
 
 
2fab7d3
4a27f85
 
2fab7d3
4a27f85
22bea9a
 
 
 
 
 
4a27f85
 
 
 
 
 
 
22bea9a
4a27f85
 
1a545f7
4a27f85
 
1a545f7
c7510fe
4a27f85
 
 
 
2fab7d3
4a27f85
 
 
 
1a545f7
4a27f85
 
2fab7d3
4a27f85
 
22bea9a
e2ae19f
22bea9a
 
 
1a545f7
4a27f85
 
2fab7d3
 
 
4a27f85
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
import os
import time
import logging
import json
import requests
from flask import Flask, render_template, request, jsonify, session
from flask_session import Session
from simple_salesforce import Salesforce
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"
Session(app)

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

# Connect to Salesforce
try:
    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)}")

# Voice prompts
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."
}

# Function to generate voice prompts
def generate_audio_prompt(text, filename):
    try:
        tts = gTTS(text)
        tts.save(os.path.join("static", filename))
    except gtts.tts.gTTSError as e:
        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):
    audio = AudioSegment.from_file(input_path)
    audio = audio.set_frame_rate(16000).set_channels(1)
    audio.export(output_path, format="wav")

# 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
@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:
        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:
            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']

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

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

# ✅ REGISTRATION ENDPOINT
@app.route("/register", methods=["POST"])
def register():
    data = request.json
    name = data.get('name', '').strip()
    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
@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)
        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)