Skip to content

Commit

Permalink
fix: 完善命令行翻译识别
Browse files Browse the repository at this point in the history
  • Loading branch information
yuhldr committed Nov 17, 2024
1 parent ec558f7 commit bad5308
Show file tree
Hide file tree
Showing 5 changed files with 108 additions and 55 deletions.
28 changes: 14 additions & 14 deletions lfy.in
Original file line number Diff line number Diff line change
Expand Up @@ -86,26 +86,26 @@ def main():

parser = argparse.ArgumentParser(description="translate")

parser.add_argument('-l', type=str, help='待翻译文字或待OCR文件')
parser.add_argument('-s', type=str, help='所用服务', default="")
parser.add_argument('-t', type=int, help='翻译后面的文字')
parser.add_argument('-o', type=str, help='识别图片')
parser.add_argument('-t', type=str, help='翻译,后面接文字')
parser.add_argument('-o', type=str, help='识别图片,后面接文件路径')
parser.add_argument('-c', action='store_true', help='自动翻译剪贴板,暂时无效')

parser.add_argument('-s', type=str, help='使用什么服务引擎,若未输入-s,将根据 -t 或 -o 提供帮助', default="", nargs='?')
parser.add_argument('-l', type=int, help='待翻译/识别的语言,若未输入-l,将根据 -s 的输入自动提供对应帮助', default=-1, nargs='?')

args = parser.parse_args()

if args.c:
from lfy.code import req_clip
print(req_clip(args.s, args.l))
return
if args.t:
if len(args.s) > 0:
from lfy.code import req_text
print(req_text(args.l, args.s, args.t))
return
print(get_help_server(False))
from lfy.code import req_text
print(req_text(args.t, args.s, args.l))
return
if args.o:
if len(args.s) > 0:
from lfy.code import ocr_img
print(req_ocr(args.l, args.s, args.o))
return
print(get_help_server(True))
from lfy.code import req_ocr
print(req_ocr(args.o, args.s, args.l))
return


Expand Down
17 changes: 17 additions & 0 deletions lfy/api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -192,3 +192,20 @@ def lang_n2j(i: int, n: int):
if lang.n == n:
return j
return 0


def lang_n2key(server: Server, n: int):
"""不同server的langs真正唯一的是n,不同server的key不一样
Args:
server (Server): _description_
n (int): _description_
Returns:
Lang: 语言类
"""

for lang in server.langs:
if lang.n == n:
return lang
return None
3 changes: 0 additions & 3 deletions lfy/api/constant.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,3 @@
NO_TRANSLATED_TXTS = [
"\"server-sk-",
]

CODE_SERVER_N_HELP = -2
CODE_SERVER_N_DEFAULT = -3
16 changes: 13 additions & 3 deletions lfy/api/server/ocr/baidu.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,19 @@ class BaiduServer(Server):
def __init__(self):

# Development documentation
# https://fanyi-api.baidu.com/doc/21

super().__init__("baidu", _("baidu"), {})
# https://ai.baidu.com/ai-doc/OCR/zk3h7xz52
lang_key_ns = {
# 中英混合,默认
"CHN_ENG": 1,
"ENG": 3,
"JAP": 4,
"KOR": 5,
"GER": 6,
"FRE": 7,
"ITA": 8
}

super().__init__("baidu", _("baidu"), lang_key_ns)
self.can_ocr = True

def get_api_key_s_ocr(self):
Expand Down
99 changes: 64 additions & 35 deletions lfy/code.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,37 +6,63 @@
from gi.repository import Gdk

from lfy.api import (create_server_o, create_server_t, get_servers_o,
get_servers_t, server_key2i)
from lfy.api.constant import CODE_SERVER_N_DEFAULT, CODE_SERVER_N_HELP
get_servers_t, lang_n2key)
from lfy.api.server import Server
from lfy.api.utils import is_text
from lfy.api.utils.debug import get_logger
from lfy.settings import Settings


def req_clip(key_server, key_lang_n):
"""读取剪贴板,此方法暂时无效
Args:
key_server (str): _description_
key_lang (str): _description_
"""
def on_active_copy(cb2, res):
return req_text(cb2.read_text_finish(res), key_server, key_lang_n)

