Spaces:
Paused
Paused
File size: 3,246 Bytes
2ae57cb 22b00f2 2ae57cb 22b00f2 2ae57cb 22b00f2 2ae57cb 22b00f2 2ae57cb 22b00f2 2ae57cb 22b00f2 2ae57cb 22b00f2 2ae57cb 22b00f2 2ae57cb 22b00f2 2ae57cb 22b00f2 2ae57cb 22b00f2 2ae57cb 22b00f2 2ae57cb 22b00f2 2ae57cb 22b00f2 2ae57cb 22b00f2 2ae57cb 22b00f2 2ae57cb 22b00f2 2ae57cb 22b00f2 2ae57cb 22b00f2 |
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 |
import os
import uuid
import json
from flask import Blueprint, request, jsonify, url_for
from flask_login import login_required, current_user
from backend.models.database import db, Job, Application
from backend.services.interview_engine import (
generate_first_question,
edge_tts_to_file_sync,
whisper_stt,
evaluate_answer
)
interview_api = Blueprint("interview_api", __name__)
@interview_api.route("/start_interview", methods=["POST"])
@login_required
def start_interview():
data = request.get_json()
job_id = data.get("job_id")
job = Job.query.get_or_404(job_id)
application = Application.query.filter_by(
user_id=current_user.id,
job_id=job_id
).first()
if not application or not application.extracted_features:
return jsonify({"error": "No application/profile data found."}), 400
try:
profile = json.loads(application.extracted_features)
except:
return jsonify({"error": "Invalid profile JSON"}), 500
question = generate_first_question(profile, job)
# Create static/audio directory if it doesn't exist
audio_dir = os.path.join("static", "audio")
os.makedirs(audio_dir, exist_ok=True)
audio_filename = f"q_{uuid.uuid4().hex}.wav"
audio_path = os.path.join(audio_dir, audio_filename)
# Generate audio
edge_tts_to_file_sync(question, audio_path)
return jsonify({
"question": question,
"audio_url": url_for("static", filename=f"audio/{audio_filename}")
})
@interview_api.route("/transcribe_audio", methods=["POST"])
@login_required
def transcribe_audio():
audio_file = request.files.get("audio")
if not audio_file:
return jsonify({"error": "No audio file received."}), 400
# Create temp directory if it doesn't exist
temp_dir = "temp"
os.makedirs(temp_dir, exist_ok=True)
filename = f"user_audio_{uuid.uuid4().hex}.wav"
path = os.path.join(temp_dir, filename)
audio_file.save(path)
transcript = whisper_stt(path)
# Clean up
try:
os.remove(path)
except:
pass
return jsonify({"transcript": transcript})
@interview_api.route("/process_answer", methods=["POST"])
@login_required
def process_answer():
data = request.get_json()
answer = data.get("answer", "")
question_idx = data.get("questionIndex", 0)
# Generate next question (simplified for now)
next_question = f"Follow-up question {question_idx + 2}: Can you elaborate on your experience with relevant technologies?"
# Create audio for next question
audio_dir = os.path.join("static", "audio")
os.makedirs(audio_dir, exist_ok=True)
audio_filename = f"q_{uuid.uuid4().hex}.wav"
audio_path = os.path.join(audio_dir, audio_filename)
edge_tts_to_file_sync(next_question, audio_path)
return jsonify({
"success": True,
"nextQuestion": next_question,
"audioUrl": url_for("static", filename=f"audio/{audio_filename}"),
"evaluation": {
"score": "medium",
"feedback": "Good answer, but be more specific."
},
"isComplete": question_idx >= 2,
"summary": []
}) |