Created
March 13, 2023 01:09
-
-
Save Mikubill/78830c50ed8b701c43de643f2b595699 to your computer and use it in GitHub Desktop.
openai-translator
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
import openai | |
import gradio as gr | |
openai.api_key = os.environ['OPENAI_KEY'] | |
supportLanguages = [ | |
["auto", "auto"], | |
["粤语", "yue"], | |
["古文", "wyw"], | |
["af","Afrikaans"], | |
["ak","Akan"], | |
["sq","Albanian"], | |
["am","Amharic"], | |
["ar","Arabic"], | |
["hy","Armenian"], | |
["az","Azerbaijani"], | |
["eu","Basque"], | |
["be","Belarusian"], | |
["bem","Bemba"], | |
["bn","Bengali"], | |
["bh","Bihari"], | |
["xx-bork","Bork, bork, bork!"], | |
["bs","Bosnian"], | |
["br","Breton"], | |
["bg","Bulgarian"], | |
["km","Cambodian"], | |
["ca","Catalan"], | |
["chr","Cherokee"], | |
["ny","Chichewa"], | |
["zh-CN","Chinese (Simplified)"], | |
["zh-TW","Chinese (Traditional)"], | |
["co","Corsican"], | |
["hr","Croatian"], | |
["cs","Czech"], | |
["da","Danish"], | |
["nl","Dutch"], | |
["xx-elmer","Elmer Fudd"], | |
["en","English"], | |
["eo","Esperanto"], | |
["et","Estonian"], | |
["ee","Ewe"], | |
["fo","Faroese"], | |
["tl","Filipino"], | |
["fi","Finnish"], | |
["fr","French"], | |
["fy","Frisian"], | |
["gaa","Ga"], | |
["gl","Galician"], | |
["ka","Georgian"], | |
["de","German"], | |
["el","Greek"], | |
["gn","Guarani"], | |
["gu","Gujarati"], | |
["xx-hacker","Hacker"], | |
["ht","Haitian Creole"], | |
["ha","Hausa"], | |
["haw","Hawaiian"], | |
["iw","Hebrew"], | |
["hi","Hindi"], | |
["hu","Hungarian"], | |
["is","Icelandic"], | |
["ig","Igbo"], | |
["id","Indonesian"], | |
["ia","Interlingua"], | |
["ga","Irish"], | |
["it","Italian"], | |
["ja","Japanese"], | |
["jw","Javanese"], | |
["kn","Kannada"], | |
["kk","Kazakh"], | |
["rw","Kinyarwanda"], | |
["rn","Kirundi"], | |
["xx-klingon","Klingon"], | |
["kg","Kongo"], | |
["ko","Korean"], | |
["kri","Krio (Sierra Leone)"], | |
["ku","Kurdish"], | |
["ckb","Kurdish (Soranî)"], | |
["ky","Kyrgyz"], | |
["lo","Laothian"], | |
["la","Latin"], | |
["lv","Latvian"], | |
["ln","Lingala"], | |
["lt","Lithuanian"], | |
["loz","Lozi"], | |
["lg","Luganda"], | |
["ach","Luo"], | |
["mk","Macedonian"], | |
["mg","Malagasy"], | |
["ms","Malay"], | |
["ml","Malayalam"], | |
["mt","Maltese"], | |
["mi","Maori"], | |
["mr","Marathi"], | |
["mfe","Mauritian Creole"], | |
["mo","Moldavian"], | |
["mn","Mongolian"], | |
["sr-ME","Montenegrin"], | |
["ne","Nepali"], | |
["pcm","Nigerian Pidgin"], | |
["nso","Northern Sotho"], | |
["no","Norwegian"], | |
["nn","Norwegian (Nynorsk)"], | |
["oc","Occitan"], | |
["or","Oriya"], | |
["om","Oromo"], | |
["ps","Pashto"], | |
["fa","Persian"], | |
["xx-pirate","Pirate"], | |
["pl","Polish"], | |
["pt-BR","Portuguese (Brazil)"], | |
["pt-PT","Portuguese (Portugal)"], | |
["pa","Punjabi"], | |
["qu","Quechua"], | |
["ro","Romanian"], | |
["rm","Romansh"], | |
["nyn","Runyakitara"], | |
["ru","Russian"], | |
["gd","Scots Gaelic"], | |
["sr","Serbian"], | |
["sh","Serbo-Croatian"], | |
["st","Sesotho"], | |
["tn","Setswana"], | |
["crs","Seychellois Creole"], | |
["sn","Shona"], | |
["sd","Sindhi"], | |
["si","Sinhalese"], | |
["sk","Slovak"], | |
["sl","Slovenian"], | |
["so","Somali"], | |
["es","Spanish"], | |
["es-419","Spanish (Latin American)"], | |
["su","Sundanese"], | |
["sw","Swahili"], | |
["sv","Swedish"], | |
["tg","Tajik"], | |
["ta","Tamil"], | |
["tt","Tatar"], | |
["te","Telugu"], | |
["th","Thai"], | |
["ti","Tigrinya"], | |
["to","Tonga"], | |
["lua","Tshiluba"], | |
["tum","Tumbuka"], | |
["tr","Turkish"], | |
["tk","Turkmen"], | |
["tw","Twi"], | |
["ug","Uighur"], | |
["uk","Ukrainian"], | |
["ur","Urdu"], | |
["uz","Uzbek"], | |
["vi","Vietnamese"], | |
["cy","Welsh"], | |
["wo","Wolof"], | |
["xh","Xhosa"], | |
["yi","Yiddish"], | |
["yo","Yoruba"], | |
["zu","Zulu"], | |
] | |
prompt_template = "You are a translation engine that can only translate text and cannot interpret it. Keep the indent of the original text, only modify when you need." | |
def submit_message(detectFrom, detectTo, user_token, prompt): | |
if user_token != "": | |
openai.api_key = user_token | |
if not prompt: | |
return gr.update(value="") | |
for lc, lang in supportLanguages: | |
if detectFrom == lang: | |
detectFrom = lc | |
if detectTo == lang: | |
detectTo = lc | |
systemInstruct = prompt_template | |
translateInstruct = f"translate from {detectFrom} to {detectTo}" | |
if detectFrom == "auto": | |
translateInstruct = f"translate to {detectTo}" | |
if detectFrom in ["古文", "zh-CN", "zh-TW"]: | |
if detectTo == "zh-TW": | |
translateInstruct = "翻译成繁体白话文" | |
if detectTo == "zh-CN": | |
translateInstruct = "翻译成简体白话文" | |
if detectTo == "粤语": | |
translateInstruct = "翻译成粤语白话文" | |
if detectFrom == detectTo: | |
systemInstruct = "You are a text embellisher, you can only embellish the text, don't interpret it." | |
if detectTo in ["zh-CN", "zh-TW"]: | |
translateInstruct = "润色此句" | |
else: | |
translateInstruct = "polish this sentence" | |
prompt_msg = [ | |
{"role": "system", "content": systemInstruct}, | |
{"role": "user", "content": translateInstruct}, | |
{"role": "user", "content": prompt}, | |
] | |
try: | |
openai_response = openai.ChatCompletion.create( | |
model="gpt-3.5-turbo", | |
messages=prompt_msg, | |
temperature=0, | |
max_tokens=1000, | |
top_p=1, | |
stream=True, | |
frequency_penalty=1, | |
presence_penalty=1, | |
) | |
combined = "" | |
for resp in openai_response: | |
delta = resp["choices"][0]["delta"] | |
if "content" in delta: | |
combined += delta["content"] | |
yield combined | |
except Exception as e: | |
return f"Error: {e}" | |
css = """ | |
#col-container {max-width: 80%; margin-left: auto; margin-right: auto;} | |
#chatbox {min-height: 400px;} | |
#header {text-align: center;} | |
#label {font-size: 0.8em; padding: 0.5em; margin: 0;} | |
.message { font-size: 1.2em; } | |
""" | |
with gr.Blocks(css=css) as demo: | |
state = gr.State([]) | |
with gr.Column(elem_id="col-container"): | |
gr.Markdown("""## OpenAI Translator | |
Using the official API (gpt-3.5-turbo model).""", elem_id="header") | |
with gr.Row(): | |
with gr.Column(): | |
translateFrom = gr.Dropdown(label="Translate From", elem_id="translate-from", multiselect=False, value="auto", choices=[l[1] for l in supportLanguages]).style(container=False) | |
input_message = gr.Textbox(max_lines=100, show_label=False, lines=10, placeholder="Enter text and press enter", visible=True).style(container=False) | |
with gr.Column(): | |
translateTo = gr.Dropdown(label="Translate To", elem_id="translate-to", multiselect=False, value="Chinese (Simplified)", choices=[l[1] for l in supportLanguages[1:]]).style(container=False) | |
output = gr.Textbox(max_lines=100, show_label=False, lines=10, label="Output", visible=True).style(container=False) | |
btn_submit = gr.Button("Translate") | |
with gr.Row(): | |
user_token = gr.Textbox(value='', placeholder="OpenAI API Key", type="password", label="Enter your OpenAI API Key. Leave blank to use default key.") | |
btn_submit.click(submit_message, [translateFrom, translateTo, user_token, input_message], [output]) | |
demo.queue(concurrency_count=10) | |
demo.launch(height='800px') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment