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": []
    })