qqwjq1981 commited on
Commit
94373b1
·
verified ·
1 Parent(s): 88d98d8

Upload 3 files

Browse files
Files changed (4) hide show
  1. .gitattributes +1 -0
  2. NotoSansSC-Regular.ttf +3 -0
  3. app.py +89 -0
  4. requirements.txt +7 -0
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ NotoSansSC-Regular.ttf filter=lfs diff=lfs merge=lfs -text
NotoSansSC-Regular.ttf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5cf8b2a0576d5680284ab03a7a8219499d59bbe981a79bb3dc0031f251c39736
3
+ size 10560616
app.py ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import pytesseract
3
+ from PIL import Image, ImageDraw, ImageFont
4
+ import requests
5
+ import os
6
+ import uuid
7
+ from io import BytesIO
8
+ from dotenv import load_dotenv
9
+
10
+ load_dotenv()
11
+
12
+ AZURE_KEY = os.getenv("AZURE_TRANSLATOR_KEY")
13
+ AZURE_REGION = os.getenv("AZURE_TRANSLATOR_REGION")
14
+
15
+ def translate_text_azure(text: str, to_lang="en"):
16
+ if not text.strip():
17
+ return ""
18
+ url = f"https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&to={to_lang}"
19
+ headers = {
20
+ "Ocp-Apim-Subscription-Key": AZURE_KEY,
21
+ "Ocp-Apim-Subscription-Region": AZURE_REGION,
22
+ "Content-type": "application/json",
23
+ }
24
+ body = [{"text": text}]
25
+ response = requests.post(url, headers=headers, json=body)
26
+ return response.json()[0]["translations"][0]["text"]
27
+
28
+ def extract_and_translate(image: Image.Image):
29
+ # OCR
30
+ ocr_results = pytesseract.image_to_data(image, output_type=pytesseract.Output.DICT)
31
+
32
+ texts = []
33
+ boxes = []
34
+ for i in range(len(ocr_results['text'])):
35
+ text = ocr_results['text'][i].strip()
36
+ if text:
37
+ (x, y, w, h) = (ocr_results['left'][i], ocr_results['top'][i],
38
+ ocr_results['width'][i], ocr_results['height'][i])
39
+ translated = translate_text_azure(text)
40
+ texts.append({
41
+ "original": text,
42
+ "translated": translated,
43
+ "box": (x, y, w, h)
44
+ })
45
+ boxes.append((x, y, w, h))
46
+
47
+ return image, texts
48
+
49
+ def render_translated_image(image, translations):
50
+ image = image.copy()
51
+ draw = ImageDraw.Draw(image)
52
+ font = ImageFont.load_default()
53
+ for t in translations:
54
+ x, y, w, h = t["box"]
55
+ draw.rectangle((x, y, x+w, y+h), fill="white") # erase original text
56
+ draw.text((x, y), t["translated"], fill="black", font=font)
57
+ return image
58
+
59
+ def pipeline(img):
60
+ base_img, translations = extract_and_translate(img)
61
+ table_data = [[t["original"], t["translated"]] for t in translations]
62
+ return base_img, table_data, translations
63
+
64
+ def update_and_render(img, translations, updated_translations):
65
+ for i, updated in enumerate(updated_translations):
66
+ translations[i]["translated"] = updated[1]
67
+ return render_translated_image(img, translations)
68
+
69
+ with gr.Blocks() as demo:
70
+ with gr.Row():
71
+ input_image = gr.Image(type="pil", label="Upload Manga Page")
72
+ output_image = gr.Image(type="pil", label="Translated Image")
73
+
74
+ table = gr.Dataframe(headers=["Original", "Translated"], interactive=True)
75
+ hidden_state = gr.State()
76
+
77
+ with gr.Row():
78
+ translate_btn = gr.Button("Extract & Translate")
79
+ apply_btn = gr.Button("Render Final Image")
80
+
81
+ translate_btn.click(fn=pipeline,
82
+ inputs=input_image,
83
+ outputs=[input_image, table, hidden_state])
84
+
85
+ apply_btn.click(fn=update_and_render,
86
+ inputs=[input_image, hidden_state, table],
87
+ outputs=output_image)
88
+
89
+ demo.launch()
requirements.txt ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ gradio
2
+ pillow
3
+ pytesseract
4
+ opencv-python
5
+ matplotlib
6
+ requests
7
+ easyocr