|
|
|
import gradio as gr |
|
import openai |
|
import os |
|
import RiverValleyData |
|
import base64 |
|
|
|
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") |
|
openai.api_key = OPENAI_API_KEY |
|
|
|
def image_to_base64(img_path): |
|
with open(img_path, "rb") as img_file: |
|
return base64.b64encode(img_file.read()).decode('utf-8') |
|
|
|
img_base64 = image_to_base64("RiverValleySBC.JPG") |
|
img_html = f'<img src="data:image/jpg;base64,{img_base64}" alt="SBC6" width="300" style="display: block; margin: auto;"/>' |
|
|
|
def predict(question_choice, audio): |
|
|
|
with open(audio, "rb") as audio_file: |
|
transcript = openai.Audio.transcribe("whisper-1", audio_file) |
|
message = transcript["text"] |
|
|
|
|
|
strategy, explanation = RiverValleyData.strategy_text["SEP"] |
|
|
|
|
|
picture_description = RiverValleyData.description |
|
|
|
|
|
picture_description_inclusion = f""" |
|
For the first question, ensure your feedback refers to the picture description provided: |
|
{picture_description} |
|
""" if question_choice == RiverValleyData.questions[0] else "" |
|
|
|
|
|
conversation = [ |
|
{ |
|
"role": "system", |
|
"content": f""" |
|
You are an expert English Language Teacher in a Singapore Primary school, directly guiding a Primary 6 student in Singapore. |
|
The student is answering the question: '{question_choice}'. |
|
{picture_description_inclusion} |
|
Point out areas they did well and where they can improve, following the {strategy}. |
|
Encourage the use of sophisticated vocabulary and expressions. |
|
For the second and third questions, the picture is not relevant, so the student should not refer to it in their response. |
|
{explanation} |
|
The feedback should be in second person, addressing the student directly. |
|
""" |
|
}, |
|
{"role": "user", "content": message} |
|
] |
|
|
|
response = openai.ChatCompletion.create( |
|
model='gpt-3.5-turbo', |
|
messages=conversation, |
|
temperature=0.6, |
|
max_tokens=500, |
|
stream=True |
|
) |
|
|
|
partial_message = "" |
|
for chunk in response: |
|
if len(chunk['choices'][0]['delta']) != 0: |
|
partial_message = partial_message + chunk['choices'][0]['delta']['content'] |
|
yield partial_message |
|
|
|
|
|
iface = gr.Interface( |
|
fn=predict, |
|
inputs=[ |
|
gr.Radio(RiverValleyData.questions, label="Choose a question", default=RiverValleyData.questions[0]), |
|
gr.inputs.Audio(source="microphone", type="filepath") |
|
], |
|
outputs=gr.inputs.Textbox(), |
|
description=f'{img_html}<br><br><a href="https://forms.moe.edu.sg/forms/J0lmkJ" target="_blank">Click here to provide feedback on the initial prototype of the Oral Coach</a>', |
|
css="custom.css" |
|
) |
|
|
|
iface.queue(max_size=99, concurrency_count=40).launch(debug=True) |
|
|
|
|
|
|