#@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)