|
import gradio as gr |
|
from video_accent_analyzer import VideoAccentAnalyzer |
|
import plotly.graph_objects as go |
|
import pandas as pd |
|
|
|
analyzer = VideoAccentAnalyzer() |
|
|
|
|
|
def create_plotly_chart(probabilities): |
|
"""Create an interactive Plotly bar chart for accent probabilities""" |
|
accents = [analyzer.accent_display_names.get(acc, acc.title()) for acc in probabilities.keys()] |
|
probs = list(probabilities.values()) |
|
|
|
colors = ['#4CAF50' if p == max(probs) else '#2196F3' if p >= 20 |
|
else '#FFC107' if p >= 10 else '#9E9E9E' for p in probs] |
|
|
|
fig = go.Figure(data=[ |
|
go.Bar( |
|
x=accents, |
|
y=probs, |
|
marker_color=colors, |
|
text=[f'{p:.1f}%' for p in probs], |
|
textposition='auto', |
|
) |
|
]) |
|
|
|
fig.update_layout( |
|
title='Accent Probability Distribution', |
|
xaxis_title='Accent Type', |
|
yaxis_title='Probability (%)', |
|
template='plotly_white', |
|
yaxis_range=[0, 100], |
|
) |
|
|
|
return fig |
|
|
|
|
|
def analyze_video(url=None, video_file=None, duration=30): |
|
"""Analyze video from URL or file with enhanced output""" |
|
try: |
|
if not url and not video_file: |
|
return ( |
|
"### β Error\nPlease provide either a video URL or upload a video file.", |
|
None |
|
) |
|
|
|
if url: |
|
result = analyzer.analyze_video_url(url, max_duration=duration) |
|
else: |
|
result = analyzer.analyze_local_video(video_file, max_duration=duration) |
|
|
|
if 'error' in result: |
|
return ( |
|
f"### β Error\n{result['error']}", |
|
None |
|
) |
|
|
|
|
|
markdown = f""" |
|
### π― Analysis Results |
|
|
|
**Primary Classification:** |
|
- π£οΈ Predicted Accent: {analyzer.accent_display_names.get(result['predicted_accent'])} |
|
- π Confidence: {result['accent_confidence']:.1f}% |
|
- π English Confidence: {result['english_confidence']:.1f}% |
|
|
|
**Audio Analysis:** |
|
- β±οΈ Duration: {result['audio_duration']:.1f} seconds |
|
- π Quality Score: {result.get('audio_quality_score', 'N/A')} |
|
- π΅ Chunks Analyzed: {result.get('chunks_analyzed', 1)} |
|
|
|
**Assessment:** |
|
- {'β
Strong English Speaker' if result['english_confidence'] >= 70 else 'β οΈ Moderate English Confidence' if result['english_confidence'] >= 50 else 'β Low English Confidence'} |
|
- {'π― High Accent Confidence' if result['accent_confidence'] >= 70 else 'π€ Moderate Accent Confidence' if result['accent_confidence'] >= 50 else 'β Low Accent Confidence'} |
|
""" |
|
|
|
|
|
fig = create_plotly_chart(result['all_probabilities']) |
|
|
|
return markdown, fig |
|
|
|
except Exception as e: |
|
return f"### β Error\nAn unexpected error occurred: {str(e)}", None |
|
|
|
|
|
|
|
css = """ |
|
.gradio-container { |
|
font-family: 'IBM Plex Sans', sans-serif; |
|
} |
|
.gr-button { |
|
background: linear-gradient(45deg, #4CAF50, #2196F3); |
|
border: none; |
|
} |
|
.gr-button:hover { |
|
background: linear-gradient(45deg, #2196F3, #4CAF50); |
|
transform: scale(1.02); |
|
} |
|
""" |
|
|
|
with gr.Blocks(css=css) as interface: |
|
gr.Markdown(""" |
|
# π§ Video Accent Analyzer |
|
|
|
Analyze English accents in videos from various sources: |
|
- MP4 videos |
|
- Loom recordings |
|
- Direct video links |
|
- Uploaded video files |
|
|
|
### π‘ Tips |
|
- Keep videos under 2 minutes for best results |
|
- Ensure clear audio quality |
|
- Multiple speakers may affect accuracy |
|
""") |
|
|
|
with gr.Row(): |
|
with gr.Column(): |
|
url_input = gr.Textbox( |
|
label="Video URL", |
|
placeholder="Enter , Loom, or direct video URL" |
|
) |
|
video_input = gr.File( |
|
label="Or Upload Video", |
|
file_types=["video"] |
|
) |
|
duration = gr.Slider( |
|
minimum=10, |
|
maximum=120, |
|
value=30, |
|
step=10, |
|
label="Maximum Duration (seconds)" |
|
) |
|
analyze_btn = gr.Button("π Analyze Video", variant="primary") |
|
|
|
with gr.Column(): |
|
output_text = gr.Markdown(label="Analysis Results") |
|
output_plot = gr.Plot(label="Accent Distribution") |
|
|
|
analyze_btn.click( |
|
fn=analyze_video, |
|
inputs=[url_input, video_input, duration], |
|
outputs=[output_text, output_plot] |
|
) |
|
|
|
gr.Examples( |
|
examples=[ |
|
["https://www.loom.com/share/7b82b3e25ec8409a8e4b5568e95dca5c?sid=e0819070-d2ba-4236-a7a0-878c8739040f", None, 30], |
|
], |
|
inputs=[url_input, video_input, duration], |
|
outputs=[output_text, output_plot], |
|
label="Example Videos" |
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
interface.launch() |
|
|