近小编遇到一个生存问题,女朋友让我给她翻译英文化妆品标签。美其名曰:"程序猿每天英语开发,英文一定很好吧,来帮我翻译翻译化妆品成分",”来,帮我看看这个面膜建议敷几分钟“。。。。看来斥巨资买化妆品不算完,还需要会各种英文介绍。
默默收起大学考的一摞429分的四级证书,我打开了IDE。。。我打算开发一个能批量翻译的图片的demo,把家里的各种化妆品都翻译好。机智如我,是不会自己从训练模型做起的,打开有道智云的友好的AI接口页面 ,果然有图片翻译服务,体验了一下可是真不错,于是果断使用。
效果展示
开发过程介绍
1、api接口介绍
先介绍下该工程的核心部分,有道智云图片翻译服务的调用接口
API HTTPS地址:https://openapi.youdao.com/ocrtransapi
接口调用方式:POST
请求格式:表单
相应格式:JSON
接口调用参数
调用API需要向接口发送以下字段来访问服务。
字段名 | 类型 | 含义 | 必填 | 备注 |
---|---|---|---|---|
type | text | 文件上传类型 | True | 目前支持Base64,请置该字段值为1 |
from | text | 源语言 | True | 参考下方的 支持语言 (可设置为auto) |
to | text | 目标语言 | True | 参考下方的 支持语言 (可设置为auto) |
appKey | text | 应用ID | True | 可在 应用管理 查看 |
salt | text | UUID | True | 1995882C5064805BC30A39829B779D7B |
sign | text | 签名 | True | md5(应用Id+q+salt+应用密钥) |
ext | text | 翻译结果音频格式,支持mp3 | false | mp3 |
q | text | 要识别的图片 | true | type为1时必填,图片的Base64编码 |
docType | text | 服务器响应类型,目前只支持json | false | json |
render | text | 是否需要服务端返回渲染的图片,0:否;1:是,默认是0 | false | 0 |
nullIsError | text | 如果ocr没有检测到文字,是否返回错误,false:否;true:是,默认是false | false | 注意是字符串 |
签名生成方法如下:
1、将请求参数中的 应用ID appKey , 图片的Base64编码 q ,UUID salt 和 应用密钥 按照 应用ID+q+salt+应用密钥的顺序拼接得到字符串 str 。
2、对字符串 str 做 md5,得到32位大写的 sign (参考Java生成MD5示例,可点击右侧的JAVA示例)。
输出结果
返回的结果是json格式,具体说明如下:
字段名 | 字段说明 |
---|---|
orientation | 图片所对应的方向 |
lanFrom | ocr所识别出来认为的图片中的语言 |
textAngle | 图片的倾斜角度 |
errorCode | 错误码 |
lanTo | 目标语言 |
resRegions | 图片翻译的具体内容 |
-boundingBox | 区域范围,四个值: 左上角的x值,左上角的y值,区域的的宽,区域的高 例如:134,0,1066,249 |
-linesCount | 行数(用于前端排版) |
-lineheight | 行高 |
-context | 该区域的原文 |
-linespace | 行间距 |
-tranContent | 翻译结果 |
2、详细开发
这个demo使用python3开发,包括maindow.py,transclass.py,pictranslate.py三个文件。maindow.py主要实现界面部分,使用python自带的tkinter库,来进行图片文件选择、选择结果存放路径。transclass.py实现了图片读取、处理等逻辑,最后通过pictranslate.py中的方法来调用图片翻译API。
1、界面部分
主要元素:
root=tk.Tk() root.title("netease youdao translation test") frm = tk.Frame(root) frm.grid(padx='50', pady='50') btn_get_file = tk.Button(frm, text='选择待翻译图片', command=get_files) btn_get_file.grid(row=0, column=0, ipadx='3', ipady='3', padx='10', pady='20') text1 = tk.Text(frm, width='40', height='10') text1.grid(row=0, column=1) btn_get_result_path=tk.Button(frm,text='选择翻译结果路径',command=set_result_path) btn_get_result_path.grid(row=1,column=0) text2=tk.Text(frm,width='40', height='2') text2.grid(row=1,column=1) btn_sure=tk.Button(frm,text="翻译",command=translate_files) btn_sure.grid(row=2,column=1) root.mainloop()
获取待翻译图片文件的方法(此处设置的仅支持.jpg文件):
def get_files(): files = filedialog.askopenfilenames(filetypes=[('text files', '.jpg')]) translate.file_paths=files if files: for file in files: text1.insert(tk.END, file + '\n') text1.update() else: print('你没有选择任何文件')
获取结果存储路径:
def set_result_path(): result_path=filedialog.askdirectory() translate.result_root_path=result_path text2.insert(tk.END,result_path)
翻译按钮,调用了translate_files,该文件中的translate_files()方法最终调用了translate类的translate_files()方法:
def translate_files(): if translate.file_paths: translate.translate_files() tk.messagebox.showinfo("提示","搞定") else : tk.messagebox.showinfo("提示","无文件")
2、批量图片处理
transclass.py实现了图片读取、处理等逻辑,Translate类定义如下:
class Translate(): def __init__(self,name,file_paths,result_root_path,trans_type): self.name=name self.file_paths=file_paths # 待翻译文件路径 self.result_root_path=result_root_path # 结果存放路径 self.trans_type=trans_type def translate_files(self): for file_path in self.file_paths: #对批量图片逐个处理 file_name=os.path.basename(file_path) print('==========='+file_path+'===========') trans_reult=self.translate_use_netease(file_path) #对单个图片调用接口 resul_file=open(self.result_root_path+'/result_'+file_name.split('.')[0]+'.txt','w').write(trans_reult) #返回结果写入 def translate_use_netease(self,file_content): #调用有道接口,并返回结果 result= connect(file_content) return result
3、有道api调用
pictranslate.py中封装了调用有道智云API的一些方法,其中最核心的是connect()方法,按照接口要求拼接了所需参数,发起请求并返回结果。
def connect(file_content,fromLan,toLan): f = open(file_content, 'rb') # 二进制方式打开图文件 q = base64.b64encode(f.read()).decode('utf-8') # 读取文件内容,转换为base64编码 f.close() data = {} # data['from'] = '源语言' # data['to'] = '目标语言' data['from'] = 'auto' data['to'] = 'auto' 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 response = do_request(data) result=json.loads(str(response.content, encoding="utf-8")) print(result) translateResults=result['resRegions'] print(translateResults) pictransresult="" for i in translateResults: pictransresult=pictransresult+i['tranContent']+"\n" return pictransresult
总结
又是一次愉快的开发体验,而且还是为数不多的求生成功体验 : P ,没想到借助开放平台的力量,图像识别,自然语言处理变得如此易如反掌,只要能正确发起请求,就能得到不错的翻译结果,剩下大把的时间用来和女朋友炫技,这感觉——爽!
项目地址:https://github.com/LemonQH/BatchPicTranslate
以上就是python 实现批量图片识别并翻译的详细内容,更多关于python 图片识别并翻译的资料请关注三水点靠木其它相关文章!
python 实现批量图片识别并翻译
- Author -
无毁的湖光-Al声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@