MK-316's picture
Update app.py
ea05f9e verified
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()