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(
"
🤖 Model Selection
"
)
# 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(
""
)
# Analysis Section
with gr.Group():
gr.Markdown(
"🔍 Language Analysis
"
)
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(
"📊 Detection Results
"
)
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()