python基于ocr的视频字幕提取

1 篇文章 0 订阅
1 篇文章 0 订阅

导读


        在无数次的996加班后的下午,忽然听见了QQ的震动,我发现有人居然给我发消息~原来是我的妹妹给我发来了消息,内容如下:

        她现在正兼职帮学校帮老师配教学视频的字幕,他们配上去了,但是老师又有一个奇怪的想法。哎~  能不能再从视频中读取字幕出来呢?

        我有点为难,犹豫了。
        她又说,gie~gie~ 你那么厉害肯定能做出来的!
        那我只能路见不平一声吼啊~该出手时就出手,谁让我是gie~gie~呢 !?

        我来~~~



基本功能


根据其项目需求我们可列出下列功能:

  1. 可以读视频
  2. 识别视频中的文字区域
  3. 识别区域中的文字信息

由此我们可以得到如下的项目流程


项目整体流程


  1. 确定读取视频的手段,我整体采用的是 python+opencv
  2. 在字幕区域确认手段中使用 opencv的选区cv.selectROI()函数,手动确认字幕范围
  3. 在文字识别中我采用的是 pytesseract 技术


项目实现

环境搭建

须具有opencv开发环境,请自行上网搜寻

         推荐搜索:opencv-python详细安装教教程

须具有 tesseract 开发环境,请自行上网搜寻

         推荐搜索:pytesseract tesseract-ocr详细安装教教程

在使用tesseract环境时得具有中文识别数据,这个我可以提供。

        下载地址:https://wwd.lanzouj.com/i0FRU01vqjoh 密码:c9oz

代码编写

包导入

from PIL import Image
import cv2 as cv
import pytesseract
import threading

主处理函数

def video_handle():
    while 1:
        name = input("请将本软件与视频放在统一目录下并输入文件名,要有后缀例如 小明.mp4\n并且将会生成字幕文件。\n")
        fxy = input("请输入视频显示时缩放程度,建议0.5-0.6 太小的数字识别度不高 例如:0.5\n")
        if name == "" and fxy == "":
            print("不允许为空")
            continue
        break
    file_name = name
    # 获取视频
    cap = cv.VideoCapture(r"{}".format(name))
    # 初始化帧率控制 左上右下
    n = x = y = w = h = 0
    # 区域
    roi = None

    while cap.isOpened():
        # cap.read()
        # 视频流读取
        flag, frame = cap.read()

        if flag is False:
            break
        # 根据输入重设大小
        frame = cv.resize(frame, (0, 0), fx=float(fxy), fy=float(fxy))
        # 以20的帧率识别
        if n % 20 == 0:
            # 初始化范围
            if n == 0:
                if input("输入1则自选区域,建议根据实际视频字幕区域选择,尽量区域选择全面\n") == "1":
                    # 选择范围框
                    roi = pic_range(frame)
                    # 保存位置
                    x, y, w, h = roi
                else:
                    # 默认选区
                    x, y, w, h = 405, 971, 1194, 75
                print("字幕范围", x, y, w, h)

            # 长方形范围框
            if n > 0:
                cv.rectangle(img=frame, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255), thickness=2)

            # 区域内图像裁剪
            range_pic = frame[y:y + h, x:x + w]
            # 高斯滤波降噪
            throw_nosiy = cv.GaussianBlur(range_pic, (5, 5), 0)
            # 灰度
            GrayImage = cv.cvtColor(throw_nosiy, cv.COLOR_BGR2GRAY)

            # 二值化
            ret, thresh = cv.threshold(GrayImage, 127, 255, cv.THRESH_BINARY)
            cv.imshow("word", thresh)
            cv.imshow("pic", frame)
            # 转化为pil图片模式
            image = Image.fromarray(cv.cvtColor(thresh, cv.COLOR_BGR2RGB))
            # 识别
            pic_str(image, file_name)

        # q键退出
        if ord('q') == cv.waitKey(3):
            break
        n = n + 1
    cv.destroyAllWindows()
    # 释放摄像头
    cap.release()

文字识别

def pic_str(image, file_name):
    # tesseract ocr
    chi_text = pytesseract.image_to_string(image, lang="chi_sim")
    # 移除多余的空格与换行
    chi_text = chi_text.replace(" ", "").replace("\n", "")
    if chi_text != "":
        print(chi_text)
        # 创建进程写入
        thread = threading.Thread(target=file_save, args=(chi_text, file_name))
        thread.start()

字幕范围选择

        在此处我原本想让他自动识别字幕的,看的人多的话我就做~~

def pic_range(img):
    # 范围选择
    roi = cv.selectROI(windowName="roi", img=img, showCrosshair=True, fromCenter=False)
    cv.destroyAllWindows()
    return roi

字幕的存储

def file_save(chi_text, file_name):
    with open("{}.txt".format(file_name), "a+") as f:
        f.write(chi_text + "\n")

效果

        使用了pyinstaller将其打包成exe便于妹妹使用~

 

这才是最终效果!

这波效果直接拉满好吧~ 

