文章目录

  • 前言
  • 思路
  • 效果如图
  • 实现
  • 第二种方案
  • 第一种方案
  • 第一种方案
  • 中英文翻译
  • 想白嫖中英文翻译?
  • 如何将ocr识别到的没有空格文本正确分割?
  • python截屏


前言

看一些电影,发现只是标注了字幕而没有中文翻译,当然也没有字幕文件,而仅仅是视频上有外文字幕而已
那么能否在看电影的时候让这些字幕自动显示为翻译的中文呢?
当然可以的

思路

总体的方法如下:
1,第一步,将显示字幕的区域截取下来,(如果你看电影会发现字幕总是显示在下面的一个矩形区域里),然后当你看电影的时候,自动识别到矩形框范围内是否有字幕,如果有就自动截取下来,然后将这张图片传到下一步
2,第二步,使用ocr识别,识别出外文字幕,得到外文文本
3,第三步,使用网络翻译接口,将外文文本翻译成中文,得到中文文本后将文本显示在一个半透明的矩形窗口出来在你想要的位置

效果如图

python 字幕文件校对 python自动生成字幕代码_python


我用一个文本文档里的英文,模拟了字幕出现的位置,然后我将中文翻译显示窗口放到了上面,这样当我看电影的时候,下面出现英文,上面就自动显示中文字幕了,而不需要必须是中文翻译过的电影

实现

抛开实现思路不谈,难点其实就在于ocr对图片的识别上,如果能够对文本精准的复现,翻译效果当然好,但凡错一个字幕,就可能错很多,中文的优越性就出来了,中文自带纠错能力,而英文一个空格,一个字母错了,翻译软件当即就傻了,翻译不出来
这里重复一下思路:
先实现第一步字幕位置截取,非常便捷的是python提供了一个工具包,只需要设定截取的开始坐标和结束坐标就能自动截取并保存图片
第二步ocr识别比较麻烦,因为ocr识别效果比较慢,而且效果通常不理想,比如有时识别到的文本没有空格,这会给翻译带来巨大的麻烦,中文没有空格无所谓,英文没有空格那真是灾难,幸运的是ocr识别的效果现在有神经网络的加持,识别效果已经有了很大提升,只是比较吃电脑配置,配置环境是最令人麻烦的了
第三步,将识别到的文本翻译成中文比较简单,比如使用有道词典的接口就可以了
最后就是将翻译到的中文文本展示在一个窗口上,这一步很简单

当然这里有两份实现方案,
第一种就是我上面说的,先截图,然后ocr识别到文本,然后文本翻译成中文
第二种方案,则是先截图,然后将截图传递到有道的截图翻译接口,直接返回中文
这里先说第二种方案,因为有道的截图翻译太好用了,只需要截图,然后调接口,当然有次数限制

第二种方案

有道截图翻译接口

# -*- coding: utf-8 -*-
import sys
import uuid
import requests
import base64
import hashlib
import json
from imp import reload
import tkinter

from PIL import ImageGrab
from PIL import Image
reload(sys)

YOUDAO_URL = 'https://openapi.youdao.com/ocrtransapi'
APP_KEY = '你申请的有道截图翻译key'
APP_SECRET = '你申请的有道截图翻译secret'
top = tkinter.Tk()
top.title("字幕")
#设定显示字幕的窗口大小,透明度,显示的字体
top.geometry('1200x50+100+0')
top.attributes("-alpha",0.5)
TText= tkinter.Text(top, font=('Arial', 30),  width=50, height=10)
TText.grid(row=1, column=0, rowspan=10, columnspan=10)


def truncate(q):
    if q is None:
        return None
    size = len(q)
    return q if size <= 20 else q[0:10] + str(size) + q[size - 10:size]


def encrypt(signStr):
    hash_algorithm = hashlib.md5()
    hash_algorithm.update(signStr.encode('utf-8'))
    return hash_algorithm.hexdigest()


def do_request(data):
    headers = {'Content-Type': 'application/x-www-form-urlencoded'}
    return requests.post(YOUDAO_URL, data=data, headers=headers)


def connect(src):
    TText.delete(1.0,'end')
    f = open(src, 'rb')  # 二进制方式打开图文件
    q = base64.b64encode(f.read()).decode('utf-8')  # 读取文件内容,转换为base64编码
    f.close()

    data = {}
    data['from'] = 'auto'
    data['to'] = 'zh-CHS'
    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)
    print(response.content)
    print(json.loads(response.content))
    a=json.loads(response.content)['resRegions']
    myresult=""
    for i in a:
         myresult=myresult+ i['tranContent']
    TText.insert(1.0, myresult)
def do():
    #截图放置的路径
    src = r"C:\\Users\\Administrator.DESKTOP-KMH7HN6\\Downloads\\imge_temp\\1.jpg"
    #截图坐标的起始位置
    im = ImageGrab.grab((204, 603, 1270, 759))
    im.save(src, 'JPEG')
    connect(src)
btton=tkinter.Button(top, text="识别", width=10,command=do)  # 调用内部方法  加()为直接调用
btton.grid(row=1, column=900)
# do()
top.mainloop()

第一种方案

这里的ocr识别,使用的是easyocr工具包
实际效果不理想,我仅仅是测试了一下它对文本的识别效果,非常失望
背景如果是纯色还行,稍微复杂的背景,识别特别垃圾
纯色背景比如pdf文本识别还是可行的,配置环境看

https://zhuanlan.zhihu.com/p/342686109
# 导入easyocr
import easyocr
# 创建reader对象
reader = easyocr.Reader(['ch_sim','en'])
# 读取图像
result = reader.readtext("C:\\Users\\Administrator.DESKTOP-KMH7HN6\\Downloads\\imge_temp\\1.png")
# 结果
print(result)

第一种方案

我尝试了其他ocr识别工具包pytesseract
传说有神经网络加持,效果非常好,我配置了半天环境,识别出来的效果非常失望
背景如果是纯色还行,稍微复杂的背景,识别特别垃圾
不过,如果你想识别pdf的文本,那这个就对了
具体的配置链接看

https://zeroingpython.top/python%e7%9f%a5%e8%af%86%e5%88%86%e4%ba%ab/%e4%b8%80%e4%b8%aa-python-%e5%8c%85-pytesseract-%ef%bc%8c%e5%87%a0%e8%a1%8c%e4%bb%a3%e7%a0%81%e5%8f%af%e5%ae%9e%e7%8e%b0-ocr-%e6%96%87%e6%9c%ac%e8%af%86%e5%88%ab%e6%8a%80%e6%9c%af%ef%bc%81/90/
import pytesseract
import cv2
img_path = "C:\\Users\\Administrator.DESKTOP-KMH7HN6\\Downloads\\imge_temp\\1.png"
# 下面一行代码很重要
tessdata_dir_config = '--tessdata-dir "C://my_software//python_ocr//tessdata"'
im = cv2.imread(img_path)
img = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
text = pytesseract.image_to_string(img, lang='eng', config=tessdata_dir_config, )
print(text)

测试下来,还是有道香