[从零开始]用python制作识图翻译器·三

该文介绍了如何使用conda创建Python开发环境,集成百度API进行在线文字识别和机器翻译,同时探讨了离线模式下的easyOCR和argos-translate工具。此外,还展示了使用PyQt5构建GUI界面及实现图形交互功能。
摘要由CSDN通过智能技术生成

具体实现

开发环境准备和验证

前期测试项目文件已上传到我的仓库

下载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()

测试效果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值