AlsoEasy-RecognitionTranslator
- 具体实现
- 开发环境准备和验证
- 下载conda
- 创建开发环境
- 文字识别模块
- 在线模块
- 离线模块
- 机器翻译模块
- 在线模块
- 离线模块
- GUI
- GUI-定位模块
- GUI-截图模块
具体实现
开发环境准备和验证
前期测试项目文件已上传到我的仓库。
下载conda
conda是python的版本管理工具,因为不同库要求的python版本不一样,非常容易起冲突,所以建议装个conda来管理不同的生产环境,这里就偷个懒贴别人的安装教程了。
创建开发环境
cmd运行如下命令:
conda create -n test python==3.7.2
键入y并回车。
完成后cmd运行如下命令,进入测试环境(前面有环境名即进入了相应环境):
conda activate test
后面如果使用pip命令时出现"runtime out"错误,建议使用换源命令下载,以豆瓣换源下载torch为例:
pip install --index-url https://pypi.douban.com/simple torch
文字识别模块
在线模块
使用百度的开放接口。虽然是免费的,但需要按照参考教程注册开发者帐号并申请调用权限,获取"APP_ID"、“API_KEY”、"SECRET_KEY"三个关键字。做完以上操作以后,在开发环境中使用pip命令添加依赖:
pip install baidu-aip
pip install chardet
然后用如下代码测试一下接口能否正常使用吧,将如下代码保存为py文件,并在cmd中相应目录下用python命令运行:
from aip import AipOcr
config = {
'BAIDU_OCR_APP_ID': '', # 这里写自己的 APP_ID
'BAIDU_OCR_API_KEY': '', # 这里写自己的 API_KEY
'BAIDU_OCR_SECRET_KEY': '' # 这里写自己的 SECRET_KEY
}
path = 'D:\pybox\folder\test\example1.jpg' # 写上你要检测图片的绝对地址
# 下面的部分都不用动,检测的语言类型的关键字可以根据你检测图片的文字做变换
LANS = ['CHN_ENG','ENG','JAP','KOR'] # 记录语言类型的关键字
default_options = { # 这里是一些检测选项
"language_type": "JAP", # 检测的语言类型,JAP表示日文
"detect_direction": "false", # 是否检测语言方向
"detect_language": "true", # 是否检测语言类型
"paragraph": "false", # 是否输出段落信息
"probability": "false" # 是否返回每段置信度
}
client = AipOcr(
config['BAIDU_OCR_APP_ID'],
config['BAIDU_OCR_API_KEY'],
config['BAIDU_OCR_SECRET_KEY']
)
with open(path, 'rb') as f:
result = client.basicGeneral(f.read(), default_options)
print(result)
这里提供一张样图和相应的测试结果
离线模块
使用easyOCR模型,这个模型对游戏文本框这种文字明晰的简单环境识别率高,识别速度快。唯一比较麻烦的是初次使用需要下载模型。使用pip命令添加依赖:
pip install easyocr
如果出现"runtime out"错误,记得使用换源命令下载:
pip install --index-url https://pypi.douban.com/simple easyocr
如果模型下载得太慢了可以到我的百度里下载备份,提取码:vci8。
测试代码如下:
import easyocr
import os
__PATH__ = os.path.dirname(os.path.abspath(__file__))
__MODEL_PATH__ = os.path.join(__PATH__, '../model')
# ch_tra 繁体
LANS = ['ch_sim','en','ja','ko']
path = r'D:\pybox\folder\test\example4.jpg' # 这里写自己测试图片的绝对路径
client = easyocr.Reader(
lang_list = ['en','ja'], # 识别语言,可多项
download_enabled = True, # 自动下载模型
model_storage_directory = __MODEL_PATH__ # 设置模型保存路径
)
result = client.readtext(path)
print(result)
此处同样提供一张测试图样和测试结果:
当然离线ocr模块也可以选择pp-ocr,虽然pp-ocr的功能十分强大并且识别率也是极高,但是pp-ocr的依赖十分复杂并且需要手动选择复杂模型,过程比较繁琐,故不推荐。
tesseractOCR因为有python版本冲突、识别率较低等问题故不作考虑。
机器翻译模块
在线模块
在线翻译同样选择百度的百度翻译(百度真好用!)。同样需要我们按照百度的官方教程申请权限,获取"appid"和"SECRET_KEY"关键字。
因为百度翻译的api使用的网络请求接口的方式,故不需要再添加依赖,直接调用如下测试代码:
# API文档地址: https://fanyi-api.baidu.com/product/113
import hashlib
import json
from random import randint
import time
import urllib.request
import urllib.parse
MAX_RESP_TIME = 5 # 超时最大重传数
REQUEST_FAILED = -1 # 请求失败码
LANS = ['auto','zh','en','jp','kor'] # 语言类型关键字
encoding = 'utf-8' # 编码用utf-8
SECRET_KEY = '' # 填上自己的SECRET_KEY
options = {
'appid': '', # 填上自己的APP_ID
'salt': '777', # 只是一个随机数,用于和sign进行验证
'from': 'en', # 源语言类型,自己根据翻译内容做修改
'to': 'zh', # 目标语言类型,自己根据翻译内容做修改
'q': '', # 翻译的文本内容
'sign': '' # 数字签名
}
def trans(content, lfrom):
url = 'https://fanyi-api.baidu.com/api/trans/vip/translate'
options['q'] = content
options['from'] = lfrom
options['sign'] = getMD5(options['appid'] + content + options['salt'] + SECRET_KEY)
html = getTranslateResponce(url, options)
res = json.loads(html)
i = 0
while i < MAX_RESP_TIME:
if res.get('error_code') != REQUEST_FAILED:
break
i += 1
print('本次请求失败,原因为:', res['error_msg'])
time.sleep(1)
html = getTranslateResponce(url, options)
res = json.loads(html)
print(res)
# md5加密生成数字签名sign
def getMD5(content):
return hashlib.md5(content.encode(encoding)).hexdigest()
# 发送http网络接口请求
def getTranslateResponce(url, data):
data = urllib.parse.urlencode(data).encode(encoding)
response = urllib.request.urlopen(url, data)
return response.read().decode(encoding)
test_text_en = 'A secret makes a woman woman.'
test_text_jp = '真実はいつもひとつ。'
trans(test_text_en, 'en')
trans(test_text_jp, 'jp')
得到结果:
离线模块
在github上搜索“offline translate”,直接找高星项目。发现argos-translate简单好用,故冲之。
按照代码仓库readme的教程,pip下载依赖。
pip install argostranslate
当然因为是离线的,同样也需要下载模型。不过可以直接用代码中下载,下载速度也很快:
# API文档地址: https://github.com/argosopentech/argos-translate
# 模型下载地址:https://www.argosopentech.com/argospm/index/
from email.policy import default
from argostranslate import package, translate
# 中-3 英-0 日-16 韩-17
LANS = [3, 0, 16, 17]
MIDDLEWARE = 0 # 中间转换语言
options = {
'from': LANS[2],
'to': LANS[0]
}
translation = [None, None]
client = translate.get_installed_languages() # 下载语言包
print(package.get_available_packages()) # 查看能用的语言包
# 因为都是某语言译英或者英译某语言,所以如果源语言和目标语言不包含英语时需要进行二次转换
def trans(content):
if options['from'] == MIDDLEWARE | options['to'] == MIDDLEWARE:
translation[0] = client[options['from']].get_translation(client[options['to']])
return translation[0].translate(content)
else:
translation[0] = client[options['from']].get_translation(client[MIDDLEWARE])
translation[1] = client[MIDDLEWARE].get_translation(client[options['to']])
mid = translation[0].translate(content)
return translation[1].translate(mid)
result = trans('真実はいつもひとつ。')
print(result)
注意:argostranslate只支持某译英或英译某,所以在源语言和目标语言中不含英语时,需要先翻译成英语再翻译成目标语言。因此日译汉时会出现不小的精度损失。
GUI
前文已经解释过选择pyqt而非wxpython的原因。直接pip添加GUI的依赖:
pip install PyQt5
测试代码如下:
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QPlainTextEdit
import PyQt5.QtWidgets as QT
# 应用
app = QApplication([])
# 绘制窗口
window = QMainWindow()
window.resize(500, 400)
window.move(300, 310)
window.setWindowTitle('薪资统计')
textEdit = QPlainTextEdit(window)
textEdit.setPlaceholderText("请输入薪资表")
textEdit.move(10,25)
textEdit.resize(300,350)
button = QPushButton('统计', window)
button.move(380,80)
# 事件注册
def handleCalc():
window.close()
button.clicked.connect(handleCalc)
# 窗口显示
window.show()
app.exec_()
演示结果(这只是一个简单的demo,点击统计按钮窗口就会关闭):
GUI-定位模块
import sys,math
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class Drawing(QWidget):
def __init__(self, parent = None):
super(Drawing, self).__init__(parent)
self.resize(600,400)
self.setWindowTitle('拖拽绘制矩形')
self.rect = None
#重写绘制函数
def paintEvent(self, event):
#初始化绘图工具
qp = QPainter()
#开始在窗口绘制
qp.begin(self)
#自定义画点方法
if self.rect:
self.drawRect(qp)
#结束在窗口的绘制
qp.end()
def drawRect(self, qp):
#创建红色,宽度为4像素的画笔
pen = QPen(Qt.red, 4)
qp.setPen(pen)
qp.drawRect(*self.rect)
#重写三个时间处理
def mousePressEvent (self, event):
print("mouse press")
self.rect = (event.x(), event.y(), 0, 0)
def mouseReleaseEvent (self, event) :
print("mouse release")
def mouseMoveEvent(self, event):
start_x, start_y = self.rect[0:2]
self.rect = (start_x, start_y, event.x() - start_x, event.y() - start_y)
self.update()
if __name__ == '__main__':
app=QApplication(sys.argv)
demo=Drawing()
demo.show()
sys.exit(app.exec_())
测试效果(在窗口内用鼠标拖拽绘制矩形):
GUI-截图模块
from PIL import ImageGrab
import os
__dir__ = os.path.dirname(os.path.abspath(__file__))
__cache_path__ = os.path.join(__dir__, '../shot_cache.jpg')
position = [100, 0, 500, 1000] # 左上右下定位
# 开始截图
def capturePhoto(position):
# 左上右下
img = ImageGrab.grab(position)
img.save(__cache_path__)
return img
img = capturePhoto(position)
# 显示截图
img.show()
测试效果: