import gradio as gr import emoji import os import openai import random from loguru import logger from dotenv import load_dotenv from retry import retry from typing import List, Dict, Optional from tqdm import tqdm from llm import LLM, get_languages, get_level_names # from speech import Speech load_dotenv() languages = get_languages() level_names = get_level_names() class Game: def __init__(self, n:int, input_countries:List[str], target_country:str, level:str, debug:bool=False): self.llm = LLM() # self.speech = Speech() self.n = n self.input_countries = input_countries self.target_country = target_country self.level = level self.debug = debug self.correct_answer = None self.score = {"correct": 0, "incorrect": 0} self.score_relative = {'correct': 0., 'incorrect': 0.} self.total = 0 # generate QAs before start # self.qas = self.llm.get_QAs(n=self.n, # input_countries=self.input_countries, # target_country=self.target_country, # level=self.level, # debug=self.debug) self.qas = [{ "original": "So you think you can translate?", "true": "Ja", "false": "Sure", "funny": "Igen" }] def get_qa(self): while len(self.qas) == 0: self.qas.extend(self.llm.get_QAs(n=self.n, input_countries=self.input_countries, target_country=self.target_country, level=self.level, debug=self.debug)) # get QA from list and remove it from list qa = self.qas.pop(0) logger.info(f"QAs left: {len(self.qas)}") question_md = f"## {qa['original']}" options = [qa["true"], qa["false"], qa["funny"]] true = qa["true"] random.shuffle(options) options_md = f"""### A: {options[0]}\n\n### B: {options[1]}\n\n### C: {options[2]}""" # get correct answer self.correct_answer = [letter for letter, option in zip(["A", "B", "C"], options) if option == true][0] logger.debug(f"get_qa()") logger.debug(f"Question: {question_md}") logger.debug(f"Options: {options}") logger.debug(f"Correct answer: {self.correct_answer}") return question_md, options_md def check_answer(self, answer): # check answer logger.info(f"Checking answer \"{answer}\" against \"{self.correct_answer}\"") result = answer == self.correct_answer # display output gr.Info(emoji.emojize(":thumbs_up:")+" Correct!") if result else gr.Info(emoji.emojize(":thumbs_down:"+f" Wrong! Correct answer was: {self.correct_answer}")) #output = emoji.emojize("# :thumbs_up:") if result else emoji.emojize("# :thumbs_down:") # update scores # self.score["correct"] += 1 if result else 0 # self.score["incorrect"] += 0 if result else 1 # self.total += 1 # score_relative = {'correct': self.score['correct']/self.total, 'incorrect': self.score['incorrect']/self.total} # get new question and answer question, options = self.get_qa() logger.debug(f"update()") logger.debug(f"Question: {question}") logger.debug(f"Options: {options}") return question, options def update_settings(self, new_input_countries, new_target_country, new_level): logger.debug(f"update_settings()") logger.debug(f"{new_input_countries = }") logger.debug(f"{new_target_country = }") logger.debug(f"{new_level = }") changed = False if new_input_countries != self.input_countries: self.input_countries = new_input_countries changed = True if new_target_country != self.target_country: self.target_country = new_target_country changed = True if new_level != self.level: self.level = new_level changed = True logger.debug(f"update_settings()") logger.debug(f"{self.input_countries = }") logger.debug(f"{self.target_country = }") logger.debug(f"{self.level = }") if changed: logger.info(f"Setting changed, generating new QAs...") gr.Info("Setting changed, generating new sentences...") self.qas = self.llm.get_QAs(n=1, input_countries=self.input_countries, target_country=self.target_country, level=self.level, debug=self.debug) # update question question, options = self.get_qa() return question, options def run(self, question, options, score_relative:Optional[Dict[str,str]]=None, share:bool=False, debug:bool=False): with gr.Blocks() as blocks: with gr.Tab("Game"): with gr.Column(): # show question question_md = gr.Markdown(question) # # add audio # self.speech.text_to_speech(question, self.input_countries[0]) # speech = gr.Audio("output.wav", interactive=False) # show answers answers_md = gr.Markdown(options) # add radio buttons radio = gr.Radio(choices=["A", "B", "C"], value=None, label=None, show_label=False, info=None) # add submit button button = gr.Button("Submit") # # show output box # output = gr.Markdown() # # show scores # if score_relative is None: # score_relative = {'correct': 0., 'incorrect': 0.} # scores = gr.Label(score_relative, label="Scores", show_label=False) #, visible=True if self.total > 0 else False) # event listener button.click(fn=self.check_answer, inputs=radio, outputs=[question_md, answers_md], scroll_to_output=True) with gr.Tab("Settings"): # Settings input_countries = gr.Dropdown( languages, value=self.input_countries, label="Input language(s)", multiselect=True, interactive=True) target_country = gr.Radio(languages, value=self.target_country, label="Output language", interactive=True) level = gr.Radio(level_names, value=self.level, label="Level", interactive=True) button = gr.Button("Update", interactive=True) button.click(fn=self.update_settings, inputs=[input_countries, target_country, level], outputs=[question_md, answers_md], scroll_to_output=True) return blocks.queue().launch(share=share, debug=debug) if __name__ == "__main__": game = Game(n=1, input_countries=["en"], target_country="de", level="complicated", debug=False) question, options = game.get_qa() game.run(question, options, share=False)