环境:Python3.7
目录
概念解释
图片翻译:基于文字识别与文本翻译技术,结合组段和渲染技术,满足用户翻译图片文字的需求,提升输入效率。
有道智云 API
想要批量翻译图片,并将翻译内容合并在原图片上,即不改变图片背景,翻译图片中的英文(例如下面两张图),我们可以使用有道智云(当然也有网易有道词典、搜狗、QQ 截图翻译和微信截图翻译,这里面微信截图翻译个人认为效果最好)提供的翻译服务,而不需要知道具体的算法细节(毕竟大厂的翻译算法肯定比自己训练的牛)。
但是当我们有一堆图片需要翻译的时候,一个一个上传到网站上翻译太过繁琐,这时候就可以用到 Python 调用翻译网站提供的服务接口,实现批量图片翻译。有道的图片翻译 API 接口提供有道的图片文字识别翻译服务。只需要通过调用图片翻译 API,传入图片的 Base64 编码,指定源语言与目标语言,通过 POST 请求方式,就可以识别图片中的文字并进行翻译。
调用接口的代码
其实有道智云的技术文档里面已经给出了 Python3 以及其他语言调用接口的示例代码,我们只需要根据自己的需求稍加修改即可。
# -*- coding: utf-8 -*-
import sys
import uuid
import requests
import base64
import hashlib
import os
from imp import reload
reload(sys)
YOUDAO_URL = 'https://openapi.youdao.com/ocrtransapi'
APP_KEY = '###########'#自己申请
APP_SECRET = '#############'#自己申请
def encrypt(signStr):#对请求参数中的某些内容进行哈希编码
hash_algorithm = hashlib.md5()
hash_algorithm.update(signStr.encode('utf-8'))
return hash_algorithm.hexdigest()
def do_request(data):#发送请求
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
return requests.post(YOUDAO_URL, data=data, headers=headers)
def connect(file_in):#接口访问参数设置与发送请求
f = open(file_in, 'rb') # 二进制方式打开图文件
q = base64.b64encode(f.read()).decode('utf-8') # 读取文件内容,转换为base64编码
f.close()
data = {}
data['from'] = 'en'
data['to'] = 'zh-CHS'
data['type'] = '1'
data['q'] = q
salt = str(uuid.uuid1())
signStr = APP_KEY + q + salt + APP_SECRET
sign = encrypt(signStr)
data['appKey'] = APP_KEY
data['salt'] = salt
data['sign'] = sign
data['render']=1
response = do_request(data)
return response
注意想要调用接口还需要获得应用 ID 和应用密钥(获得后替换代码中对应位置),只需要点击下图中的立即使用,注册登录即可,由于翻译服务是需要付费的,大概几分钱一张,不过新用户会赠送 50 元的体验金,那么相当于批量翻译 1w 张以上的图片。
这里需要注意一个参数 render,他表示用户是否需要返回翻译后渲染的图片,默认为否,我们改为 1(是)即可得到翻译后的图片。所有接口调用参数见下图:
调用之后返回的是 json 格式的数据,其中不仅包括图片数据,还有诸多其他的数据(例如图片大小、方向,翻译文字等等),找到其中的图像数据后,将其转变编码后保存到. png 文件中。所有返回参数说明见下表:
字段名 | 字段说明 |
---|---|
orientation | 图片所对应的方向 |
lanFrom | ocr 所识别出来认为的图片中的语言 |
textAngle | 图片的倾斜角度 |
errorCode | 错误码 |
lanTo | 目标语言 |
resRegions | 图片翻译的具体内容 |
-boundingBox | 区域范围,四个值: 左上角的 x 值,左上角的 y 值,区域的的宽,区域的高 例如:134,0,1066,249 |
-linesCount | 行数(用于前端排版) |
-lineheight | 行高 |
-context | 该区域的原文 |
-linespace | 行间距 |
-tranContent | 翻译结果 |
-lines | 当 render=1 即返回渲染图片,返回结果 lines |
-color | 图片颜色(默认字段,暂不支持修改) |
-words | 字数组,当 render=1 即返回渲染图片 |
-text | 行识别结果,当 render=1 即返回渲染图片 |
-word | 识别的字的结果,当 render=1 即返回渲染图片 |
-textHeight | 文字的高度,当 render=1 即返回渲染图片 |
实现批量处理
下面的代码里还有一些读取需要翻译图片的文件夹中的所有图片路径,以及保存翻译后的图片的文件夹路径(自行修改),循环对路径中图片进行翻译和保存,这样就可以实现批量翻译图片啦~
def str_to_png(image_json,file_out):
image_str=image_json.encode('ascii')
image_byte = base64.b64decode(image_str)
with open(file_out,'wb') as f:
f.write(image_byte)
f.close
if __name__ == '__main__':
file_dir1=r'C:\Users\图片\\'#原图片的文件夹
file_dir2=r'C:\Users\图片翻译结果\\'#翻译后图片的文件夹
paths_tuple=os.walk(file_dir1)#返回三元组,包括路径,文件名
for root, dirs, files in paths_tuple:
for file in files:
split_file=os.path.splitext(file)#拆分成文件名和类型
if split_file[1] == '.png':#只处理.png图片
file_in=os.path.join(root, file)
file_out=os.path.join(file_dir2, file)
response=connect(file_in)#调用接口
str_to_png(response.json()['render_image'],file_out)#保存图片