Spaces:
Sleeping
Sleeping
| 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() | |