ZhehanZ's picture
Update app.py
5fb739a verified
import gradio as gr
from io import BytesIO
import fitz
import tempfile
import openai
class TranslationAgent:
def __init__(self, openai_key):
self.memory = []
system_msg = "You are a translator from english to chinese (简体中文).\n" \
" The only thing you do is to translate.\n" \
" You don't write anything other then the translation of the text you get.\n" \
" The user will only provide the text without asking anything, but what he wants is the translation.\n" \
" Never return the translation of a previously translated part!\n " \
" The text you will need to translate will often include nonesense stuff because it is coming from a text extraction of a pdf file including images and table.\n" \
" Do your best to translate also this messy parts."
self.memory.append({"role": "system", "content": system_msg})
openai.api_key = openai_key
def fade_memory(self):
if len(self.memory) >= 5:
del self.memory[1:3]
def translate_chunk(self, chunk):
self.memory.append({"role": "user", "content": chunk})
response = openai.ChatCompletion.create(
model="gpt-4-turbo-preview",
messages=self.memory
)
reply = response["choices"][0]["message"]["content"]
self.memory.append({"role": "assistant", "content": reply})
self.fade_memory()
return reply
def extract_text_from_pdf(pdf, start, stop):
text = ""
with fitz.open(stream=BytesIO(pdf), filetype='pdf') as doc: # remove .read()
for i, page in enumerate(doc):
if start <= i:
if i <= stop:
text += page.get_text()
else:
break
return text
def split_text(text, chunk_size=100):
words = text.split()
chunks = []
current_chunk_words = []
for word in words:
current_chunk_words.append(word)
if word.endswith('.') and len(current_chunk_words) >= chunk_size:
chunks.append(' '.join(current_chunk_words))
current_chunk_words = []
# add the last chunk if any words remain
if current_chunk_words:
chunks.append(' '.join(current_chunk_words))
return chunks
def translate_pdf(openai_key, pdf, start, stop):
translator = TranslationAgent(openai_key)
translated_text = ""
error_message = "Translation Successful"
try:
# extract text
if pdf is not None:
text = extract_text_from_pdf(pdf, start=start, stop=stop)
chunks = split_text(text)
translated_chunks = []
for chunk in chunks:
translated_chunk = translator.translate_chunk(chunk)
translated_chunks.append(translated_chunk + " ")
translated_text = ' '.join(translated_chunks)
except Exception as e:
error_message = f"Translation Failed: {e}"
# Create a temporary file with a specific prefix
temp = tempfile.NamedTemporaryFile(delete=False, prefix="translatedPDF_", suffix=".txt")
# Write to the temporary file
with open(temp.name, 'w', encoding='utf-8') as f:
f.write(translated_text)
return translated_text, error_message, temp.name
iface = gr.Interface(
fn=translate_pdf,
inputs=[
gr.Textbox(lines=1, label="OpenAI API key",
placeholder="Enter your OpenAI API key here"),
gr.File(type="binary", label="PDF file", ),
gr.Number(label="Starting Page", ),
gr.Number(label="Final Page")
],
outputs=["text", "text", gr.File(label="Translated Text File")],
title="Pdf Translator: English ==> Chinese",
)
iface.launch()