import gradio as gr import random # IPA features dictionary with full feature names ipa_features = { 'p': {'syllabic': '-', 'consonantal': '+', 'sonorant': '-', 'coronal': '-', 'anterior': '+', 'continuant': '-', 'nasal': '-', 'strident': '-', 'lateral': '-', 'delayed release': '-', 'voice': '-'}, 'b': {'syllabic': '-', 'consonantal': '+', 'sonorant': '-', 'coronal': '-', 'anterior': '+', 'continuant': '-', 'nasal': '-', 'strident': '-', 'lateral': '-', 'delayed release': '-', 'voice': '+'}, 't': {'syllabic': '-', 'consonantal': '+', 'sonorant': '-', 'coronal': '+', 'anterior': '+', 'continuant': '-', 'nasal': '-', 'strident': '-', 'lateral': '-', 'delayed release': '-', 'voice': '-'}, 'd': {'syllabic': '-', 'consonantal': '+', 'sonorant': '-', 'coronal': '+', 'anterior': '+', 'continuant': '-', 'nasal': '-', 'strident': '-', 'lateral': '-', 'delayed release': '-', 'voice': '+'}, 'k': {'syllabic': '-', 'consonantal': '+', 'sonorant': '-', 'coronal': '-', 'anterior': '-', 'continuant': '-', 'nasal': '-', 'strident': '-', 'lateral': '-', 'delayed release': '-', 'voice': '-'}, 'g': {'syllabic': '-', 'consonantal': '+', 'sonorant': '-', 'coronal': '-', 'anterior': '-', 'continuant': '-', 'nasal': '-', 'strident': '-', 'lateral': '-', 'delayed release': '-', 'voice': '+'}, 'tʃ': {'syllabic': '-', 'consonantal': '+', 'sonorant': '-', 'coronal': '+', 'anterior': '-', 'continuant': '-', 'nasal': '-', 'strident': '+', 'lateral': '-', 'delayed release': '+', 'voice': '-'}, 'dʒ': {'syllabic': '-', 'consonantal': '+', 'sonorant': '-', 'coronal': '+', 'anterior': '-', 'continuant': '-', 'nasal': '-', 'strident': '+', 'lateral': '-', 'delayed release': '+', 'voice': '+'}, 'f': {'syllabic': '-', 'consonantal': '+', 'sonorant': '-', 'coronal': '-', 'anterior': '-', 'continuant': '+', 'nasal': '-', 'strident': '+', 'lateral': '-', 'delayed release': '-', 'voice': '-'}, 'v': {'syllabic': '-', 'consonantal': '+', 'sonorant': '-', 'coronal': '-', 'anterior': '-', 'continuant': '+', 'nasal': '-', 'strident': '+', 'lateral': '-', 'delayed release': '-', 'voice': '+'}, 'θ': {'syllabic': '-', 'consonantal': '+', 'sonorant': '-', 'coronal': '-', 'anterior': '+', 'continuant': '+', 'nasal': '-', 'strident': '-', 'lateral': '-', 'delayed release': '-', 'voice': '-'}, 'ð': {'syllabic': '-', 'consonantal': '+', 'sonorant': '-', 'coronal': '-', 'anterior': '+', 'continuant': '+', 'nasal': '-', 'strident': '-', 'lateral': '-', 'delayed release': '-', 'voice': '+'}, 's': {'syllabic': '-', 'consonantal': '+', 'sonorant': '-', 'coronal': '+', 'anterior': '+', 'continuant': '+', 'nasal': '-', 'strident': '+', 'lateral': '-', 'delayed release': '-', 'voice': '-'}, 'z': {'syllabic': '-', 'consonantal': '+', 'sonorant': '-', 'coronal': '+', 'anterior': '+', 'continuant': '+', 'nasal': '-', 'strident': '+', 'lateral': '-', 'delayed release': '-', 'voice': '+'}, 'ʃ': {'syllabic': '-', 'consonantal': '+', 'sonorant': '-', 'coronal': '+', 'anterior': '-', 'continuant': '+', 'nasal': '-', 'strident': '+', 'lateral': '-', 'delayed release': '-', 'voice': '-'}, 'ʒ': {'syllabic': '-', 'consonantal': '+', 'sonorant': '-', 'coronal': '+', 'anterior': '-', 'continuant': '+', 'nasal': '-', 'strident': '+', 'lateral': '-', 'delayed release': '-', 'voice': '+'}, 'h': {'syllabic': '-', 'consonantal': '+', 'sonorant': '-', 'coronal': '-', 'anterior': '-', 'continuant': '+', 'nasal': '-', 'strident': '-', 'lateral': '-', 'delayed release': '-', 'voice': '-'}, 'm': {'syllabic': '-', 'consonantal': '+', 'sonorant': '+', 'coronal': '-', 'anterior': '+', 'continuant': '-', 'nasal': '+', 'strident': '-', 'lateral': '-', 'delayed release': '-', 'voice': '+'}, 'n': {'syllabic': '-', 'consonantal': '+', 'sonorant': '+', 'coronal': '+', 'anterior': '+', 'continuant': '-', 'nasal': '+', 'strident': '-', 'lateral': '-', 'delayed release': '-', 'voice': '+'}, 'ŋ': {'syllabic': '-', 'consonantal': '+', 'sonorant': '+', 'coronal': '-', 'anterior': '-', 'continuant': '-', 'nasal': '+', 'strident': '-', 'lateral': '-', 'delayed release': '-', 'voice': '+'}, 'l': {'syllabic': '-', 'consonantal': '+', 'sonorant': '+', 'coronal': '+', 'anterior': '+', 'continuant': '-', 'nasal': '-', 'strident': '-', 'lateral': '+', 'delayed release': '-', 'voice': '+'}, 'r': {'syllabic': '-', 'consonantal': '+', 'sonorant': '+', 'coronal': '+', 'anterior': '+', 'continuant': '+', 'nasal': '-', 'strident': '-', 'lateral': '-', 'delayed release': '-', 'voice': '+'}, 'j': {'syllabic': '-', 'consonantal': '-', 'sonorant': '+', 'coronal': '-', 'anterior': '-', 'continuant': '+', 'nasal': '-', 'strident': '-', 'lateral': '-', 'delayed release': '-', 'voice': '+'}, 'w': {'syllabic': '-', 'consonantal': '-', 'sonorant': '+', 'coronal': '-', 'anterior': '-', 'continuant': '+', 'nasal': '-', 'strident': '-', 'lateral': '-', 'delayed release': '-', 'voice': '+'} } # Function to select a random symbol def start_quiz(): random_symbol = random.choice(list(ipa_features.keys())) return random_symbol # Return only the IPA symbol, not the features # Function to validate user's answers against the actual features def validate_features(symbol, user_syllabic, user_consonantal, user_sonorant, user_coronal, user_anterior, user_continuant, user_nasal, user_strident, user_lateral, user_delayed_release, user_voice): correct_features = ipa_features[symbol] user_answers = { 'syllabic': user_syllabic, 'consonantal': user_consonantal, 'sonorant': user_sonorant, 'coronal': user_coronal, 'anterior': user_anterior, 'continuant': user_continuant, 'nasal': user_nasal, 'strident': user_strident, 'lateral': user_lateral, 'delayed release': user_delayed_release, 'voice': user_voice } # Compare user answers with correct answers and format the result result = [] correctness = [] incorrect_count = 0 for feature, value in correct_features.items(): user_value = user_answers[feature] if user_value == value: correctness.append("Correct") else: correctness.append("Incorrect") incorrect_count += 1 result.append(f"{value}{feature}") # Format the result in the format /m/: [+syllabic, +consonantal, -sonorant...] formatted_result = f"/{symbol}/: [{', '.join(result)}]" formatted_correctness = f"{incorrect_count} Incorrect answers. {correctness}" return formatted_result, formatted_correctness # Gradio app def interface(): with gr.Blocks() as app: gr.Markdown("### IPA Feature Marking Quiz") # Start button to display a new symbol start_button = gr.Button("Start Quiz") symbol_display = gr.Textbox(label="IPA Symbol", interactive=False) # Feature selection buttons (user clicks either + or - for each feature) user_syllabic = gr.Radio(label="Syllabic", choices=['+', '-']) user_consonantal = gr.Radio(label="Consonantal", choices=['+', '-']) user_sonorant = gr.Radio(label="Sonorant", choices=['+', '-']) user_coronal = gr.Radio(label="Coronal", choices=['+', '-']) user_anterior = gr.Radio(label="Anterior", choices=['+', '-']) user_continuant = gr.Radio(label="Continuant", choices=['+', '-']) user_nasal = gr.Radio(label="Nasal", choices=['+', '-']) user_strident = gr.Radio(label="Strident", choices=['+', '-']) user_lateral = gr.Radio(label="Lateral", choices=['+', '-']) user_delayed_release = gr.Radio(label="Delayed Release", choices=['+', '-']) user_voice = gr.Radio(label="Voice", choices=['+', '-']) # Submit button to validate the answers submit_button = gr.Button("Submit") # Output area to display the result output_result = gr.Textbox(label="Result (Features)", interactive=False) output_correctness = gr.Textbox(label="Correctness", interactive=False) # Event handlers start_button.click( fn=start_quiz, inputs=[], outputs=[symbol_display] ) submit_button.click( fn=validate_features, inputs=[symbol_display, user_syllabic, user_consonantal, user_sonorant, user_coronal, user_anterior, user_continuant, user_nasal, user_strident, user_lateral, user_delayed_release, user_voice], outputs=[output_result, output_correctness] ) return app # Launch the app app = interface() app.launch()