Spaces:
Runtime error
Runtime error
| # app.py | |
| from flask import Flask, request, jsonify | |
| from flask_cors import CORS | |
| from config.database import db | |
| import numpy as np | |
| import tempfile | |
| import os | |
| from voice_embedder import get_embedding, cosine_match | |
| import time | |
| import logging | |
| app = Flask(__name__) | |
| CORS(app) | |
| users_collection = db["users"] | |
| logging.basicConfig(level=logging.INFO) | |
| logger = logging.getLogger(__name__) | |
| def log_request_start(): | |
| g._req_start = time.time() | |
| logger.info(f"Incoming request: {request.method} {request.path}") | |
| def log_request_end(response): | |
| elapsed = (time.time() - getattr(g, "_req_start", time.time())) | |
| logger.info(f"Handled {request.method} {request.path} in {elapsed:.2f}s -> {response.status}") | |
| return response | |
| # ---------------- Upload PIN audio ---------------- | |
| def upload_pin(): | |
| if "pin_audio" not in request.files: | |
| return jsonify({"error": "No audio file found"}), 400 | |
| audio_file = request.files["pin_audio"] | |
| temp_path = tempfile.mktemp(suffix=".wav") | |
| audio_file.save(temp_path) | |
| try: | |
| emb = get_embedding(temp_path).tolist() | |
| except Exception as e: | |
| return jsonify({"error": str(e)}), 500 | |
| finally: | |
| os.remove(temp_path) | |
| return jsonify({"message": "PIN processed successfully", "embedding": emb}) | |
| # ---------------- Signup ---------------- | |
| def signup(): | |
| data = request.json | |
| required = ("name", "email", "password", "embedding") | |
| if not all(k in data for k in required): | |
| return jsonify({"error": "Missing fields"}), 400 | |
| if users_collection.find_one({"email": data["email"]}): | |
| return jsonify({"error": "Email already exists"}), 400 | |
| new_user = { | |
| "name": data["name"], | |
| "email": data["email"], | |
| "password": data["password"], | |
| "embedding": data["embedding"] | |
| } | |
| users_collection.insert_one(new_user) | |
| return jsonify({"message": "Signup successful!"}) | |
| # ---------------- Login ---------------- | |
| def login(): | |
| if "pin_audio" not in request.files: | |
| return jsonify({"error": "Audio file missing"}), 400 | |
| email = request.form.get("email") | |
| user = users_collection.find_one({"email": email}) | |
| if not user: | |
| return jsonify({"error": "User not found"}), 404 | |
| audio_file = request.files["pin_audio"] | |
| temp_path = tempfile.mktemp(suffix=".wav") | |
| audio_file.save(temp_path) | |
| try: | |
| new_emb = get_embedding(temp_path) | |
| saved_emb = np.array(user["embedding"], dtype=np.float32) | |
| score, status = cosine_match(saved_emb, new_emb) | |
| except Exception as e: | |
| return jsonify({"error": str(e)}), 500 | |
| finally: | |
| os.remove(temp_path) | |
| return jsonify({"score": score, "status": status}) | |
| # ---------------- Home ---------------- | |
| def home(): | |
| return jsonify({"message": "VoiceAuth Backend Running"}) | |
| if __name__ == "__main__": | |
| app.run(port=5000, debug=True) | |