Spaces:
Build error
Build error
import gradio as gr | |
from backend.language_detector import LanguageDetector | |
def main(): | |
# Initialize the language detector with default model (Model A Dataset A) | |
detector = LanguageDetector() | |
# Create Gradio interface | |
with gr.Blocks(title="Language Detection App", theme=gr.themes.Soft()) as app: | |
gr.Markdown("# 🌍 Language Detection App") | |
gr.Markdown("Select a model and enter text below to detect its language with confidence scores.") | |
# Model Selection Section with visual styling | |
with gr.Group(): | |
gr.Markdown( | |
"<div style='text-align: center; padding: 16px 0 8px 0; margin-bottom: 16px; font-size: 18px; font-weight: 600; border-bottom: 2px solid; background: linear-gradient(90deg, transparent, rgba(99, 102, 241, 0.1), transparent); border-radius: 8px 8px 0 0;'>🤖 Model Selection</div>" | |
) | |
# Get available models | |
available_models = detector.get_available_models() | |
model_choices = [] | |
model_info_map = {} | |
for key, info in available_models.items(): | |
if info["status"] == "available": | |
model_choices.append((info["display_name"], key)) | |
else: | |
model_choices.append((f"{info['display_name']} (Coming Soon)", key)) | |
model_info_map[key] = info | |
model_selector = gr.Dropdown( | |
choices=model_choices, | |
value="model-a-dataset-a", # Default to Model A Dataset A | |
label="Choose Language Detection Model", | |
interactive=True | |
) | |
# Model Information Display | |
model_info_display = gr.Markdown( | |
value=_format_model_info(detector.get_current_model_info()), | |
label="Model Information" | |
) | |
# Add visual separator | |
gr.Markdown( | |
"<div style='margin: 24px 0; border-top: 3px solid rgba(99, 102, 241, 0.2); background: linear-gradient(90deg, transparent, rgba(99, 102, 241, 0.05), transparent); height: 2px;'></div>" | |
) | |
# Analysis Section | |
with gr.Group(): | |
gr.Markdown( | |
"<div style='text-align: center; padding: 16px 0 8px 0; margin-bottom: 16px; font-size: 18px; font-weight: 600; border-bottom: 2px solid; background: linear-gradient(90deg, transparent, rgba(34, 197, 94, 0.1), transparent); border-radius: 8px 8px 0 0;'>🔍 Language Analysis</div>" | |
) | |
with gr.Row(): | |
with gr.Column(scale=2): | |
# Input section | |
text_input = gr.Textbox( | |
label="Text to Analyze", | |
placeholder="Enter text here to detect its language...", | |
lines=5, | |
max_lines=10 | |
) | |
detect_btn = gr.Button("🔍 Detect Language", variant="primary", size="lg") | |
# Example texts | |
gr.Examples( | |
examples=[ | |
["Hello, how are you today?"], | |
["Bonjour, comment allez-vous?"], | |
["Hola, ¿cómo estás?"], | |
["Guten Tag, wie geht es Ihnen?"], | |
["こんにちは、元気ですか?"], | |
["Привет, как дела?"], | |
["Ciao, come stai?"], | |
["Olá, como você está?"], | |
["你好,你好吗?"], | |
["안녕하세요, 어떻게 지내세요?"] | |
], | |
inputs=text_input, | |
label="Try these examples:" | |
) | |
with gr.Column(scale=2): | |
# Output section | |
with gr.Group(): | |
gr.Markdown( | |
"<div style='text-align: center; padding: 16px 0 8px 0; margin-bottom: 12px; font-size: 18px; font-weight: 600; border-bottom: 2px solid; background: linear-gradient(90deg, transparent, rgba(168, 85, 247, 0.1), transparent); border-radius: 8px 8px 0 0;'>📊 Detection Results</div>" | |
) | |
detected_language = gr.Textbox( | |
label="Detected Language", | |
interactive=False | |
) | |
confidence_score = gr.Number( | |
label="Confidence Score", | |
interactive=False, | |
precision=4 | |
) | |
language_code = gr.Textbox( | |
label="Language Code (ISO 639-1)", | |
interactive=False | |
) | |
# Top predictions table | |
top_predictions = gr.Dataframe( | |
headers=["Language", "Code", "Confidence"], | |
label="Top 5 Predictions", | |
interactive=False, | |
wrap=True | |
) | |
# Status/Info section | |
with gr.Row(): | |
status_text = gr.Textbox( | |
label="Status", | |
interactive=False, | |
visible=False | |
) | |
# Event handlers | |
def detect_language_wrapper(text, selected_model): | |
if not text.strip(): | |
return ( | |
"No text provided", | |
0.0, | |
"", | |
[], | |
gr.update(value="Please enter some text to analyze.", visible=True) | |
) | |
try: | |
# Switch model if needed | |
if detector.current_model_key != selected_model: | |
try: | |
detector.switch_model(selected_model) | |
except NotImplementedError: | |
return ( | |
"Model unavailable", | |
0.0, | |
"", | |
[], | |
gr.update(value="This model is not yet implemented. Please select an available model.", visible=True) | |
) | |
except Exception as e: | |
return ( | |
"Model error", | |
0.0, | |
"", | |
[], | |
gr.update(value=f"Error loading model: {str(e)}", visible=True) | |
) | |
result = detector.detect_language(text) | |
# Extract main prediction | |
main_lang = result['language'] | |
main_confidence = result['confidence'] | |
main_code = result['language_code'] | |
# Format top predictions for table | |
predictions_table = [ | |
[pred['language'], pred['language_code'], f"{pred['confidence']:.4f}"] | |
for pred in result['top_predictions'] | |
] | |
model_info = result.get('metadata', {}).get('model_info', {}) | |
model_name = model_info.get('name', 'Unknown Model') | |
return ( | |
main_lang, | |
main_confidence, | |
main_code, | |
predictions_table, | |
gr.update(value=f"✅ Analysis Complete\n\nInput Text: {text[:100]}{'...' if len(text) > 100 else ''}\n\nDetected Language: {main_lang} ({main_code})\nConfidence: {main_confidence:.2%}\n\nModel: {model_name}", visible=True) | |
) | |
except Exception as e: | |
return ( | |
"Error occurred", | |
0.0, | |
"", | |
[], | |
gr.update(value=f"Error: {str(e)}", visible=True) | |
) | |
def update_model_info(selected_model): | |
"""Update model information display when model selection changes.""" | |
try: | |
if detector.current_model_key != selected_model: | |
detector.switch_model(selected_model) | |
model_info = detector.get_current_model_info() | |
return _format_model_info(model_info) | |
except NotImplementedError: | |
return "**This model is not yet implemented.** Please select an available model." | |
except Exception as e: | |
return f"**Error loading model information:** {str(e)}" | |
# Connect the button to the detection function | |
detect_btn.click( | |
fn=detect_language_wrapper, | |
inputs=[text_input, model_selector], | |
outputs=[detected_language, confidence_score, language_code, top_predictions, status_text] | |
) | |
# Also trigger on Enter key in text input | |
text_input.submit( | |
fn=detect_language_wrapper, | |
inputs=[text_input, model_selector], | |
outputs=[detected_language, confidence_score, language_code, top_predictions, status_text] | |
) | |
# Update model info when selection changes | |
model_selector.change( | |
fn=update_model_info, | |
inputs=[model_selector], | |
outputs=[model_info_display] | |
) | |
return app | |
def _format_model_info(model_info): | |
"""Format model information for display.""" | |
if not model_info: | |
return "No model information available." | |
formatted_info = f""" | |
**{model_info.get('name', 'Unknown Model')}** | |
{model_info.get('description', 'No description available.')} | |
**📊 Performance:** | |
- Accuracy: {model_info.get('accuracy', 'N/A')} | |
- Model Size: {model_info.get('model_size', 'N/A')} | |
**🏗️ Architecture:** | |
- Model Architecture: {model_info.get('architecture', 'N/A')} | |
- Base Model: {model_info.get('base_model', 'N/A')} | |
- Training Dataset: {model_info.get('dataset', 'N/A')} | |
**🌐 Languages:** {model_info.get('languages_supported', 'N/A')} | |
**⚙️ Training Details:** {model_info.get('training_details', 'N/A')} | |
**💡 Use Cases:** {model_info.get('use_cases', 'N/A')} | |
**✅ Strengths:** {model_info.get('strengths', 'N/A')} | |
**⚠️ Limitations:** {model_info.get('limitations', 'N/A')} | |
""" | |
return formatted_info | |
if __name__ == "__main__": | |
app = main() | |
app.launch() |