目錄
一、前言
之前因爲拿到了一本純英文的pdf文檔,而且無法劃詞以及複製任何內容,這對於英文較差的我閱讀起來極其不友好,於是產生了想實現一個工具,通過截屏圖片+ocr文字識別+翻譯功能來加快閱讀速度,於是就有了以下的代碼。代碼本身並不複雜,只是隨手寫的初版,可優化的點也有很多,歡迎各路大佬的指正。
二、主要功能
1、按下鍵盤s鍵,開啓截屏翻譯功能,按下鍵盤q鍵,停止截屏翻譯功能
2、點擊需要截取的位置的對角線兩點,對屏幕上的英文進行截屏
3、識別截屏中的英文
4、將英文段落進行句子劃分
5、翻譯劃分好的句子
6、輸出到控制檯
三、源碼
import pytesseract
from googletrans import Translator
import pyscreenshot as ImageGrab
from pynput import mouse, keyboard
import threading
start_flag = 0
flag = 0
start_x = 0
start_y = 0
end_x = 0
end_y = 0
def translate_picture(img):
text = pytesseract.image_to_string(img)
print(text.replace("\n", " ").split("."))
split_text = text.replace("\n", " ").split(".")
for i in split_text:
if i is not "":
i += "."
translator = Translator()
translation = translator.translate(i, dest="zh-CN")
print(translation.text)
def on_click(x, y, button, pressed):
global start_flag
global flag
global start_x
global start_y
global end_x
global end_y
if start_flag is 1:
if pressed:
flag += 1
if flag % 2 is 1:
start_x = x
start_y = y
print("start_x start_y")
print(start_x, start_y)
else:
end_x = x
end_y = y
print("end_x end_y")
print(end_x, end_y)
if start_x <= end_x and start_y <= end_y:
im = ImageGrab.grab(bbox=(start_x, start_y, end_x, end_y))
translate_picture(im)
elif start_x <= end_x and start_y >= end_y:
im = ImageGrab.grab(bbox=(start_x, end_y, end_x, start_y))
translate_picture(im)
elif start_x >= end_x and start_y <= end_y:
im = ImageGrab.grab(bbox=(end_x, start_y, start_x, end_y))
translate_picture(im)
elif start_x >= end_x and start_y >= end_y:
im = ImageGrab.grab(bbox=(end_x, end_y, start_x, start_y))
translate_picture(im)
def on_press(key):
global start_flag
try:
if key.char == "q":
start_flag = 0
elif key.char == "s":
start_flag = 1
except AttributeError:
print()
def thread_mouse_fun():
with mouse.Listener(on_click=on_click) as mouse_listener:
mouse_listener.join()
def thread_keyboard_fun():
with keyboard.Listener(on_press=on_press) as keyboard_listener:
keyboard_listener.join()
if __name__ == "__main__":
thread_keyboard = threading.Thread(target=thread_keyboard_fun)
thread_keyboard.start()
thread_mouse = threading.Thread(target=thread_mouse_fun)
thread_mouse.start()
四、執行結果
五、關鍵庫的使用(跨平臺庫)
1、pytesseract
一個基於google‘s Tesseract-OCR的封裝庫,用於識別圖片中的文本信息,同時支持很多種語言的識別,但是經過我的測試發現,對於簡體中文的識別效果很差,需要自己進行訓練。
2、googletrans
一個免費的,可以直接調用google Translate API的python庫,經過我的測試,翻譯效果非常好,而且沒有使用次數的限制,但是有翻譯的單詞數限制,每次翻譯的單詞數不能超過500個單詞,所以在程序中我增加了對於語句的分割,但是隻是簡單的通過句號來對段落進行分割,這種方式在一些語境下是不合適的,這其實也是機器翻譯文本時的最具有挑戰性的難題,如何準確區分一句話是值得優化的點。
3、pyscreenshot
一個用於對屏幕進行截屏並拷貝到PIL或者Pillow圖像對象中的庫,使用起來極其方便,不需要再額外做其它的轉換操作。
4、pynput
一個用於對鍵盤、鼠標等事件進行監聽的庫,在截取電腦屏幕的時候是一定需要對鼠標的點擊事件進行監控才能夠獲取到座標位置的,並且對於不同方向的截屏兩次鼠標的點擊位置也需要作出額外的判斷,以此來適應不同的截取屏幕方式。