MK-316's picture
Update app.py
e0fb459 verified
import gradio as gr
import speech_recognition as sr
from Levenshtein import ratio
import tempfile
import numpy as np
import soundfile as sf
import random
# Datasets
data1 = [
"They reserved a seat at the grand feast.",
"Tim used a mitt to catch the ball.",
"They walked past the end of the trail.",
"Who'd thought the wood to visit?",
"Luke took two steps to look further.",
"The boss bought soy milk.",
"A ton of people waited for the bus to come.",
"The girl watched the perfect red bird."
]
data2 = [
"They chose the right light.",
"They’ll leave the lamp on late.",
"The magic show brought no pleasure.",
"She asks for help to pave the path.",
"The theme was about making thin dough.",
"The pine forest looked fine.",
"The butter was better than any batter."
]
# Initialize a list to keep track of scores
scores = []
# Function to transcribe audio and get the similarity score
def transcribe_audio(file_info):
r = sr.Recognizer()
with tempfile.NamedTemporaryFile(delete=True, suffix=".wav") as tmpfile:
sf.write(tmpfile.name, data=file_info[1], samplerate=44100, format='WAV')
tmpfile.seek(0)
with sr.AudioFile(tmpfile.name) as source:
audio_data = r.record(source)
try:
text = r.recognize_google(audio_data)
return text
except sr.UnknownValueError:
return "Could not understand audio"
except sr.RequestError as e:
return f"Could not request results; {e}"
# Function to calculate pronunciation correction
def pronunciation_correction(expected_text, file_info):
user_spoken_text = transcribe_audio(file_info)
similarity = ratio(expected_text.lower(), user_spoken_text.lower())
similarity = similarity
description = f"{similarity:.2f}"
if similarity >= 0.95:
feedback = "Excellent!"
elif similarity >= 0.9:
feedback = "Got it; No problem!"
elif similarity >= 0.8:
feedback = "I'll listen carefully when you say :-)"
elif similarity >= 0.5:
feedback = "I think I heard you :-)"
else:
feedback = "What did you say?"
# Append the score to the scores list
scores.append(similarity)
return feedback, description
# Function to display average score
def show_average_score():
if scores:
average_score = sum(scores) / len(scores)
return f"Average Pronunciation Score: {average_score:.2f}"
else:
return "No scores available yet."
# Select a random sentence from the chosen dataset
def random_sentence(data_selected):
if data_selected == "Vowels":
dataset = data1
elif data_selected == "Consonants":
dataset = data2
else:
return "Please select a dataset."
return random.choice(dataset)
# Gradio app
with gr.Blocks() as app:
# Dataset selection using Radio Buttons
gr.Markdown("## ✨ Pronunciation Checker")
gr.Markdown("To reset, refresh the page.")
data_radio = gr.Radio(choices=["Vowels", "Consonants"], label="Select practice focus:", interactive=True)
show_button = gr.Button("Show Sentence")
sentence_output = gr.Textbox(label="Sentence to Practice", interactive=False)
# Show a new random sentence each time "Show Sentence" is clicked
show_button.click(
lambda data_selected: random_sentence(data_selected),
inputs=data_radio,
outputs=sentence_output
)
audio_input = gr.Audio(label="Upload Audio File", type="numpy")
gr.Markdown("### Instructions\nWait until the wave is reloaded.")
check_pronunciation_button = gr.Button("Check Pronunciation")
pronunciation_feedback = gr.Textbox(label="Pronunciation Feedback")
pronunciation_score = gr.Number(label="Pronunciation Accuracy Score: 0 (No Match) ~ 1 (Perfect)")
# Check pronunciation when button is clicked
check_pronunciation_button.click(
pronunciation_correction,
inputs=[sentence_output, audio_input],
outputs=[pronunciation_feedback, pronunciation_score]
)
# Button and output to show the average score report
show_report_button = gr.Button("Show Report (Average)")
average_score_output = gr.Textbox(label="Average Pronunciation Score")
# Display average score when the Show Report button is clicked
show_report_button.click(
show_average_score,
outputs=average_score_output
)
app.launch(debug=True)