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()