Spaces:
Sleeping
Sleeping
import gradio as gr | |
import speech_recognition as sr | |
from pydub import AudioSegment | |
import os | |
from gtts import gTTS | |
def transcribe_audio(audio): | |
recognizer = sr.Recognizer() | |
audio = AudioSegment.from_file(audio) | |
audio.export("temp.wav", format="wav") | |
with sr.AudioFile("temp.wav") as source: | |
audio_data = recognizer.record(source) | |
try: | |
text = recognizer.recognize_google(audio_data) | |
except sr.UnknownValueError: | |
text = "Sorry, I could not understand the audio." | |
except sr.RequestError: | |
text = "Sorry, there was an error with the speech recognition service." | |
os.remove("temp.wav") | |
return text | |
def speak_text(text): | |
tts = gTTS(text) | |
tts.save("question.mp3") | |
return "question.mp3" | |
questions = [ | |
{"context": "Let's talk about the story, My Dad's birthday party. Today is your dad’s birthday. So you and your family will have a party tonight.", "question": "What will your mom do for the party?", "label": "Transcription of Mom's action", "answer": "She will cook the dinner."}, | |
{"context": "Look at the page 12 and 13.", "question": "What is she doing?", "label": "Transcription of Mom's action", "answer": "She is cooking."}, | |
{"context": "How about your brother?", "question": "What will he do for the party?", "label": "Transcription of Brother's action", "answer": "He will sing a birthday song."}, | |
{"context": "Look at the picture.", "question": "What is he doing?", "label": "Transcription of Brother's action", "answer": "He is singing."}, | |
{"context": "Okay, next,", "question": "How about you? What will you do for the party?", "label": "Transcription of Your action", "answer": "I will write a birthday card."}, | |
{"context": "Let's move on to the story 'Owls are special'. Owls are nocturnal.", "question": "When do they sleep?", "label": "Transcription of sleep time", "answer": "They sleep during the day."}, | |
{"context": "Look at the page 21, they have very special eyes.", "question": "So, what can they do with their special eyes?", "label": "Transcription of eye ability", "answer": "They can see well at night."}, | |
{"context": "Now, these questions are based on the story 'I will go shopping'. You have many things to buy. First, you need to buy a book. So, you will go to the bookstore. The bookstore is far away.", "question": "How will you go to the bookstore?", "label": "Transcription of transport method", "answer": "I will take the bus."}, | |
{"context": "Now you need to buy some bread.", "question": "Where will you go?", "label": "Transcription of place", "answer": "I will go to the bakery."}, | |
{"context": "Let's talk about the story 'Guide dogs'. Blind people can't see. But, they can still do things.", "question": "How can they do?", "label": "Transcription of how blind people do things", "answer": "They have guide dogs."}, | |
{"context": "Guide dogs help blind people with everything. For example, they bring things for them. They help them. They open doors for them.", "question": "What else can they do for them?", "label": "Transcription of other abilities", "answer": "They can turn the TV on and off."} | |
] | |
current_question = 0 | |
responses = [] | |
def next_question(): | |
global current_question | |
if current_question < len(questions): | |
context = questions[current_question].get("context", "") | |
question = questions[current_question]["question"] | |
full_text = f"{context} {question}" | |
question_audio = speak_text(full_text) | |
current_question += 1 | |
return gr.update(value=question_audio, visible=True), gr.update(visible=True), questions[current_question-1]["label"], gr.update(visible=True), gr.update(visible=False), gr.update(visible=False) | |
else: | |
final_results = evaluate_responses() | |
return gr.update(visible=False), gr.update(visible=False), gr.update(visible=False), gr.update(visible=False), gr.update(value=final_results, visible=True), gr.update(visible=True) | |
def save_response(audio): | |
transcription = transcribe_audio(audio) | |
responses.append(transcription) | |
return transcription | |
def evaluate_responses(): | |
result = "<h2>Your Responses:</h2><br>" | |
for i, question in enumerate(questions): | |
user_response = responses[i] if i < len(responses) else "No response" | |
result += f"<b>Q:</b> {question['question']}<br><b>Your Answer:</b> {user_response}<br><br>" | |
return result | |
def reset(): | |
global current_question, responses | |
current_question = 0 | |
responses = [] | |
return next_question() | |
with gr.Blocks() as demo: | |
gr.Markdown("### Interactive Questions") | |
question_audio = gr.Audio(label="Question", visible=False) | |
audio_input = gr.Audio(type="filepath", label="Your answer", visible=True) | |
transcription_output = gr.Textbox(label="Transcription", visible=True) | |
btn_next = gr.Button("Next", visible=True) | |
btn_restart = gr.Button("Restart", visible=False) | |
final_output = gr.HTML(visible=False) | |
def load_first_question(): | |
return next_question() | |
demo.load(load_first_question, outputs=[question_audio, audio_input, transcription_output, btn_next, final_output, btn_restart]) | |
btn_next.click(next_question, outputs=[question_audio, audio_input, transcription_output, btn_next, final_output, btn_restart]) | |
btn_restart.click(reset, outputs=[question_audio, audio_input, transcription_output, btn_next, final_output, btn_restart]) | |
audio_input.change(save_response, inputs=audio_input, outputs=transcription_output) | |
demo.launch() |