最后

        妹妹的鼓励才是生产的第一动力!!!

        若是有代码方面的问题,评论区交流~~~看到了就会回。

  • 4
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 要用Python实现视频字幕提取,需要用到一些第三方库。以下是一种使用Python和FFmpeg和pytesseract的方法: 1.安装FFmpeg和pytesseract 首先需要安装FFmpeg和pytesseract。在Windows上,可以从官方网站下载FFmpeg二进制文件并将其添加到PATH环境变量中。要安装pytesseract,可以使用pip: ``` pip install pytesseract ``` 2.导入所需库 在Python中,需要导入一些库以便进行视频字幕提取。这些库包括cv2、pytesseract、numpy和subprocess。您可以使用以下代码导入这些库: ```python import cv2 import pytesseract import numpy as np import subprocess ``` 3.提取视频帧 使用OpenCV(cv2库)加载视频文件并读取每个帧。可以使用以下代码: ```python vidcap = cv2.VideoCapture('video.mp4') success,image = vidcap.read() count = 0 while success: cv2.imwrite("frame%d.jpg" % count, image) # save frame as JPEG file success,image = vidcap.read() count += 1 ``` 上面的代码将读取名为“video.mp4”的视频文件,并将其帧保存为图像文件。将其保存到当前目录下,以图像序列的形式命名为“frame0.jpg”、“frame1.jpg”等。 4.使用pytesseract提取字幕 使用pytesseract库从每个帧中提取字幕。可以使用以下代码: ```python for i in range(count): img = cv2.imread('frame%d.jpg' % i) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret,thresh1 = cv2.threshold(gray,200,255,cv2.THRESH_BINARY) kernel = np.ones((1,1),np.uint8) img = cv2.dilate(thresh1,kernel,iterations = 1) img = cv2.erode(img,kernel,iterations = 1) out_below = pytesseract.image_to_string(img) print("frame ", i, " : \n") print(out_below) ``` 上面的代码将循环每个帧,将其加载为图像,将其转换为灰度图像,二值化处理,扩张和腐蚀处理以增强文本。然后,它使用pytesseract将文本从帧中提取出来,并将其打印到控制台中。 5.删除生成的图像文件 最后,需要删除生成的图像文件。可以使用以下代码: ```python for i in range(count): file = "frame%d.jpg" % i subprocess.run(['rm', file]) ``` 上面的代码将循环每个帧文件,并使用subprocess库中的rm命令删除它们。 总结 通过上述步骤,我们可以使用Python和第三方库实现视频字幕提取。您可以使用其他方法来进一步优化提取文本的过程,例如改变字幕区域的大小和位置,使用不同的图像处理技术等。 ### 回答2: 要实现视频字幕提取,可以使用Python中的一些库和工具来完成。以下是一种实现方法: 1. 安装所需库:使用Python的pip命令安装所需库,包括OpenCV、pytesseract和Pillow。 2. 导入所需库:在Python脚本中导入所需的库和模块。 3. 读取视频文件:使用OpenCV库的VideoCapture函数读取视频文件。可以使用视频的文件路径作为参数,返回一个视频对象。 4. 视频处理:在循环中,逐帧读取视频,对每一帧进行处理。 5. 图像处理:将每一帧转换为灰度图像,以便于后续的文字提取识别。 6. 提取字幕:使用pytesseract库的image_to_string函数将图像转换为文字。可以设置适当的参数,例如语言和字符集,以获取更好的结果。 7. 文字处理:对提取的文字进行必要的处理,例如去除空格、标点和其他噪音。可以使用Python的字符串操作和正则表达式来完成。 8. 字幕保存:将处理后的字幕保存到文件中,以便后续使用或分析。 9. 释放资源:在处理完成后,记得释放所有资源,包括关闭视频对象和清理内存。 10. 运行脚本:使用Python解释器运行脚本,并观察输出和保存的字幕文件。 请注意,实际实现中可能会遇到一些挑战和问题,例如视频压缩格式、字幕样式和位置的变化等。因此,根据具体情况和需求进行适当的调整和优化。 ### 回答3: 要使用Python实现视频字幕提取,可以按照以下步骤进行操作: 1. 导入所需的库:安装并导入`moviepy`库,这是一个处理视频的强大库。 2. 加载视频文件:使用`VideoFileClip`函数加载视频文件,例如`video = VideoFileClip("video.mp4")`。 3. 提取视频中的音频:使用`audio = video.audio`提取视频的音频部分。 4. 将音频转换为文字:使用语音转文本的API,如百度云、腾讯云或Google Cloud API,将音频转换为文字。调用相应的API,并传入音频文件,获得文字结果。例如,使用百度云API:`result = baidu_api.audio_to_text(audio)`。 5. 处理文字结果:根据API返回的结果,可以对文字进行处理和清洗。例如删除标点符号、过滤无关的字幕等。 6. 输出字幕:将处理后的文字结果保存为字幕文件,如SRT格式或VTT格式。可以使用库如`pysrt`或`webvtt-py`来生成字幕文件。 7. 完整代码示例: ```python from moviepy.editor import VideoFileClip import baidu_api # 假设有一个baidu_api.py文件,包含了百度云API的调用函数 # 加载视频文件 video = VideoFileClip("video.mp4") # 提取音频 audio = video.audio # 将音频转换为文字 result = baidu_api.audio_to_text(audio) # 处理文字结果 processed_text = text_processing(result) # 输出字幕文件 output_subtitles(processed_text) ``` 请注意,在实际操作中,你需要有一个有效的语音转文本的API,并将其与Python代码结合使用,以完成音频到文字的转换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值