守听 发表于 2024-11-4 19:56:33

翻转外语——自动化脚本100%正确率-基于paddleocr和opencv以及pyautogui自

自动翻转卡包和拼写均已实现,剩下的点听力,阅读,语法,较为简单(如需要请自行增补代码)
ps: 使用雷电模拟器
这里提供的代码重要是思绪,直接粘贴复制是用不了的(因为缺少相关情况和python的模块包)

https://i-blog.csdnimg.cn/blog_migrate/a8bbaecb9e234ee9d2bf5a75f9bd43b5.png
https://i-blog.csdnimg.cn/blog_migrate/27c1e0b9917fef0bec22bf19fe970ab7.png


实现自动拼写:

import pyautogui,time,logging,re
from paddleocr import PaddleOCR

pyautogui.PAUSE = 0.1
time.sleep(1)
img_path="pinxie.png"
##定位键盘,这个x,y很重要,定位全局。(尽量别修改)
x,y=pyautogui.locateCenterOnScreen(img_path,region=(0,0,500,900),confidence=0.8)##左半屏
##可以不带region参数 x,y=pyautogui.locateCenterOnScreen(img_path,confidence=0.8)##全屏寻找
print(x,y)                                             

keyboard_layout = {
    'q': (x-365, y-196), 'w': (x-320, y-196), 'e': (x-275, y-196), 'r': (x-230, y-196), 't': (x-185, y-196),
    'y': (x-140, y-196), 'u': (x-95, y-196), 'i': (x-50, y-196), 'o': (x-5, y-196), 'p': (x+40, y-196),
    'a': (x-340, y-136), 's': (x-295, y-136), 'd': (x-250, y-136), 'f': (x-205, y-136), 'g': (x-160, y-136),
    'h': (x-115, y-136), 'j': (x-70, y-136), 'k': (x-25, y-136), 'l': (x+20, y-136),
    'z': (x-300, y-76), 'x': (x-255, y-76), 'c': (x-210, y-76), 'v': (x-165, y-76), 'b': (x-120, y-76),
    'n': (x-75, y-76), 'm': (x-30, y-76)
}
#这里的坐标不要修改,我调好的参数。

##这里是主体部分

while True:##一般这里就是二十五个循环(25个单词拼写)
    def type_text(text):
      for char in text:
            if char in keyboard_layout:
                x, y = keyboard_layout
                pyautogui.click(x, y)


    # 模拟第一次输入
    type_text("qwertyuipoiuy")
    pyautogui.click(x, y)

    time.sleep(0.5)
    ##截取单词
    pyautogui.screenshot("danci.png", (int(x - 360), int(y - 536), 380, 250))
    danci = []

    ##识别单词
    logging.disable(logging.DEBUG)
    ocr = PaddleOCR(use_angle_cls=True, lang="ch")
    result = ocr.ocr(f"danci.png", cls=True)
    for idx in range(len(result)):
      res = result
      for line in res:
            danci.append(line)
            # 将列表转换为一个字符串
    string = ''.join(danci)
    # 定义正则表达式模式,匹配 "提示" 后面的单词
    pattern = re.compile(r'提示(\w+)')
    # 使用正则表达式进行匹配
    match = pattern.search(string)
    result = match.group(1)   #         <---这个就是识别出来的正确答案
    print(result)               #打印出来方便观察的(可以删)
    ##以上为识别单词(识别结束)

    # 现在可以点击删除键清空单词
    pyautogui.click(x + 20, y - 76)
    # 现在开始输入单词
    type_text(result)
    pyautogui.click(x, y)

    time.sleep(1)               #延迟函数(很重要)可以根据你的电脑调整时间,但是不要删除(给截屏反应时间的),因为那个页面跳转会有0.3秒的时间响应 思绪都写在注释里了
自动翻转卡包:

import logging,re,Levenshtein
import pyautogui,time
from paddleocr import PaddleOCR, draw_ocr
li=[]##识别表
li1=[]##对比表1
li22=[]##对比表22
def ocrbaocun():                     ##识别保存后正则化   为对比表1
    li=[]
    li1=[]##初始化列表为空,防止混淆
    pp=0
    while True:
      if (pp==5):
            break
      time.sleep(1.5)
      img_path = "shibie.png"
      x, y = pyautogui.locateCenterOnScreen(img_path, region=(0, 0, 400, 800), confidence=0.7)
      pyautogui.click(x, y + 200)
      time.sleep(1.5)
      pyautogui.screenshot(f"shot{pp+1}.png", (int(x - 235), int(y - 160), 350, 370))

      ##开始识别翻译的截屏
      logging.disable(logging.DEBUG)
      ocr = PaddleOCR(use_angle_cls=True, lang="ch")

      result = ocr.ocr(f"shot{pp+1}.png", cls=True)
      for idx in range(len(result)):
            res = result
            str1 = ""
            for line in res:
                str1 += line
      pp += 1

      # 按住鼠标左键
      pyautogui.mouseDown(button='left')
      # 向上滑动
      pyautogui.moveRel(0, -100, duration=0.2)# 这里的100可以调整,表示滑动的距离
      # 释放鼠标左键
      pyautogui.mouseUp(button='left')
      li.append(str1)
      print(li)
    #正则表达式
    pattern = re.compile(r'(?<!)\b(?!vt|n|adj|adv)+\b|[\u4e00-\u9fa5]+')
    # 遍历列表中的每个元素
    for text in li:
      # 使用findall方法匹配文本中的单词
      matches = pattern.findall(text)
      # 输出匹配到的单词
      li1.append(matches)
    time.sleep(2)
    print(li1)
    for i in range(5):
      ocrchoice(li1)
