FrenchTutor / app.py
majweldon's picture
Update app.py
bc6614b verified
import gradio as gr
import openai
import soundfile as sf
import speech_recognition as sr
from gtts import gTTS
import tempfile
import os
from openai import OpenAI
# Set your OpenAI API key
# Load API keys from an environment variables
OPENAI_SECRET_KEY = os.environ.get("OPENAI_SECRET_KEY")
openai.api_key = 'OPENAI_SECRET_KEY'
client = OpenAI(api_key = OPENAI_SECRET_KEY)
# Initialize recognizer
recognizer = sr.Recognizer()
# Generate a conversational question in French
def generate_question():
prompt = (
"Tu es un professeur de français. Pose une question en français qui imite un scénario réel, créatif et diversifié, "
"pour un élève qui apprend le français. Évite les questions banales sur le tourisme et les voyages."
)
response = client.chat.completions.create(
model="gpt-3.5-turbo-1106",
messages=prompt,
max_tokens=300,
temperature=0.2
)
question = response.choices[0].message.content
return question
# Record the user's response
def record_response():
with sr.Microphone() as source:
print("Recording your response...")
recognizer.adjust_for_ambient_noise(source)
audio_data = recognizer.listen(source)
return audio_data
# Transcribe the recorded audio
def transcribe_audio(audio_data):
try:
transcription = recognizer.recognize_google(audio_data, language="fr-FR")
return transcription
except sr.UnknownValueError:
return "Désolé, je n'ai pas compris. Pouvez-vous répéter?"
except sr.RequestError:
return "Erreur de reconnaissance vocale. Veuillez réessayer."
# Analyze the transcription and generate feedback
def generate_feedback(transcription):
prompt = (
f"Tu es professeur de français. Voici une réponse d'un élève : {transcription}. "
"Donne trois suggestions pour améliorer son français en te concentrant sur la grammaire et en évitant les anglicismes."
)
response = client.chat.completions.create(
model="gpt-3.5-turbo-1106",
messages=prompt,
max_tokens=300,
temperature=0.2
)
feedback = response.choices[0].message.content
return feedback
# Text-to-Speech for feedback
def speak_feedback(feedback):
tts = gTTS(text=feedback, lang='fr')
with tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) as temp_audio:
tts.save(temp_audio.name)
audio_file = temp_audio.name
return audio_file
# Gradio UI functions
def ask_question():
question = generate_question()
return question
def record_and_transcribe():
audio_data = record_response()
transcription = transcribe_audio(audio_data)
return transcription
def provide_feedback(transcription):
feedback = generate_feedback(transcription)
return feedback
def speak_out_feedback(feedback):
audio_file = speak_feedback(feedback)
return audio_file
# Gradio Interface
with gr.Blocks() as french_chatbot:
question_output = gr.Textbox(label="Question pour vous")
transcription_output = gr.Textbox(label="Votre réponse transcrite")
feedback_output = gr.Textbox(label="Suggestions pour améliorer votre français")
with gr.Row():
generate_question_button = gr.Button("Générer une Question")
record_response_button = gr.Button("Enregistrer et Transcrire")
generate_feedback_button = gr.Button("Générer des Suggestions")
speak_feedback_button = gr.Audio(label="Écouter Suggestions")
generate_question_button.click(fn=ask_question, outputs=question_output)
record_response_button.click(fn=record_and_transcribe, outputs=transcription_output)
generate_feedback_button.click(fn=provide_feedback, inputs=transcription_output, outputs=feedback_output)
#speak_feedback_button.click(fn=speak_out_feedback, inputs=feedback_output, outputs=speak_feedback_button)
french_chatbot.launch()