MK-316's picture
Update app.py
15bb464 verified
#@markdown Accuracy Score, Average, user name
import gradio as gr
import speech_recognition as sr
from Levenshtein import ratio
import tempfile
import numpy as np
import soundfile as sf
import pandas as pd
# Sample dataframe with sentences
data = {
"Sentences": [
"A stitch in time saves nine.",
"To be or not to be, that is the question.",
"Five cats were living in safe caves.",
"Hives give shelter to bees in large caves.",
"His decision to plant a rose was amazing.",
"She sells sea shells by the sea shore.",
"The colorful parrot likes rolling berries.",
"Time flies like an arrow; fruit flies like a banana.",
"Good things come to those who wait.",
"All human beings are born free and equal in dignity and rights."
]
}
df = pd.DataFrame(data)
user_scores = {}
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}"
def pronunciation_correction(name, expected_text, file_info):
user_spoken_text = transcribe_audio(file_info)
similarity = ratio(expected_text.lower(), user_spoken_text.lower())
score = float(f"{similarity:.2f}")
if name in user_scores:
user_scores[name].append(score) # Track scores for each user
else:
user_scores[name] = [score]
feedback = "Excellent pronunciation!" if score >= 0.9 else \
"Good pronunciation!" if score >= 0.7 else \
"Needs improvement." if score >= 0.5 else \
"Poor pronunciation, try to focus more on clarity."
return feedback, score
def calculate_average(name):
if name in user_scores and user_scores[name]:
filtered_scores = [score for score in user_scores[name] if score > 0] # Ignore zeros
average_score = sum(filtered_scores) / len(filtered_scores)
else:
average_score = 0
return f"😍 Great job, {name}! \n\nYour average score (excluding zeros) is: {average_score:.2f}. \nRemember, this score only focuses on the accuracy of individual sounds. \nKeep up the fun and enjoyment as you continue learning English!"
with gr.Blocks() as app:
name_input = gr.Textbox(label="Enter your name", placeholder="Type your name here...", value="")
with gr.Row():
sentence_dropdown = gr.Dropdown(choices=df['Sentences'].tolist(), label="Select a Sentence")
selected_sentence_output = gr.Textbox(label="Selected Text", interactive=False)
audio_input = gr.Audio(label="Upload Audio File", type="numpy")
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)")
complete_button = gr.Button("Complete")
average_output = gr.Textbox(label="Average Score Output", visible=True)
sentence_dropdown.change(lambda x: x, inputs=sentence_dropdown, outputs=selected_sentence_output)
check_pronunciation_button.click(
pronunciation_correction,
inputs=[name_input, sentence_dropdown, audio_input],
outputs=[pronunciation_feedback, pronunciation_score]
)
complete_button.click(
calculate_average,
inputs=[name_input],
outputs=average_output
)
app.launch(debug=True)