def save_img(cb2, res):
texture = cb2.read_texture_finish(res)
pixbuf = Gdk.pixbuf_get_from_texture(texture)

path = "/tmp/lfy.png"
pixbuf.savev(path, "png", (), ())
return req_ocr(path, key_server, key_lang_n)

cb = Gdk.Display().get_default().get_clipboard()
cf = cb.get_formats()
if is_text(cf):
cb.read_text_async(None, on_active_copy)
elif cf.contain_mime_type('image/png'):
cb.read_texture_async(None, save_img)
return "no text or image"

def get_help_lang(server: Server):
"""某个服务的lang key
Args:
server (Server): _description_
j (int, optional): _description_. Defaults to -1.
Returns:
_type_: _description_
"""
# 每个翻译对应的key
return {lang.get_name(): j for j, lang in enumerate(server.langs)}
print('please add "-l number", number like:')
return {lang.get_name(): lang.n for lang in server.langs}


def get_help_server(is_ocr=False):
"""某个服务的lang key
Args:
server (Server): _description_
j (int, optional): _description_. Defaults to -1.
is_ocr (bool): _description_
Returns:
_type_: _description_
"""
print('please add "-s server", server like:')
if is_ocr:
return {s.name: s.key for s in get_servers_o()}
return {s.name: s.key for s in get_servers_t()}
Expand All @@ -55,26 +81,32 @@ def set_vpn():
os.environ['https_proxy'] = proxy_address


def req_text(s=None, key_server=None, lang_j=-1):
def req_text(s, key_server="", key_lang_n=-1):
"""子线程翻译
Args:
s (str): _description_
server (Server): _description_
key_server (str): _description_
key_lang_n (int): _description_
"""
print(s)
set_vpn()

try:
if key_server is None:
if not key_server:
return get_help_server(False)
server = create_server_t(key_server)
if lang_j < 0:
server: Server = create_server_t(key_server)

lang_selected = lang_n2key(server, key_lang_n)

if not lang_selected:
return get_help_lang(server)
print("translate", server.name, lang_selected.get_name())

if not s:
return _("no text")
print(s)
set_vpn()

key_lang = server.get_lang(lang_j).key
print("tra", server.name, key_lang)
_ok, text = server.translate_text(s, key_lang)
_ok, text = server.translate_text(s, lang_selected.key)
return text

except Exception as e: # pylint: disable=W0718
Expand All @@ -84,38 +116,35 @@ def req_text(s=None, key_server=None, lang_j=-1):
return f"{error_msg}{server.name}\n\n{error_msg2}"


def req_ocr(s=None, key_server=None, ocr_key=None):
def req_ocr(s=None, key_server=None, key_lang_n=-1):
"""子线程翻译
Args:
s (str): _description_
server (Server): _description_
key_server (str): _description_
key_lang_n (int): _description_
"""
set_vpn()

try:
if key_server is None:
if not key_server:
return get_help_server(True)

server = create_server_o(key_server)
print("ocr", server.name, ocr_key)
_ok, text = server.ocr_image(s, ocr_key)

lang_selected = lang_n2key(server, key_lang_n)

if not lang_selected:
return get_help_lang(server)

if not s or not os.path.exists(s):
return _("the file does not exist") + "\n" + s
print("ocr", server.name, lang_selected.get_name())
set_vpn()

_ok, text = server.ocr_image(s, lang_selected.key)
return text

except Exception as e: # pylint: disable=W0718
get_logger().error(e)
error_msg = _("something error:")
error_msg2 = f"{str(e)}\n\n{traceback.format_exc()}"
return f"{error_msg}{server.name}\n\n{error_msg2}"


def req_clip():
"""获取截剪贴板
"""
print("req_clip")

def on_active_copy(cb2, res):
req_text(cb2.read_text_finish(res))

cb = Gdk.Display().get_default().get_clipboard()
cb.read_text_async(None, on_active_copy)

0 comments on commit bad5308

Please sign in to comment.