最近小编遇到一个生存问题,女朋友让我给她翻译英文化妆品标签。美其名曰:"程序猿每天英语开发,英文一定很好吧,来帮我翻译翻译化妆品成分",”来,帮我看看这个面膜建议敷几分钟“。。。。看来斥巨资买化妆品不算完,还需要会各种英文介绍。
默默收起大学考的一摞429分的四级证书,我打开了IDE。。。我打算开发一个能批量翻译的图片的demo,把家里的各种化妆品都翻译好。机智如我,是不会自己从训练模型做起的,打开有道智云的友好的AI接口页面 ,果然有图片翻译服务,体验了一下可是真不错,于是果断使用。

效果展示

Demo在这里,一起来看看效果吧:
识别过程如下:
演示
逐个看看效果哈!make up for ever 虽然没翻译成玫珂菲,哈哈哈但是关键词长期保湿、固定喷雾都翻译出来了~~棒
result-定妆
这个更是不明觉厉,韩文、英文混合都能翻译~~~
result-可莱斯
樱花水的表现也不错哦~
result-樱花水
再乱入一个开起来更像包装盒的图片识别,效果不错,没受图片上文字倾斜等影响 :
result2

调用API的准备工作——生成调用所需要的应用id和密钥

根据有道智云的接口约定,需要先在有道智云的个人页面上生成调用所需要的应用id和密钥,以便作为你的调用标识以及收费参考。。
具体步骤是:在有道智云的个人页面上创建实例、创建应用、绑定应用和实例,获取调用接口用到的应用的id和密钥。具体个人注册的过程和应用创建过程详见文章分享一次批量文件翻译的开发过程
实例

开发过程介绍

1、api接口介绍

先介绍下该工程的核心部分,有道智云图片翻译服务的调用接口
API HTTPS地址:https://openapi.youdao.com/ocrtransapi
接口调用方式:POST
请求格式:表单
相应格式:JSON
接口调用参数
调用API需要向接口发送以下字段来访问服务。
字段名类型含义必填备注
typetext文件上传类型True目前支持Base64,请置该字段值为1
fromtext源语言True参考下方的 支持语言 (可设置为auto)
totext目标语言True参考下方的 支持语言 (可设置为auto)
appKeytext应用IDTrue可在 应用管理 查看
salttextUUIDTrue1995882C5064805BC30A39829B779D7B
signtext签名Truemd5(应用Id+q+salt+应用密钥)
exttext翻译结果音频格式,支持mp3falsemp3
qtext要识别的图片truetype为1时必填,图片的Base64编码
docTypetext服务器响应类型,目前只支持jsonfalsejson
rendertext是否需要服务端返回渲染的图片,0:否;1:是,默认是0false0
nullIsErrortext如果ocr没有检测到文字,是否返回错误,false:否;true:是,默认是falsefalse注意是字符串
签名生成方法如下:

1、将请求参数中的 
应用ID appKey , 图片的Base64编码 q ,UUID salt 和 应用密钥 按照 应用ID+q+salt+应用密钥的顺序拼接得到字符串 str
 。

2、对字符串 
str 做 md5,得到32位大写的 sign (参考Java生成MD5示例,可点击右侧的JAVA示例)。
输出结果
返回的结果是json格式,具体说明如下:
字段名字段说明
orientation图片所对应的方向
lanFromocr所识别出来认为的图片中的语言
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文件):
defget_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(
'你没有选择任何文件'
)



获取结果存储路径:
defset_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()方法:
deftranslate_files():
if
 translate.file_paths:

        translate.translate_files()

        tk.messagebox.showinfo(
"提示"
,
"搞定"
)

else
 :

        tk.messagebox.showinfo(
"提示"
,
"无文件"
)


2、批量图片处理
transclass.py实现了图片读取、处理等逻辑,Translate类定义如下:
classTranslate():
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



deftranslate_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)     
#返回结果写入


deftranslate_use_netease(self,file_content):#调用有道接口,并返回结果
        result= connect(file_content)

return
 result

3、有道api调用
pictranslate.py中封装了调用有道智云API的一些方法,其中最核心的是connect()方法,按照接口要求拼接了所需参数,发起请求并返回结果。
defconnect(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 ,没想到借助开放平台的力量,图像识别,自然语言处理变得如此易如反掌,只要能正确发起请求,就能得到不错的翻译结果,剩下大把的时间用来和女朋友炫技,这感觉——爽!
文章转载:SegmentFault
(版权归原作者所有,侵删)
点击下方“阅读原文”查看更多
继续阅读
阅读原文