from flask import Flask, request, jsonify, render_template from video_accent_analyzer import VideoAccentAnalyzer import plotly import json import os app = Flask(__name__) analyzer = VideoAccentAnalyzer() @app.route('/') def home(): return render_template('index.html') @app.route('/api/analyze', methods=['POST']) def analyze(): try: data = request.json url = data.get('url') duration = int(data.get('duration', 30)) if not url: return jsonify({'error': 'No URL provided'}), 400 # Initialize analyzer with display=False to avoid IPython dependency result = analyzer.analyze_video_url(url, max_duration=duration) if 'error' in result: return jsonify({'error': result['error']}), 400 # Create Plotly figure probabilities = result['all_probabilities'] accents = [analyzer.accent_display_names.get(acc, acc.title()) for acc in probabilities.keys()] probs = list(probabilities.values()) # Format detailed results accent = result['predicted_accent'] confidence = result['accent_confidence'] english_conf = result['english_confidence'] details = { 'primary_classification': { 'accent': analyzer.accent_display_names.get(accent, accent.title()), 'confidence': f"{confidence:.1f}%", 'english_confidence': f"{english_conf:.1f}%" }, 'audio_analysis': { 'duration': f"{result['audio_duration']:.1f}s", 'quality_score': result.get('audio_quality_score', 'N/A'), 'chunks_analyzed': result.get('chunks_analyzed', 1) }, 'assessment': { 'english_level': 'Strong' if english_conf >= 70 else 'Moderate' if english_conf >= 50 else 'Low', 'confidence_level': 'High' if confidence >= 70 else 'Moderate' if confidence >= 50 else 'Low' } } # Add visualization data plot_data = { 'data': [{ 'type': 'bar', 'x': accents, 'y': probs, 'text': [f'{p:.1f}%' for p in probs], 'textposition': 'auto', 'marker': { 'color': ['#4CAF50' if p == max(probs) else '#2196F3' if p >= 20 else '#FFC107' if p >= 10 else '#9E9E9E' for p in probs] } }], 'layout': { 'title': 'Accent Probability Distribution', 'xaxis': {'title': 'Accent Type'}, 'yaxis': {'title': 'Probability (%)', 'range': [0, 100]}, 'template': 'plotly_white' } } # Combine all results response = { 'details': details, 'plot': plot_data, 'raw_results': result } return jsonify(response) except Exception as e: return jsonify({'error': str(e)}), 500 @app.route('/api/cleanup', methods=['POST']) def cleanup(): try: analyzer.cleanup() return jsonify({'message': 'Cleanup successful'}) except Exception as e: return jsonify({'error': str(e)}), 500 if __name__ == '__main__': app.run(debug=True)