File size: 8,625 Bytes
aababd6
 
 
 
 
 
 
 
 
 
 
 
 
d99b1e1
 
da2cec9
 
aababd6
 
 
 
 
 
 
 
280ff23
ea05f9e
 
 
aababd6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
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()