目录
一、前言
之前因为拿到了一本纯英文的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
一个用于对键盘、鼠标等事件进行监听的库,在截取电脑屏幕的时候是一定需要对鼠标的点击事件进行监控才能够获取到座标位置的,并且对于不同方向的截屏两次鼠标的点击位置也需要作出额外的判断,以此来适应不同的截取屏幕方式。