def ocrchoice(li1):
    time.sleep(1.5)
    li2=[]
    li22=[]
    elect_path = "choice.png"
    x, y = pyautogui.locateCenterOnScreen(elect_path, confidence=0.7, region=(0, 0, 400, 800))
    pyautogui.screenshot("choicejietu.png", (int(x - 200), int(y + 100), 390, 270))

    logging.disable(logging.DEBUG)
    ocr = PaddleOCR(use_angle_cls=True, lang="ch")
    result = ocr.ocr(f"choicejietu.png", cls=True)
    for idx in range(len(result)):
      res = result
      for line in res:
            li2.append(line)
    pattern = re.compile(r'[\u4e00-\u9fa5]+')
    for text in li2:
      matches = pattern.findall(text)
      li22.append(matches)
    print(li22)

    ##从这里开始选择
    decide(x,y,li1,li22)


def decide(x,y,li1,li22):
    flat_list1 =

    # 设置相似度阈值
    immediate_threshold = 0.7

    def are_similar(str1, str2):
      return Levenshtein.ratio(str1, str2)

    # 找到第二个双层列表中包含相似元素的子列表的相似度最大索引
    max_similarity = 0
    matching_index = -1
    immediate_found=False
    for idx, sublist in enumerate(li22):
      for item in sublist:
            for flat_item in flat_list1:
                similarity = are_similar(item, flat_item)
                print(f"Comparing '{item}' with '{flat_item}', similarity: {similarity}")
                if similarity >= immediate_threshold:
                  print(f"Found immediate match with similarity {similarity} at index {idx}")
                  matching_index=idx
                  max_similarity=similarity
                  immediate_found=True
                  break
                if similarity > max_similarity:
                  max_similarity = similarity
                  matching_index = idx
            if immediate_found:
                break
      if immediate_found:
            break
    print(f"Matching index: {matching_index}, max similarity: {max_similarity}")
    #以上有两种匹配方案,如果有相似度>=0.8的子列表,就直接结束比对(一般都是1.0的相似度)。
    #如果没有>=0.8的,就比对所有字符串后取最大相似度所在的子列表索引。

    if(matching_index==0):
      pyautogui.click(x + 150, y + 130)##A
    if(matching_index==1):
      pyautogui.click(x + 150, y + 200)##B
    if(matching_index==2):
      pyautogui.click(x + 150, y + 270)##C
    if(matching_index==3):
      pyautogui.click(x + 150, y + 340)##D
    time.sleep(0.5)
    # 按住鼠标左键
    pyautogui.mouseDown(button='left')
    # 向上滑动
    pyautogui.moveRel(0, -100, duration=0.2)# 这里的100可以调整,表示滑动的距离
    # 释放鼠标左键
    pyautogui.mouseUp(button='left')
    time.sleep(1.5)





while True:
    ocrbaocun()
    time.sleep(1) 简单解说下卡包的思绪:

https://i-blog.csdnimg.cn/blog_migrate/8c4140299b6ea23a2c245977bbbed21d.png
列表里的1,2,3,4,5是分别五个单词的翻译及其单词(还没有正则化)五个字符串在一个列表中往后累加的,以是后面也是一样的形式

白色框:是正则化(re)后的每个单词及其翻译
绿色框(每个单词都是这样的):是第一个的单词的选择(A,B,C,D),显而易见也是已经经过 正则化。
https://i-blog.csdnimg.cn/blog_migrate/b16c2729017faaaf2ea4e348ee0027d5.png


选择思绪:

https://i-blog.csdnimg.cn/blog_migrate/921484fb3b0ed57a5822af4ef6c05853.png
判断相似度:

以上有两种匹配方案,如果有相似度>=0.8的子列表,就直接竣事比对(一般都是1.0的相似度)如果没有>=0.8的,就比对所有字符串后取最大相似度所在的子列表索引。
Matching index就是选项,0,1,2,3分别对应A,B,C,D.

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 翻转外语——自动化脚本100%正确率-基于paddleocr和opencv以及pyautogui自