Spaces:
Sleeping
Sleeping
#@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) |