SiriBlog

siriyang的个人博客


  • 首页

  • 排行榜

  • 标签115

  • 分类37

  • 归档321

  • 关于

  • 搜索

基于Pythonista和百度API的图片文本识别翻译脚本

发表于 2020-10-13 更新于 2021-10-29 分类于 计算机 , 技术 , Python 阅读次数: Valine:
本文字数: 6.9k 阅读时长 ≈ 6 分钟

前言

  在之前写的基于Pythonista和百度API的高精度文本识别脚本的基础上添加英文翻译功能,以方便在iPad上看一些英文文章和论文,省去了切换app的麻烦。

正文

  在基于Pythonista和百度API的高精度文本识别脚本的基础上只需要稍加修改,在图片OCR成文本以后再调用翻译API接口就行了。脚本使用方法和之前相同,可参考上一篇文章的配置教程。这里主要介绍翻译API的获取方法和源码。

获取百度翻译API

  使用百度账号登录百度翻译API的首页,注册成为开发者:


  个人使用的话这里选择标准版就够了,高级版的话需要进行一个身份认证。



  然后选择开通你要是用的服务,通用翻译API就够用了,虽然下面有拍照翻译SDK可以直接将图片翻译成目标语言,但是默认是安卓SDK的形式,想要改成web通用API的话需要提交申请。



  最后为你的应用取一个名字就完成注册了。



  登录以后进入控制台页面就可以查看当前的数据用量,不过标准版完全免费敞开了用,高级版每月200万字符的免费额度基本上够用了。在上方可以查看API的使用文档,下载各种语言的示例代码,下方可以直接查看API的访问密钥。


API官方示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#百度通用翻译API,不包含词典、tts语音合成等资源,如有相关需求请联系translate_api@baidu.com
# coding=utf-8

import http.client
import hashlib
import urllib
import random
import json

appid = '' # 填写你的appid
secretKey = '' # 填写你的密钥

httpClient = None
myurl = '/api/trans/vip/translate'

fromLang = 'auto' #原文语种
toLang = 'zh' #译文语种
salt = random.randint(32768, 65536)
q= 'I like eat apple'
sign = appid + q + str(salt) + secretKey
sign = hashlib.md5(sign.encode()).hexdigest()
myurl = myurl + '?appid=' + appid + '&q=' + urllib.parse.quote(q) + '&from=' + fromLang + '&to=' + toLang + '&salt=' + str(
salt) + '&sign=' + sign

try:
httpClient = http.client.HTTPConnection('api.fanyi.baidu.com')
httpClient.request('GET', myurl)

# response是HTTPResponse对象
response = httpClient.getresponse()
result_all = response.read().decode("utf-8")
result = json.loads(result_all)

print (result)

except Exception as e:
print (e)
finally:
if httpClient:
httpClient.close()

  在尝试了好几家的API接口以后最后选择的百度API,文档相对完善,注册操作简单。如果想要获得更好的使用体验也可以尝试去获取有道、谷歌等翻译API。就目前的使用情况来说百度的翻译效果还算可以了。


效果展示


代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
# -*- coding:utf-8 -*-
"""
@author: SiriYang
@file: ImageToTextAndTrans.py
@createTime: 2020-10-03 11:34:54
@updateTime: 2020-10-13 14:48:45
@codeLines: 160
"""


import requests
import base64
import io
from PIL import Image
import http.client
import hashlib
import urllib
import random
import json

import ui
import console
import appex
import clipboard

'''
通用文字识别(高精度版)
'''
# API_key 为官网获取的AK, Secret_Key 为官网获取的SK
API_key="[换成自己的key]"
Secret_Key="[换成自己的key]"

#你所选用的API识别接口
API_URL="https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic"

'''
百度翻译API
'''
appid = '[换成自己的id]' # 填写你的appid
secretKey = '[换成自己的key]' # 填写你的密钥

def transText(text):

httpClient = None
myurl = '/api/trans/vip/translate'

fromLang = 'auto' #原文语种
toLang = 'zh' #译文语种
salt = random.randint(32768, 65536)
q= text
sign = appid + q + str(salt) + secretKey
sign = hashlib.md5(sign.encode()).hexdigest()
myurl = myurl + '?appid=' + appid + '&q=' + urllib.parse.quote(q) + '&from=' + fromLang + '&to=' + toLang + '&salt=' + str(
salt) + '&sign=' + sign

try:
httpClient = http.client.HTTPConnection('api.fanyi.baidu.com')
httpClient.request('GET', myurl)

# response是HTTPResponse对象
response = httpClient.getresponse()
result_all = response.read().decode("utf-8")
result = json.loads(result_all)

except Exception as e:
print (e)
finally:
if httpClient:
httpClient.close()

# print (result)
if('error_code' in result):
return '翻译错误:'+result['error_msg']

result_txt=''
for i in result['trans_result']:
result_txt+=i['dst']

return result_txt

def imgToText(image):

global API_key
global Secret_Key
global API_URL

text_result=""
words_result_num=0

