|
import gradio as gr |
|
import random |
|
|
|
|
|
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': '+'} |
|
} |
|
|
|
|
|
def start_quiz(): |
|
random_symbol = random.choice(list(ipa_features.keys())) |
|
return random_symbol |
|
|
|
|
|
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 |
|
} |
|
|
|
|
|
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}") |
|
|
|
|
|
formatted_result = f"/{symbol}/: [{', '.join(result)}]" |
|
formatted_correctness = f"{incorrect_count} Incorrect answers. {correctness}" |
|
|
|
return formatted_result, formatted_correctness |
|
|
|
|
|
def interface(): |
|
with gr.Blocks() as app: |
|
gr.Markdown("### IPA Feature Marking Quiz") |
|
|
|
|
|
start_button = gr.Button("Start Quiz") |
|
symbol_display = gr.Textbox(label="IPA Symbol", interactive=False) |
|
|
|
|
|
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 = gr.Button("Submit") |
|
|
|
|
|
output_result = gr.Textbox(label="Result (Features)", interactive=False) |
|
output_correctness = gr.Textbox(label="Correctness", interactive=False) |
|
|
|
|
|
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 |
|
|
|
|
|
app = interface() |
|
app.launch() |
|
|