5月31日

软件杯1
from flask import Flask, request, jsonify, send_from_directory, render_template
import os
import random
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import rcParams

# 设置中文字体(以 Windows 为例)
rcParams['font.family'] = 'SimHei'
rcParams['axes.unicode_minus'] = False

app = Flask(__name__)
UPLOAD_FOLDER = 'uploads'
STATIC_FOLDER = 'static'
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
os.makedirs(STATIC_FOLDER, exist_ok=True)

def analyze_speech(video_path):
    score = random.uniform(60, 100)
    return {
        'language_score': score,
        'text': "我的优点是善于沟通和团队合作,熟悉Java和Python,曾参与校园系统开发。",
        'feedback': f"语言表达评分: {score:.1f}"
    }

def analyze_text(text):
    keywords = ['Java', 'Python', '数据库', '项目', '团队', '沟通', '开发', '系统']
    logic_markers = ['首先', '其次', '然后', '最后', '因此', '所以', '总结']

    keyword_count = sum(1 for kw in keywords if kw in text)
    logic_count = sum(1 for marker in logic_markers if marker in text)

    # 分数计算逻辑
    knowledge_score = min(60 + keyword_count * 5, 100)
    logic_score = min(60 + logic_count * 8, 100)
    skill_match_score = 60 + random.uniform(0, 40)

    feedback = (
        f"专业知识评分: {knowledge_score:.1f},共提及{keyword_count}个相关关键词;"
        f"逻辑思维评分: {logic_score:.1f},共使用{logic_count}个逻辑词。"
    )

    return {
        'knowledge_score': knowledge_score,
        'skill_match_score': skill_match_score,
        'logic_score': logic_score,
        'feedback': feedback
    }

def analyze_video(video_path):
    score = random.uniform(60, 100)
    return {
        'innovation_score': score,
        'feedback': f"创新能力评分: {score:.1f}"
    }

def draw_radar_chart(scores, save_path):
    labels = list(scores.keys())
    values = list(scores.values())
    values += values[:1]

    angles = np.linspace(0, 2 * np.pi, len(labels), endpoint=False).tolist()
    angles += angles[:1]

    fig, ax = plt.subplots(figsize=(6,6), subplot_kw=dict(polar=True))
    ax.plot(angles, values, 'o-', linewidth=2)
    ax.fill(angles, values, alpha=0.25)
    ax.set_thetagrids(np.degrees(angles[:-1]), labels)
    ax.set_ylim(0, 100)
    ax.set_title("综合面试评分雷达图", fontsize=16)
    plt.savefig(save_path)
    plt.close()

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

@app.route('/upload_multiple', methods=['POST'])
def upload_multiple():
    try:
        files = []
        for i in range(1, 4):
            f = request.files.get(f'file{i}')
            if not f:
                return jsonify({'error': f'缺少第{i}个视频文件'})
            save_path = os.path.join(UPLOAD_FOLDER, f'interview{i}.webm')
            f.save(save_path)
            files.append(save_path)

        total_scores = {
            'language': 0,
            'knowledge': 0,
            'skill': 0,
            'logic': 0,
            'innovation': 0
        }
        feedbacks = []

        for idx, video_path in enumerate(files, 1):
            speech_res = analyze_speech(video_path)
            text_res = analyze_text(speech_res['text'])
            video_res = analyze_video(video_path)

            total_scores['language'] += speech_res['language_score']
            total_scores['knowledge'] += text_res['knowledge_score']
            total_scores['skill'] += text_res['skill_match_score']
            total_scores['logic'] += text_res['logic_score']
            total_scores['innovation'] += video_res['innovation_score']

            feedbacks.append(
                f"【第{idx}题反馈】\n" +
                speech_res['feedback'] + "\n" +
                text_res['feedback'] + "\n" +
                video_res['feedback']
            )

        for k in total_scores:
            total_scores[k] /= 3

        radar_scores = {
            '语言表达': total_scores['language'],
            '专业知识': total_scores['knowledge'],
            '技能匹配': total_scores['skill'],
            '逻辑思维': total_scores['logic'],
            '创新能力': total_scores['innovation'],
        }
        radar_path = os.path.join(STATIC_FOLDER, 'radar.png')
        draw_radar_chart(radar_scores, radar_path)

        return jsonify({
            'feedback': "\n\n".join(feedbacks) + "\n\n综合评分已在雷达图中展示"
        })
    except Exception as e:
        return jsonify({'error': str(e)})

if __name__ == '__main__':
    app.run(debug=True)

 

posted @ 2025-06-09 14:54  KuanDong24  阅读(4)  评论(0)    收藏  举报