try:
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={AK}&client_secret={SK}'.format(AK=API_key,SK=Secret_Key)
access_token = ""
response = requests.get(host)
if response:
access_token = response.json()['access_token']

# 二进制方式打开图片文件
b = io.BytesIO()
image.save(b, 'JPEG')
img_data = base64.b64encode(b.getvalue())
b.close()

params = {"image":img_data}
request_url = API_URL + "?access_token=" + access_token
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)

if response:
json_data=response.json()
words_result_num=int(json_data['words_result_num'])
for i in json_data['words_result']:
text_result+=i['words']
except Exception:
text_result="识别失败!"
words_result_num=-1

return text_result,words_result_num

def pil2ui(imgIn):
b = io.BytesIO()
imgIn.save(b, 'JPEG')
imgOut = ui.Image.from_data(b.getvalue())
b.close()
return imgOut

class MainWindow(ui.View):

def __init__(self,img):
self.img=img
self.org_txt="正在识别,请稍等..."
self.trans_txt=""
self.rows=0
self.recogState=True

self.name="图片文字识别翻译"
self.frame=(0,0,600,500)
self.background_color='white'

self.imgView=ui.ImageView()
self.org_textView=ui.TextView()
self.trans_textView=ui.TextView()
self.switchBtn=ui.SegmentedControl()

self.add_subview(self.imgView)
self.add_subview(self.org_textView)
self.add_subview(self.trans_textView)
self.add_subview(self.switchBtn)

self.loadUI()

self.present('sheet')

self.recognize()
self.translate()

def loadUI(self):
self.imgView.content_mode=ui.CONTENT_SCALE_ASPECT_FIT
self.imgView.image=pil2ui(self.img)

self.org_textView.text=self.org_txt
self.org_textView.font=("<system>",16)

self.trans_textView.text=self.trans_txt
self.trans_textView.font=("<system>",16)

self.switchBtn.segments=['图片','文本']
self.switchBtn.action=self.switch_Act
self.switchBtn.selected_index=1
self.imgView.hidden=True
self.org_textView.hidden=False
self.trans_textView.hidden=False

def layout(self):
self.imgView.frame=(0,0,self.width,self.height-50)

self.org_textView.frame=(0,0,self.width,(self.height-50)//2)
self.trans_textView.frame=(0,(self.height-50)//2,self.width,(self.height-50)//2)

self.switchBtn.frame=(0,self.height-50,self.width,50)

def recognize(self):

self.org_txt,self.rows=imgToText(self.img)
if self.rows>=0:
info="识别成功,识别结果共{row}行,{len}字,已拷贝到粘贴板!\n\n".format(row=self.rows,len=len(self.org_txt.replace(" ","").replace("\n","")))
self.org_textView.text=info+self.org_txt
self.trans_textView.text="正在翻译,请稍等..."
# clipboard.set(self.org_txt)
else:
self.recogState=False
self.org_textView.text=self.org_txt
console.alert("错误",self.org_txt,"确定",hide_cancel_button=True)

def translate(self):
if self.recogState:
self.trans_txt=transText(self.org_txt)
self.trans_textView.text=self.trans_txt
clipboard.set(self.trans_txt)
else:
self.trans_textView.text=""

def switch_Act(self,sender):
if(self.switchBtn.selected_index!=1):
self.imgView.hidden=False
self.org_textView.hidden=True
self.trans_textView.hidden=True
else:
self.imgView.hidden=True
self.org_textView.hidden=False
self.trans_textView.hidden=False

def main():
if not appex.is_running_extension():
print('这个脚本必须在分享扩展面板使用!')
return

orgImg = appex.get_image()
if not orgImg:
orgImg = clipboard.get_image()

if not orgImg:
console.alert("错误","没有找到图片!","确定",hide_cancel_button=True)
return

v=MainWindow(orgImg)

if __name__ == "__main__":
main()
-------- 本文结束 感谢阅读 --------
相关文章
  • Transista for iPadOS
  • 基于Pythonista和百度API的高精度文本识别脚本
  • AppWishList for iOS
  • 自己动手写一个相机参数水印生成器
  • Pythonista中文文档:scene
觉得文章写的不错的话,请我喝瓶怡宝吧!😀
SiriYang 微信支付

微信支付

SiriYang 支付宝

支付宝

  • 本文标题: 基于Pythonista和百度API的图片文本识别翻译脚本
  • 本文作者: SiriYang
  • 创建时间: 2020年10月13日 - 14时10分
  • 修改时间: 2021年10月29日 - 18时10分
  • 本文链接: https://blog.siriyang.cn/posts/20201013145557id.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
iOS Python Pythonista 项目
NLP:阅读理解综述
Ubuntu下安装配置Anaconda和JupyterNoteBook环境
SiriYang

SiriYang

努力搬砖攒钱买镜头的摄影迷
321 日志
33 分类
88 标签
RSS
GitHub E-Mail
Creative Commons
Links
  • 友情链接
  • 作品商铺

蜀ICP备19008337号 © 2019 – 2025 SiriYang | 1.7m | 25:48
0%